diff --git a/lldb/lit/tools/lldb-instr/Inputs/foo.h b/lldb/lit/tools/lldb-instr/Inputs/foo.h deleted file mode 100644 --- a/lldb/lit/tools/lldb-instr/Inputs/foo.h +++ /dev/null @@ -1,19 +0,0 @@ -struct Bar {}; -struct Foo { - Foo(); - Foo(int i); - - void A(); - void B(int i); - int C(int i); - int D(bool b) const; - static void E(); - static int F(int i); - void G(const char *fmt...); - static Foo H(); - void I() const; - Bar J() const; - Bar K(void *v) const; - Bar &L() const; - Bar *M() const; -}; diff --git a/lldb/lit/tools/lldb-instr/Inputs/foo.cpp b/lldb/lit/tools/lldb-instr/Inputs/foo.cpp deleted file mode 100644 --- a/lldb/lit/tools/lldb-instr/Inputs/foo.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "foo.h" - -#define MACRO_FOO \ - { void; } -#define MACRO_BAR(B) B - -Foo::Foo() {} -void Foo::A() {} -void Foo::B(int i) {} -int Foo::C(int i) { return i; } -int Foo::D(bool b) const { return 1; } -void Foo::E() {} -int Foo::F(int i) { return i; } -void Foo::G(const char *fmt...) {} -Foo Foo::H() { return Foo(); } -void Foo::I() const { MACRO_FOO; } -Bar Foo::J() const { return MACRO_BAR(Bar()); } -Bar Foo::K(void *v) const { return Bar(); } -Bar &Foo::L() const { - Bar *b = new Bar(); - return *b; -}; -Bar *Foo::M() const { - Bar *b = new Bar(); - return b; -}; diff --git a/lldb/lit/tools/lldb-instr/TestInstrumentationRecord.test b/lldb/lit/tools/lldb-instr/TestInstrumentationRecord.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-instr/TestInstrumentationRecord.test +++ /dev/null @@ -1,24 +0,0 @@ -# RUN: mkdir -p %t.dir -# RUN: cp %p/Inputs/foo.cpp %t.dir/foo.cpp -# RUN: cp %p/Inputs/foo.h %t.dir/foo.h - -# RUN: lldb-instr %t.dir/foo.cpp -# RUN: cat %t.dir/foo.cpp | FileCheck %s - -# CHECK: LLDB_RECORD_CONSTRUCTOR_NO_ARGS(Foo); -# CHECK: LLDB_RECORD_METHOD_NO_ARGS(void, Foo, A); -# CHECK: LLDB_RECORD_METHOD(void, Foo, B, (int), i); -# CHECK: LLDB_RECORD_METHOD(int, Foo, C, (int), i); -# CHECK: LLDB_RECORD_METHOD_CONST(int, Foo, D, (bool), b); -# CHECK: LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, Foo, E); -# CHECK: LLDB_RECORD_STATIC_METHOD(int, Foo, F, (int), i); -# CHECK-NOT: LLDB_RECORD_STATIC_METHOD(void, Foo, G -# CHECK: LLDB_RECORD_STATIC_METHOD_NO_ARGS(Foo, Foo, H); -# CHECK: LLDB_RECORD_RESULT(Foo()) -# CHECK-NOT: LLDB_RECORD_METHOD_CONST_NO_ARGS(void, Foo, I); -# CHECK: LLDB_RECORD_METHOD_CONST_NO_ARGS(Bar, Foo, J); -# CHECK-NOT: LLDB_RECORD_RESULT(Bar()); -# CHECK: LLDB_RECORD_DUMMY(Bar, Foo, K, (void *), v); -# CHECK-NOT: LLDB_RECORD_RESULT(Bar()); -# CHECK: LLDB_RECORD_RESULT(*b) -# CHECK: LLDB_RECORD_RESULT(b) diff --git a/lldb/lit/tools/lldb-instr/TestInstrumentationRegister.test b/lldb/lit/tools/lldb-instr/TestInstrumentationRegister.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-instr/TestInstrumentationRegister.test +++ /dev/null @@ -1,20 +0,0 @@ -# RUN: mkdir -p %t.dir -# RUN: cp %p/Inputs/foo.cpp %t.dir/foo.cpp -# RUN: cp %p/Inputs/foo.h %t.dir/foo.h - -# RUN: lldb-instr %t.dir/foo.cpp | FileCheck %s - -# CHECK: { -# CHECK: LLDB_REGISTER_METHOD(void, Foo, A, ()); -# CHECK: LLDB_REGISTER_METHOD(void, Foo, B, (int)); -# CHECK: LLDB_REGISTER_METHOD(int, Foo, C, (int)); -# CHECK: LLDB_REGISTER_METHOD_CONST(int, Foo, D, (bool)); -# CHECK: LLDB_REGISTER_STATIC_METHOD(void, Foo, E, ()); -# CHECK: LLDB_REGISTER_STATIC_METHOD(int, Foo, F, (int)); -# CHECK: LLDB_REGISTER_METHOD_CONST(Bar, Foo, J, ()); -# CHECK: LLDB_REGISTER_METHOD_CONST(Bar &, Foo, L, ()); -# CHECK: LLDB_REGISTER_METHOD_CONST(Bar *, Foo, M, ()); -# CHECK-NOT: LLDB_REGISTER_STATIC_METHOD(void, Foo, G -# CHECK-NOT: LLDB_REGISTER_METHOD_CONST(void, Foo, I, ()); -# CHECK-NOT: LLDB_REGISTER_METHOD_CONST(Bar, Foo, K, (void*)); -# CHECK: } diff --git a/lldb/lit/tools/lldb-instr/lit.local.cfg b/lldb/lit/tools/lldb-instr/lit.local.cfg deleted file mode 100644 --- a/lldb/lit/tools/lldb-instr/lit.local.cfg +++ /dev/null @@ -1,2 +0,0 @@ -if not "lldb-instr" in config.available_features: - config.unsupported = True diff --git a/lldb/lit/tools/lldb-mi/breakpoint/break-insert-enable-pending.test b/lldb/lit/tools/lldb-mi/breakpoint/break-insert-enable-pending.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/breakpoint/break-insert-enable-pending.test +++ /dev/null @@ -1,51 +0,0 @@ -# XFAIL: system-windows -# -> llvm.org/pr24452 -# XFAIL: system-netbsd -# -# RUN: %clang -o %t %p/inputs/break-insert-pending.c -g -# RUN: %lldbmi %t < %s | FileCheck %s - -# Test for enabling pending breakpoints globally - -settings set symbols.enable-external-lookup false -# CHECK: ^done - --break-insert printf -# CHECK: ^error,msg="Command 'break-insert'. Breakpoint location 'printf' not found - --gdb-set breakpoint pending on -# CHECK: ^done --gdb-show breakpoint pending -# CHECK: ^done,value="on" --break-insert printf -# CHECK: ^done,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="0xffffffffffffffff",func="??",file="??",fullname="??/??",line="0",pending=["printf"],times="0",original-location="printf"} - --exec-run -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit",disp="del",bkptno="2",frame={level="0",addr="{{0x[0-9a-f]*[^f][0-9a-f]*}}" --break-disable 2 -# CHECK: ^done --exec-continue -# CHECK: ^running -# CHECK: *stopped,reason="exited-normally" - -# Test that it can be turned back off --gdb-show breakpoint pending -# CHECK: ^done,value="on" --gdb-set breakpoint pending off -# CHECK: ^done --gdb-show breakpoint pending -# CHECK: ^done,value="off" --break-insert printf-non-existent -# CHECK: ^error,msg="Command 'break-insert'. Breakpoint location 'printf-non-existent' not found" -# Check that enable/disable with 1 and 0 works --gdb-set breakpoint pending 1 -# CHECK: ^done --gdb-show breakpoint pending -# CHECK: ^done,value="on" --gdb-set breakpoint pending 0 -# CHECK: ^done --gdb-show breakpoint pending -# CHECK: ^done,value="off" --gdb-set breakpoint pending garbage -# CHECK: ^done diff --git a/lldb/lit/tools/lldb-mi/breakpoint/break-insert.test b/lldb/lit/tools/lldb-mi/breakpoint/break-insert.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/breakpoint/break-insert.test +++ /dev/null @@ -1,21 +0,0 @@ -# XFAIL: system-netbsd -# UNSUPPORTED: system-linux -# -# RUN: %build %p/inputs/break-insert.c --nodefaultlib -o a.exe -# RUN: %lldbmi < %s | FileCheck %s - -# Test that a breakpoint can be inserted before creating a target. - -settings set symbols.enable-external-lookup false -# CHECK: ^done - --break-insert breakpoint -# CHECK: ^done,bkpt={number="1" - --file-exec-and-symbols a.exe -# CHECK: ^done - --exec-run -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit" - diff --git a/lldb/lit/tools/lldb-mi/breakpoint/inputs/break-insert-pending.c b/lldb/lit/tools/lldb-mi/breakpoint/inputs/break-insert-pending.c deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/breakpoint/inputs/break-insert-pending.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int main(int argc, char const *argv[]) { - printf("Print a formatted string so that GCC does not optimize this printf call: %s\n", argv[0]); - return 0; -} diff --git a/lldb/lit/tools/lldb-mi/breakpoint/inputs/break-insert.c b/lldb/lit/tools/lldb-mi/breakpoint/inputs/break-insert.c deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/breakpoint/inputs/break-insert.c +++ /dev/null @@ -1,7 +0,0 @@ -int breakpoint() { // Breakpoint will be set here. - return 0; -} - -int main() { - return breakpoint(); -} diff --git a/lldb/lit/tools/lldb-mi/breakpoint/lit.local.cfg b/lldb/lit/tools/lldb-mi/breakpoint/lit.local.cfg deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/breakpoint/lit.local.cfg +++ /dev/null @@ -1 +0,0 @@ -config.suffixes = ['.test'] diff --git a/lldb/lit/tools/lldb-mi/data/data-info-line.test b/lldb/lit/tools/lldb-mi/data/data-info-line.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/data/data-info-line.test +++ /dev/null @@ -1,38 +0,0 @@ -# XFAIL: system-netbsd -# -# RUN: %build %p/inputs/data-info-line.c --nodefaultlib -o %t -# RUN: %lldbmi %t < %s | FileCheck %s - -# Test lldb-mi -data-info-line command. - -# Check that we have a valid target created via '%lldbmi %t'. -# CHECK: ^done - -settings set symbols.enable-external-lookup false -# CHECK: ^done - --break-insert main -# CHECK: ^done,bkpt={number="1" - --exec-run -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit" - --data-info-line *0x0 -# Test that -data-info-line fails when invalid address is specified. -# CHECK: ^error,msg="Command 'data-info-line'. Error: The LineEntry is absent or has an unknown format." - --data-info-line unknown_file:1 -# Test that -data-info-line fails when file is unknown. -# CHECK: ^error,msg="Command 'data-info-line'. Error: The LineEntry is absent or has an unknown format." - --data-info-line data-info-line.c:bad_line -# Test that -data-info-line fails when line has invalid format. -# CHECK: ^error,msg="Command 'data-info-line'. Error: The LineEntry is absent or has an unknown format." - --data-info-line data-info-line.c:0 -# Test that -data-info-line fails when invalid line is specified. -# CHECK: ^error,msg="Command 'data-info-line'. Error: The LineEntry is absent or has an unknown format." - --data-info-line data-info-line.c:2 -# CHECK: ^done,start="0x{{[0-9a-f]+}}",end="0x{{[0-9a-f]+}}",file="{{.*}}data-info-line.c",line="{{[0-9]+}}" diff --git a/lldb/lit/tools/lldb-mi/data/inputs/data-info-line.c b/lldb/lit/tools/lldb-mi/data/inputs/data-info-line.c deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/data/inputs/data-info-line.c +++ /dev/null @@ -1,4 +0,0 @@ -int main(void) { - int x = 0; - return 12345 + x; -} diff --git a/lldb/lit/tools/lldb-mi/data/lit.local.cfg b/lldb/lit/tools/lldb-mi/data/lit.local.cfg deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/data/lit.local.cfg +++ /dev/null @@ -1 +0,0 @@ -config.suffixes = ['.test'] diff --git a/lldb/lit/tools/lldb-mi/exec/exec-continue.test b/lldb/lit/tools/lldb-mi/exec/exec-continue.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/exec/exec-continue.test +++ /dev/null @@ -1,22 +0,0 @@ -# XFAIL: system-netbsd -# -# RUN: %build %p/inputs/main.c --nodefaultlib -o %t -# RUN: %lldbmi %t < %s | FileCheck %s - -# Test lldb-mi -exec-continue command. - -# Check that we have a valid target created via '%lldbmi %t'. -# CHECK: ^done - -settings set symbols.enable-external-lookup false -# CHECK: ^done - --break-insert main -# CHECK: ^done,bkpt={number="1" - --exec-run -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit" - --exec-continue -# CHECK: ^running diff --git a/lldb/lit/tools/lldb-mi/exec/exec-finish.test b/lldb/lit/tools/lldb-mi/exec/exec-finish.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/exec/exec-finish.test +++ /dev/null @@ -1,33 +0,0 @@ -# RUN: %build %p/inputs/main.c -o %t -# RUN: %lldbmi %t < %s | FileCheck %s - -# Test lldb-mi -exec-finish command. - -# Check that we have a valid target created via '%lldbmi %t'. -# CHECK: ^done - -settings set symbols.enable-external-lookup false -# CHECK: ^done - --break-insert main -# CHECK: ^done,bkpt={number="1" - --break-insert dummyFunction -# CHECK: ^done,bkpt={number="2" - --exec-run -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit" - --exec-finish --thread 0 -# Check that exec-finish can process the case of invalid thread ID. -# CHECK: ^error,msg="Command 'exec-finish'. Thread ID invalid" - --exec-finish --thread 1 -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit" - --exec-finish -# Check exec-finish in a selected thread. -# CHECK: ^running -# CHECK: *stopped,reason="end-stepping-range" diff --git a/lldb/lit/tools/lldb-mi/exec/exec-interrupt.test b/lldb/lit/tools/lldb-mi/exec/exec-interrupt.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/exec/exec-interrupt.test +++ /dev/null @@ -1,22 +0,0 @@ -# XFAIL: system-netbsd -# -# RUN: %build %p/inputs/main.c --nodefaultlib -o %t -# RUN: %lldbmi %t < %s | FileCheck %s - -# Test lldb-mi -exec-interrupt command. - -# Check that we have a valid target created via '%lldbmi %t'. -# CHECK: ^done - -settings set symbols.enable-external-lookup false -# CHECK: ^done - --break-insert main -# CHECK: ^done,bkpt={number="1" - --exec-run -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit" - --exec-interrupt -# CHECK: ^error,msg="Process is not running." diff --git a/lldb/lit/tools/lldb-mi/exec/exec-next-instruction.test b/lldb/lit/tools/lldb-mi/exec/exec-next-instruction.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/exec/exec-next-instruction.test +++ /dev/null @@ -1,32 +0,0 @@ -# XFAIL: system-netbsd -# -# RUN: %build %p/inputs/main.c --nodefaultlib -o %t -# RUN: %lldbmi %t < %s | FileCheck %s - -# Test lldb-mi -exec-next-instruction command. - -# Check that we have a valid target created via '%lldbmi %t'. -# CHECK: ^done - -settings set symbols.enable-external-lookup false -# CHECK: ^done - --break-insert main -# CHECK: ^done,bkpt={number="1" - --exec-run -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit" - --exec-next-instruction --thread 0 -# Check that exec-next-instruction can process the case of invalid thread ID. -# CHECK: ^error,msg="Command 'exec-next-instruction'. Thread ID invalid" - --exec-next-instruction --thread 1 -# CHECK: ^running -# CHECK: *stopped,reason="end-stepping-range" - --exec-next-instruction -# Check exec-next-instruction in a selected thread. -# CHECK: ^running -# CHECK: *stopped,reason="end-stepping-range" diff --git a/lldb/lit/tools/lldb-mi/exec/exec-next.test b/lldb/lit/tools/lldb-mi/exec/exec-next.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/exec/exec-next.test +++ /dev/null @@ -1,33 +0,0 @@ -# XFAIL: system-netbsd -# UNSUPPORTED: system-linux -# -# RUN: %build %p/inputs/main.c --nodefaultlib -o %t -# RUN: %lldbmi %t < %s | FileCheck %s - -# Test lldb-mi -exec-next command. - -# Check that we have a valid target created via '%lldbmi %t'. -# CHECK: ^done - -settings set symbols.enable-external-lookup false -# CHECK: ^done - --break-insert main -# CHECK: ^done,bkpt={number="1" - --exec-run -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit" - --exec-next --thread 0 -# Check that exec-next can process the case of invalid thread ID. -# CHECK: ^error,msg="Command 'exec-next'. Thread ID invalid" - --exec-next --thread 1 -# CHECK: ^running -# CHECK: *stopped,reason="end-stepping-range" - --exec-next -# Check that exec-next can step over in a selected thread. -# CHECK: ^running -# CHECK: *stopped,reason="end-stepping-range" diff --git a/lldb/lit/tools/lldb-mi/exec/exec-run-wrong-binary.test b/lldb/lit/tools/lldb-mi/exec/exec-run-wrong-binary.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/exec/exec-run-wrong-binary.test +++ /dev/null @@ -1,6 +0,0 @@ -# RUN: %lldbmi < %s | FileCheck %s - -# Test that -exec-run command won't hang in case of wrong name of binary file. - --file-exec-and-symbols name.exe -# CHECK: ^error,msg="Command 'file-exec-and-symbols'. Target binary 'name.exe' is invalid. diff --git a/lldb/lit/tools/lldb-mi/exec/exec-step-instruction.test b/lldb/lit/tools/lldb-mi/exec/exec-step-instruction.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/exec/exec-step-instruction.test +++ /dev/null @@ -1,32 +0,0 @@ -# XFAIL: system-netbsd -# -# RUN: %build %p/inputs/main.c --nodefaultlib -o %t -# RUN: %lldbmi %t < %s | FileCheck %s - -# Test lldb-mi -exec-step-instruction command. - -# Check that we have a valid target created via '%lldbmi %t'. -# CHECK: ^done - -settings set symbols.enable-external-lookup false -# CHECK: ^done - --break-insert main -# CHECK: ^done,bkpt={number="1" - --exec-run -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit" - --exec-step-instruction --thread 0 -# Check that exec-step-instruction can process the case of invalid thread ID. -# CHECK: ^error,msg="Command 'exec-step-instruction'. Thread ID invalid" - --exec-next-instruction --thread 1 -# CHECK: ^running -# CHECK: *stopped,reason="end-stepping-range" - --exec-step-instruction -# Check exec-step-instruction in a selected thread. -# CHECK: ^running -# CHECK: *stopped,reason="end-stepping-range" diff --git a/lldb/lit/tools/lldb-mi/exec/exec-step.test b/lldb/lit/tools/lldb-mi/exec/exec-step.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/exec/exec-step.test +++ /dev/null @@ -1,32 +0,0 @@ -# XFAIL: system-netbsd -# -# RUN: %build %p/inputs/main.c --nodefaultlib -o %t -# RUN: %lldbmi %t < %s | FileCheck %s - -# Test lldb-mi -exec-step command. - -# Check that we have a valid target created via '%lldbmi %t'. -# CHECK: ^done - -settings set symbols.enable-external-lookup false -# CHECK: ^done - --break-insert main -# CHECK: ^done,bkpt={number="1" - --exec-run -# CHECK: ^running -# CHECK: *stopped,reason="breakpoint-hit" - --exec-step --thread 0 -# Check that exec-step can process the case of invalid thread ID. -# CHECK: ^error,msg="Command 'exec-step'. Thread ID invalid" - --exec-step --thread 1 -# CHECK: ^running -# CHECK: *stopped,reason="end-stepping-range" - --exec-step -# Check that exec-step can step-in in a selected thread. -# CHECK: ^running -# CHECK: *stopped,reason="end-stepping-range" diff --git a/lldb/lit/tools/lldb-mi/exec/inputs/main.c b/lldb/lit/tools/lldb-mi/exec/inputs/main.c deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/exec/inputs/main.c +++ /dev/null @@ -1,9 +0,0 @@ -void dummyFunction() { - int a = 0; -} - -int main(void) { - int x = 0; - dummyFunction(); - return x; -} diff --git a/lldb/lit/tools/lldb-mi/exec/lit.local.cfg b/lldb/lit/tools/lldb-mi/exec/lit.local.cfg deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/exec/lit.local.cfg +++ /dev/null @@ -1 +0,0 @@ -config.suffixes = ['.test'] diff --git a/lldb/lit/tools/lldb-mi/lit.local.cfg b/lldb/lit/tools/lldb-mi/lit.local.cfg deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/lit.local.cfg +++ /dev/null @@ -1,2 +0,0 @@ -if not "lldb-mi" in config.available_features: - config.unsupported = True diff --git a/lldb/lit/tools/lldb-mi/symbol/inputs/list-lines-helper.h b/lldb/lit/tools/lldb-mi/symbol/inputs/list-lines-helper.h deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/symbol/inputs/list-lines-helper.h +++ /dev/null @@ -1 +0,0 @@ -void HelpFunction(void); diff --git a/lldb/lit/tools/lldb-mi/symbol/inputs/list-lines-helper.c b/lldb/lit/tools/lldb-mi/symbol/inputs/list-lines-helper.c deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/symbol/inputs/list-lines-helper.c +++ /dev/null @@ -1,3 +0,0 @@ -void HelpFunction(void) { - int x = 12345; -} diff --git a/lldb/lit/tools/lldb-mi/symbol/inputs/main.c b/lldb/lit/tools/lldb-mi/symbol/inputs/main.c deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/symbol/inputs/main.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "symbol-list-lines.h" - -int main(void) { - int x = GetZero(); - return 0; -} diff --git a/lldb/lit/tools/lldb-mi/symbol/inputs/symbol-list-lines.h b/lldb/lit/tools/lldb-mi/symbol/inputs/symbol-list-lines.h deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/symbol/inputs/symbol-list-lines.h +++ /dev/null @@ -1 +0,0 @@ -int GetZero(); diff --git a/lldb/lit/tools/lldb-mi/symbol/inputs/symbol-list-lines.c b/lldb/lit/tools/lldb-mi/symbol/inputs/symbol-list-lines.c deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/symbol/inputs/symbol-list-lines.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "list-lines-helper.h" - -int GetZero() { - HelpFunction(); - return 0; -} diff --git a/lldb/lit/tools/lldb-mi/symbol/lit.local.cfg b/lldb/lit/tools/lldb-mi/symbol/lit.local.cfg deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/symbol/lit.local.cfg +++ /dev/null @@ -1 +0,0 @@ -config.suffixes = ['.test'] diff --git a/lldb/lit/tools/lldb-mi/symbol/symbol-list-lines.test b/lldb/lit/tools/lldb-mi/symbol/symbol-list-lines.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/symbol/symbol-list-lines.test +++ /dev/null @@ -1,17 +0,0 @@ -# RUN: %build %p/inputs/main.c %p/inputs/symbol-list-lines.c %p/inputs/list-lines-helper.c --nodefaultlib -o %t -# RUN: %lldbmi %t < %s | FileCheck %s - -# Test lldb-mi -symbol-list-lines command. - -# Check that we have a valid target created via '%lldbmi %t'. -# CHECK: ^done - --symbol-list-lines invalid_file.c -# Check a case of invalid file name. -# CHECK: ^error,msg="File Handler. Invalid file name path" - --symbol-list-lines symbol-list-lines.c -# CHECK: ^done,lines=[{pc="0x{{[0-9A-Fa-f]+}}",line="3"},{pc="0x{{[0-9A-Fa-f]+}}",line="4"},{pc="0x{{[0-9A-Fa-f]+}}",line="5"}{{.*}}] - --symbol-list-lines list-lines-helper.c -# CHECK: ^done,lines=[{pc="0x{{[0-9A-Fa-f]+}}",line="1"},{pc="0x{{[0-9A-Fa-f]+}}",line="2"},{pc="0x{{[0-9A-Fa-f]+}}",line="3"}{{.*}}] diff --git a/lldb/lit/tools/lldb-mi/target/inputs/main.c b/lldb/lit/tools/lldb-mi/target/inputs/main.c deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/target/inputs/main.c +++ /dev/null @@ -1,4 +0,0 @@ -int main(void) { - int x = 0; - return x; -} diff --git a/lldb/lit/tools/lldb-mi/target/inputs/target-select-so-path.py b/lldb/lit/tools/lldb-mi/target/inputs/target-select-so-path.py deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/target/inputs/target-select-so-path.py +++ /dev/null @@ -1,50 +0,0 @@ -import os -import sys -import subprocess -from threading import Timer - - -hostname = 'localhost' - -(r, w) = os.pipe() -kwargs = {} -if sys.version_info >= (3,2): - kwargs['pass_fds'] = [w] - -args = sys.argv -# Get debugserver, lldb-mi and FileCheck executables' paths with arguments. -debugserver = ' '.join([args[1], '--pipe', str(w), hostname + ':0']) -lldbmi = args[2] -test_file = args[3] -filecheck = 'FileCheck ' + test_file - -# Run debugserver, lldb-mi and FileCheck. -debugserver_proc = subprocess.Popen(debugserver.split(), **kwargs) -lldbmi_proc = subprocess.Popen(lldbmi, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, shell=True) -filecheck_proc = subprocess.Popen(filecheck, stdin=subprocess.PIPE, - shell=True) - -timeout_sec = 30 -timer = Timer(timeout_sec, exit, [filecheck_proc.returncode]) -try: - timer.start() - - # Get a tcp port chosen by debugserver. - # The number quite big to get lldb-server's output and to not hang. - bytes_to_read = 10 - port_bytes = os.read(r, bytes_to_read) - port = str(port_bytes.decode('utf-8').strip('\x00')) - - with open(test_file, 'r') as f: - # Replace '$PORT' with a free port number and pass - # test's content to lldb-mi. - lldbmi_proc.stdin.write(f.read().replace('$PORT', port).encode('utf-8')) - out, err = lldbmi_proc.communicate() - filecheck_proc.stdin.write(out) - filecheck_proc.communicate() -finally: - timer.cancel() - -debugserver_proc.kill() -exit(filecheck_proc.returncode) diff --git a/lldb/lit/tools/lldb-mi/target/lit.local.cfg b/lldb/lit/tools/lldb-mi/target/lit.local.cfg deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/target/lit.local.cfg +++ /dev/null @@ -1 +0,0 @@ -config.suffixes = ['.test'] diff --git a/lldb/lit/tools/lldb-mi/target/target-select-so-path.test b/lldb/lit/tools/lldb-mi/target/target-select-so-path.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-mi/target/target-select-so-path.test +++ /dev/null @@ -1,25 +0,0 @@ -# UNSUPPORTED: system-windows, system-darwin -# -# RUN: %clang -o %t %p/inputs/main.c -g -# RUN: %python %p/inputs/target-select-so-path.py "%debugserver" "%lldbmi %t" %s - -# Test that -target-select command can hook up a path -# added by gdb-set solib-search-path. - -# Check that we have a valid target created via file-exec-and-symbols. -# CHECK: ^done - --interpreter-exec console "target modules search-paths list" -# CHECK ^done - --gdb-set solib-search-path /example/dir -# CHECK: ^done - --target-select remote localhost:$PORT -# CHECK: ^connected - --interpreter-exec console "target modules search-paths list" -# CHECK: ~"[0] \".\" -> \"/example/dir\"\n" -# CHECK-NEXT: ^done - --gdb-exit diff --git a/lldb/lit/tools/lldb-server/TestGdbserverPort.test b/lldb/lit/tools/lldb-server/TestGdbserverPort.test deleted file mode 100644 --- a/lldb/lit/tools/lldb-server/TestGdbserverPort.test +++ /dev/null @@ -1,4 +0,0 @@ -# Windows does not build lldb-server. -# UNSUPPORTED: system-windows -# RUN: %platformserver --server --listen :1234 --min-gdbserver-port 1234 --max-gdbserver-port 1234 2>&1 | FileCheck %s -# CHECK: error: --min-gdbserver-port (1234) is not lower than --max-gdbserver-port (1234) diff --git a/lldb/tools/CMakeLists.txt b/lldb/tools/CMakeLists.txt --- a/lldb/tools/CMakeLists.txt +++ b/lldb/tools/CMakeLists.txt @@ -8,7 +8,6 @@ add_subdirectory(lldb-test EXCLUDE_FROM_ALL) add_lldb_tool_subdirectory(lldb-instr) -add_lldb_tool_subdirectory(lldb-mi) add_lldb_tool_subdirectory(lldb-vscode) if (CMAKE_SYSTEM_NAME MATCHES "Darwin") diff --git a/lldb/tools/lldb-mi/CMakeLists.txt b/lldb/tools/lldb-mi/CMakeLists.txt deleted file mode 100644 --- a/lldb/tools/lldb-mi/CMakeLists.txt +++ /dev/null @@ -1,109 +0,0 @@ -if ( CMAKE_SYSTEM_NAME MATCHES "Windows" OR CMAKE_SYSTEM_NAME MATCHES "NetBSD" ) - add_definitions( -DIMPORT_LIBLLDB ) - list(APPEND extra_libs lldbHost) -endif () - -if (HAVE_LIBPTHREAD) - list(APPEND extra_libs pthread) -endif () - -# We need to include the llvm components we depend on manually, as liblldb does -# not re-export those. -set(LLVM_LINK_COMPONENTS Support) -add_lldb_tool(lldb-mi - MICmdArgContext.cpp - MICmdArgSet.cpp - MICmdArgValBase.cpp - MICmdArgValConsume.cpp - MICmdArgValFile.cpp - MICmdArgValListBase.cpp - MICmdArgValListOfN.cpp - MICmdArgValNumber.cpp - MICmdArgValOptionLong.cpp - MICmdArgValOptionShort.cpp - MICmdArgValPrintValues.cpp - MICmdArgValString.cpp - MICmdArgValThreadGrp.cpp - MICmdBase.cpp - MICmdCommands.cpp - MICmdCmd.cpp - MICmdCmdBreak.cpp - MICmdCmdData.cpp - MICmdCmdEnviro.cpp - MICmdCmdExec.cpp - MICmdCmdFile.cpp - MICmdCmdGdbInfo.cpp - MICmdCmdGdbSet.cpp - MICmdCmdGdbShow.cpp - MICmdCmdGdbThread.cpp - MICmdCmdMiscellanous.cpp - MICmdCmdStack.cpp - MICmdCmdSupportInfo.cpp - MICmdCmdSupportList.cpp - MICmdCmdSymbol.cpp - MICmdCmdTarget.cpp - MICmdCmdThread.cpp - MICmdCmdTrace.cpp - MICmdCmdVar.cpp - MICmdData.cpp - MICmdFactory.cpp - MICmdInterpreter.cpp - MICmdInvoker.cpp - MICmdMgr.cpp - MICmdMgrSetCmdDeleteCallback.cpp - MICmnBase.cpp - MICmnLLDBBroadcaster.cpp - MICmnLLDBDebugger.cpp - MICmnLLDBDebuggerHandleEvents.cpp - MICmnLLDBDebugSessionInfo.cpp - MICmnLLDBDebugSessionInfoVarObj.cpp - MICmnLLDBProxySBValue.cpp - MICmnLLDBUtilSBValue.cpp - MICmnLog.cpp - MICmnLogMediumFile.cpp - MICmnMIOutOfBandRecord.cpp - MICmnMIResultRecord.cpp - MICmnMIValue.cpp - MICmnMIValueConst.cpp - MICmnMIValueList.cpp - MICmnMIValueResult.cpp - MICmnMIValueTuple.cpp - MICmnResources.cpp - MICmnStreamStderr.cpp - MICmnStreamStdin.cpp - MICmnStreamStdout.cpp - MICmnThreadMgrStd.cpp - MIDriver.cpp - MIDriverBase.cpp - MIDriverMain.cpp - MIDriverMgr.cpp - MIUtilDateTimeStd.cpp - MIUtilDebug.cpp - MIUtilFileStd.cpp - MIUtilMapIdToVariant.cpp - MIUtilString.cpp - MIUtilThreadBaseStd.cpp - MIUtilVariant.cpp - - LINK_LIBS - liblldb - ${host_lib} - ${extra_libs} - - LINK_COMPONENTS - Support - ) - -if(LLDB_BUILD_FRAMEWORK) - # In the build-tree, we know the exact path to the framework directory. - # The installed framework can be in different locations. - get_target_property(framework_build_dir liblldb LIBRARY_OUTPUT_DIRECTORY) - lldb_setup_rpaths(lldb-mi - BUILD_RPATH - "${framework_build_dir}" - INSTALL_RPATH - "@loader_path/../../../SharedFrameworks" - "@loader_path/../../System/Library/PrivateFrameworks" - "@loader_path/../../Library/PrivateFrameworks" - ) -endif() diff --git a/lldb/tools/lldb-mi/MICmdArgContext.h b/lldb/tools/lldb-mi/MICmdArgContext.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgContext.h +++ /dev/null @@ -1,43 +0,0 @@ -//===-- MICmdArgContext.h ---------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI common code class. Command arguments and options string. Holds -// the context string. -// Based on the Interpreter pattern. -//-- -class CMICmdArgContext { - // Methods: -public: - /* ctor */ CMICmdArgContext(); - /* ctor */ CMICmdArgContext(const CMIUtilString &vrCmdLineArgsRaw); - // - const CMIUtilString &GetArgsLeftToParse() const; - size_t GetNumberArgsPresent() const; - CMIUtilString::VecString_t GetArgs() const; - bool IsEmpty() const; - bool RemoveArg(const CMIUtilString &vArg); - bool RemoveArgAtPos(const CMIUtilString &vArg, size_t nArgIndex); - // - CMICmdArgContext &operator=(const CMICmdArgContext &vOther); - - // Overridden: -public: - // From CMIUtilString - /* dtor */ virtual ~CMICmdArgContext(); - - // Attributes: -private: - CMIUtilString m_strCmdArgsAndOptions; -}; diff --git a/lldb/tools/lldb-mi/MICmdArgContext.cpp b/lldb/tools/lldb-mi/MICmdArgContext.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgContext.cpp +++ /dev/null @@ -1,221 +0,0 @@ -//===-- MICmdArgContext.cpp -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgContext.h" - -//++ -// Details: CMICmdArgContext constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgContext::CMICmdArgContext() {} - -//++ -// Details: CMICmdArgContext constructor. -// Type: Method. -// Args: vrCmdLineArgsRaw - (R) The text description of the arguments -// options. -// Return: None. -// Throws: None. -//-- -CMICmdArgContext::CMICmdArgContext(const CMIUtilString &vrCmdLineArgsRaw) - : m_strCmdArgsAndOptions(vrCmdLineArgsRaw) {} - -//++ -// Details: CMICmdArgContext destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgContext::~CMICmdArgContext() {} - -//++ -// Details: Retrieve the remainder of the command's argument options left to -// parse. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - Argument options text. -// Throws: None. -//-- -const CMIUtilString &CMICmdArgContext::GetArgsLeftToParse() const { - return m_strCmdArgsAndOptions; -} - -//++ -// Details: Ask if this arguments string has any arguments. -// Type: Method. -// Args: None. -// Return: bool - True = Has one or more arguments present, false = no -// arguments. -// Throws: None. -//-- -bool CMICmdArgContext::IsEmpty() const { - return m_strCmdArgsAndOptions.empty(); -} - -//++ -// Details: Remove the argument from the options text and any space after the -// argument -// if applicable. -// Type: Method. -// Args: vArg - (R) The name of the argument. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgContext::RemoveArg(const CMIUtilString &vArg) { - if (vArg.empty()) - return MIstatus::success; - - const size_t nLen = vArg.length(); - const size_t nLenCntxt = m_strCmdArgsAndOptions.length(); - if (nLen > nLenCntxt) - return MIstatus::failure; - - size_t nExtraSpace = 0; - size_t nPos = m_strCmdArgsAndOptions.find(vArg); - while (1) { - if (nPos == std::string::npos) - return MIstatus::success; - - bool bPass1 = false; - if (nPos != 0) { - if (m_strCmdArgsAndOptions[nPos - 1] == ' ') - bPass1 = true; - } else - bPass1 = true; - - const size_t nEnd = nPos + nLen; - - if (bPass1) { - bool bPass2 = false; - if (nEnd < nLenCntxt) { - if (m_strCmdArgsAndOptions[nEnd] == ' ') { - bPass2 = true; - nExtraSpace = 1; - } - } else - bPass2 = true; - - if (bPass2) - break; - } - - nPos = m_strCmdArgsAndOptions.find(vArg, nEnd); - } - - const size_t nPosEnd = nLen + nExtraSpace; - m_strCmdArgsAndOptions = m_strCmdArgsAndOptions.replace(nPos, nPosEnd, ""); - m_strCmdArgsAndOptions = m_strCmdArgsAndOptions.Trim(); - - return MIstatus::success; -} - -//++ -// Details: Remove the argument at the Nth word position along in the context -// string. -// Any space after the argument is removed if applicable. A search is -// not -// performed as there may be more than one vArg with the same 'name' in -// the -// context string. -// Type: Method. -// Args: vArg - (R) The name of the argument. -// nArgIndex - (R) The word count position to which to remove the -// vArg word. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgContext::RemoveArgAtPos(const CMIUtilString &vArg, - size_t nArgIndex) { - size_t nWordIndex = 0; - CMIUtilString strBuildContextUp; - const CMIUtilString::VecString_t vecWords(GetArgs()); - const bool bSpaceRequired(GetNumberArgsPresent() > 2); - - CMIUtilString::VecString_t::const_iterator it = vecWords.begin(); - const CMIUtilString::VecString_t::const_iterator itEnd = vecWords.end(); - while (it != itEnd) { - const CMIUtilString &rWord(*it); - if (nWordIndex++ != nArgIndex) { - // Single words - strBuildContextUp += rWord; - if (bSpaceRequired) - strBuildContextUp += " "; - } else { - // If quoted loose quoted text - if (++it != itEnd) { - CMIUtilString words = rWord; - while (vArg != words) { - if (bSpaceRequired) - words += " "; - words += *it; - if (++it == itEnd) - break; - } - if (it != itEnd) - --it; - } - } - - // Next - if (it != itEnd) - ++it; - } - - m_strCmdArgsAndOptions = strBuildContextUp; - m_strCmdArgsAndOptions = m_strCmdArgsAndOptions.Trim(); - - return MIstatus::success; -} - -//++ -// Details: Retrieve number of arguments or options present in the command's -// option text. -// Type: Method. -// Args: None. -// Return: size_t - 0 to n arguments present. -// Throws: None. -//-- -size_t CMICmdArgContext::GetNumberArgsPresent() const { - CMIUtilString::VecString_t vecOptions; - return m_strCmdArgsAndOptions.SplitConsiderQuotes(" ", vecOptions); -} - -//++ -// Details: Retrieve all the arguments or options remaining in *this context. -// Type: Method. -// Args: None. -// Return: MIUtilString::VecString_t - List of args remaining. -// Throws: None. -//-- -CMIUtilString::VecString_t CMICmdArgContext::GetArgs() const { - CMIUtilString::VecString_t vecOptions; - m_strCmdArgsAndOptions.SplitConsiderQuotes(" ", vecOptions); - return vecOptions; -} - -//++ -// Details: Copy assignment operator. -// Type: Method. -// Args: vOther - (R) The variable to copy from. -// Return: CMIUtilString & - this object. -// Throws: None. -//-- -CMICmdArgContext &CMICmdArgContext::operator=(const CMICmdArgContext &vOther) { - if (this != &vOther) { - m_strCmdArgsAndOptions = vOther.m_strCmdArgsAndOptions; - } - - return *this; -} diff --git a/lldb/tools/lldb-mi/MICmdArgSet.h b/lldb/tools/lldb-mi/MICmdArgSet.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgSet.h +++ /dev/null @@ -1,107 +0,0 @@ -//===-- MICmdArgSet.h -------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -#include - -#include "MICmdArgContext.h" -#include "MICmnBase.h" - -// Declarations: -class CMICmdArgValBase; - -//++ -//============================================================================ -// Details: MI common code class. Command arguments container class. -// A command may have one or more arguments of which some may be -// optional. -// *this class contains a list of the command's arguments which are -// validates against the commands argument options string (context -// string). -// Each argument tries to extract the value it is looking for. -// Argument objects added to *this container are owned by this -// container -// and are deleted when this container goes out of scope. Allocate -// argument -// objects on the heap. -// It is assumed the arguments to be parsed are read from left to right -// in -// order. The order added to *this container is the order they will -// parsed. -//-- -class CMICmdArgSet : public CMICmnBase { - // Classes: -public: - //++ - // Description: ArgSet's interface for command arguments to implement. - //-- - class IArg { - public: - virtual bool GetFound() const = 0; - virtual bool GetIsHandledByCmd() const = 0; - virtual bool GetIsMandatory() const = 0; - virtual bool GetIsMissingOptions() const = 0; - virtual const CMIUtilString &GetName() const = 0; - virtual bool GetValid() const = 0; - virtual bool Validate(CMICmdArgContext &vwArgContext) = 0; - - virtual ~IArg() = default; - }; - - // Typedefs: - typedef std::vector SetCmdArgs_t; - - // Methods: - CMICmdArgSet(); - - void Add(CMICmdArgValBase *vArg); - bool GetArg(const CMIUtilString &vArgName, CMICmdArgValBase *&vpArg) const; - const SetCmdArgs_t &GetArgsThatAreMissing() const; - const SetCmdArgs_t &GetArgsThatInvalid() const; - size_t GetCount() const; - bool IsArgContextEmpty() const; - bool IsArgsPresentButNotHandledByCmd() const; - void WarningArgsNotHandledbyCmdLogFile(const CMIUtilString &vrCmdName); - bool Validate(const CMIUtilString &vStrMiCmd, - CMICmdArgContext &vwCmdArgsText); - - // Overrideable: - ~CMICmdArgSet() override; - - // Methods: -private: - const SetCmdArgs_t &GetArgsNotHandledByCmd() const; - void Destroy(); // Release resources used by *this object - bool ValidationFormErrorMessages(const CMICmdArgContext &vwCmdArgsText); - - // Attributes: - bool m_bIsArgsPresentButNotHandledByCmd; // True = The driver's client - // presented the command with options - // recognised but not handled by - // a command, false = all args handled - SetCmdArgs_t m_setCmdArgs; // The set of arguments that are that the command - // is expecting to find in the options string - SetCmdArgs_t m_setCmdArgsThatAreMissing; // The set of arguments that are - // required by the command but are - // missing - SetCmdArgs_t m_setCmdArgsThatNotValid; // The set of arguments found in the - // text but for some reason unable to - // extract a value - SetCmdArgs_t m_setCmdArgsNotHandledByCmd; // The set of arguments specified by - // the command which were present to - // the command but not handled - SetCmdArgs_t m_setCmdArgsMissingInfo; // The set of arguments that were - // present but were found to be missing - // additional information i.e. - // --thread 3 but 3 is missing - CMICmdArgContext m_cmdArgContext; // Copy of the command's argument options - // text before validate takes place (empties - // it of content) - const CMIUtilString m_constStrCommaSpc; -}; diff --git a/lldb/tools/lldb-mi/MICmdArgSet.cpp b/lldb/tools/lldb-mi/MICmdArgSet.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgSet.cpp +++ /dev/null @@ -1,386 +0,0 @@ -//===-- MICmdArgSet.cpp -----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgSet.h" -#include "MICmdArgValBase.h" -#include "MICmnLog.h" -#include "MICmnResources.h" - -//++ -// Details: CMICmdArgSet constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgSet::CMICmdArgSet() - : m_bIsArgsPresentButNotHandledByCmd(false), m_constStrCommaSpc(", ") {} - -//++ -// Details: CMICmdArgSet destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgSet::~CMICmdArgSet() { - // Tidy up - Destroy(); -} - -//++ -// Details: Release resources used by *this container object. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmdArgSet::Destroy() { - // Delete command argument objects - if (!m_setCmdArgs.empty()) { - SetCmdArgs_t::iterator it = m_setCmdArgs.begin(); - while (it != m_setCmdArgs.end()) { - CMICmdArgValBase *pArg(*it); - delete pArg; - - // Next - ++it; - } - m_setCmdArgs.clear(); - } - - m_setCmdArgsThatNotValid.clear(); - m_setCmdArgsThatAreMissing.clear(); - m_setCmdArgsNotHandledByCmd.clear(); - m_setCmdArgsMissingInfo.clear(); - m_bIsArgsPresentButNotHandledByCmd = false; -} - -//++ -// Details: Retrieve the state flag indicating that the command set up ready to -// parse -// command arguments or options found that one or more arguments was -// indeed -// present but not handled. This is given as a warning in the MI log -// file. -// Type: Method. -// Args: None. -// Return: bool - True = one or more args not handled, false = all args handled -// Throws: None. -//-- -bool CMICmdArgSet::IsArgsPresentButNotHandledByCmd() const { - return m_bIsArgsPresentButNotHandledByCmd; -} - -//++ -// Details: Add the list of command's arguments to parse and validate another -// one. -// Type: Method. -// Args: vArg - (R) A command argument object. -// Return: None. -// Throws: None. -//-- -void CMICmdArgSet::Add(CMICmdArgValBase *vArg) { m_setCmdArgs.push_back(vArg); } - -//++ -// Details: After validating an options line of text (the context) and there is -// a failure, -// it is likely a mandatory command argument that is required is -// missing. This -// function returns the argument that should be present. -// Type: Method. -// Args: None. -// Return: SetCmdArgs_t & - Set of argument objects. -// Throws: None. -//-- -const CMICmdArgSet::SetCmdArgs_t &CMICmdArgSet::GetArgsThatAreMissing() const { - return m_setCmdArgsThatAreMissing; -} - -//++ -// Details: After validating an options line of text (the context) and there is -// a failure, -// it may be because one or more arguments were unable to extract a -// value. This -// function returns the argument that were found to be invalid. -// Type: Method. -// Args: None. -// Return: SetCmdArgs_t & - Set of argument objects. -// Throws: None. -//-- -const CMICmdArgSet::SetCmdArgs_t &CMICmdArgSet::GetArgsThatInvalid() const { - return m_setCmdArgsThatNotValid; -} - -//++ -// Details: The list of argument or option (objects) that were specified by the -// command -// and so recognised when parsed but were not handled. Ideally the -// command -// should handle all arguments and options presented to it. The command -// sends -// warning to the MI log file to say that these options were not -// handled. -// Used as one way to determine option that maybe should really be -// implemented -// and not just ignored. -// Type: Method. -// Args: None. -// Return: SetCmdArgs_t & - Set of argument objects. -// Throws: None. -//-- -const CMICmdArgSet::SetCmdArgs_t &CMICmdArgSet::GetArgsNotHandledByCmd() const { - return m_setCmdArgsNotHandledByCmd; -} - -//++ -// Details: Given a set of command argument objects parse the context option -// string to -// find those argument and retrieve their value. If the function fails -// call -// GetArgsThatAreMissing() to see which commands that were mandatory -// were -// missing or failed to parse. -// Type: Method. -// Args: vStrMiCmd - (R) Command's name. -// vCmdArgsText - (RW) A command's options or argument. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgSet::Validate(const CMIUtilString &vStrMiCmd, - CMICmdArgContext &vwCmdArgsText) { - m_cmdArgContext = vwCmdArgsText; - - // Iterate all the arguments or options required by a command - SetCmdArgs_t::const_iterator it = m_setCmdArgs.begin(); - while (it != m_setCmdArgs.end()) { - CMICmdArgValBase *pArg = *it; - - if (!pArg->Validate(vwCmdArgsText)) { - if (pArg->GetFound()) { - if (pArg->GetIsMissingOptions()) - m_setCmdArgsMissingInfo.push_back(pArg); - else if (!pArg->GetValid()) - m_setCmdArgsThatNotValid.push_back(pArg); - } else if (pArg->GetIsMandatory()) - m_setCmdArgsThatAreMissing.push_back(pArg); - } - - if (pArg->GetFound() && !pArg->GetIsHandledByCmd()) { - m_bIsArgsPresentButNotHandledByCmd = true; - m_setCmdArgsNotHandledByCmd.push_back(pArg); - } - - // Next - ++it; - } - - // report any issues with arguments/options - if (IsArgsPresentButNotHandledByCmd()) - WarningArgsNotHandledbyCmdLogFile(vStrMiCmd); - - return ValidationFormErrorMessages(vwCmdArgsText); -} - -//++ -// Details: Having validated the command's options text and failed for some -// reason form -// the error message made up with the faults found. -// Type: Method. -// vCmdArgsText - (RW) A command's options or argument. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgSet::ValidationFormErrorMessages( - const CMICmdArgContext &vwCmdArgsText) { - CMIUtilString strListMissing; - CMIUtilString strListInvalid; - CMIUtilString strListMissingInfo; - const bool bArgsMissing = (m_setCmdArgsThatAreMissing.size() > 0); - const bool bArgsInvalid = (m_setCmdArgsThatNotValid.size() > 0); - const bool bArgsMissingInfo = (m_setCmdArgsMissingInfo.size() > 0); - if (!(bArgsMissing || bArgsInvalid || bArgsMissingInfo)) - return MIstatus::success; - if (bArgsMissing) { - MIuint i = 0; - SetCmdArgs_t::const_iterator it = m_setCmdArgsThatAreMissing.begin(); - while (it != m_setCmdArgsThatAreMissing.end()) { - if (i++ > 0) - strListMissing += m_constStrCommaSpc; - - const CMICmdArgValBase *pArg(*it); - strListMissing += pArg->GetName(); - - // Next - ++it; - } - } - if (bArgsInvalid) { - MIuint i = 0; - SetCmdArgs_t::const_iterator it = m_setCmdArgsThatNotValid.begin(); - while (it != m_setCmdArgsThatNotValid.end()) { - if (i++ > 0) - strListMissing += m_constStrCommaSpc; - - const CMICmdArgValBase *pArg(*it); - strListInvalid += pArg->GetName(); - - // Next - ++it; - } - } - if (bArgsMissingInfo) { - MIuint i = 0; - SetCmdArgs_t::const_iterator it = m_setCmdArgsMissingInfo.begin(); - while (it != m_setCmdArgsMissingInfo.end()) { - if (i++ > 0) - strListMissingInfo += m_constStrCommaSpc; - - const CMICmdArgValBase *pArg(*it); - strListMissingInfo += pArg->GetName(); - - // Next - ++it; - } - } - - bool bHaveOneError = false; - CMIUtilString strError = MIRSRC(IDS_CMD_ARGS_ERR_PREFIX_MSG); - if (bArgsMissing && bArgsInvalid) { - bHaveOneError = true; - strError += - CMIUtilString::Format(MIRSRC(IDS_CMD_ARGS_ERR_VALIDATION_MAN_INVALID), - strListMissing.c_str(), strListInvalid.c_str()); - } - if (bArgsMissing) { - if (bHaveOneError) - strError += ". "; - bHaveOneError = true; - strError += CMIUtilString::Format( - MIRSRC(IDS_CMD_ARGS_ERR_VALIDATION_MANDATORY), strListMissing.c_str()); - } - if (bArgsMissingInfo) { - if (bHaveOneError) - strError += ". "; - bHaveOneError = true; - strError += - CMIUtilString::Format(MIRSRC(IDS_CMD_ARGS_ERR_VALIDATION_MISSING_INF), - strListMissingInfo.c_str()); - } - if (bArgsInvalid) { - if (bHaveOneError) - strError += ". "; - bHaveOneError = true; - strError += CMIUtilString::Format( - MIRSRC(IDS_CMD_ARGS_ERR_VALIDATION_INVALID), strListInvalid.c_str()); - } - if (!vwCmdArgsText.IsEmpty()) { - if (bHaveOneError) - strError += ". "; - bHaveOneError = true; - strError += - CMIUtilString::Format(MIRSRC(IDS_CMD_ARGS_ERR_CONTEXT_NOT_ALL_EATTEN), - vwCmdArgsText.GetArgsLeftToParse().c_str()); - } - - if (bHaveOneError) { - SetErrorDescription(strError); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: Ask if the command's argument options text had any arguments. -// Type: Method. -// Args: None. -// Return: bool - True = Has one or more arguments present, false = no -// arguments. -// Throws: None. -//-- -bool CMICmdArgSet::IsArgContextEmpty() const { - return m_cmdArgContext.IsEmpty(); -} - -//++ -// Details: Retrieve the number of arguments that are being used for the -// command. -// Type: Method. -// Args: None. -// Return: size_t - Argument count. -// Throws: None. -//-- -size_t CMICmdArgSet::GetCount() const { return m_setCmdArgs.size(); } - -//++ -// Details: Given a set of command argument objects retrieve the argument with -// the -// specified name. -// Type: Method. -// Args: vpArg - (W) A pointer to a command's argument object. -// Return: True - Argument found. -// False - Argument not found. -// Throws: None. -//-- -bool CMICmdArgSet::GetArg(const CMIUtilString &vArgName, - CMICmdArgValBase *&vpArg) const { - bool bFound = false; - SetCmdArgs_t::const_iterator it = m_setCmdArgs.begin(); - while (it != m_setCmdArgs.end()) { - CMICmdArgValBase *pArg(*it); - if (pArg->GetName() == vArgName) { - bFound = true; - vpArg = pArg; - break; - } - - // Next - ++it; - } - - return bFound; -} - -//++ -// Details: Write a warning message to the MI Log file about the command's -// arguments or -// options that were found present but not handled. -// Type: Method. -// Args: vrCmdName - (R) The command's name. -// Return: None. -// Throws: None. -//-- -void CMICmdArgSet::WarningArgsNotHandledbyCmdLogFile( - const CMIUtilString &vrCmdName) { -#if MICONFIG_GIVE_WARNING_CMD_ARGS_NOT_HANDLED - - CMIUtilString strArgsNotHandled; - const CMICmdArgSet::SetCmdArgs_t &rSetArgs = GetArgsNotHandledByCmd(); - MIuint nCnt = 0; - CMICmdArgSet::SetCmdArgs_t::const_iterator it = rSetArgs.begin(); - while (it != rSetArgs.end()) { - if (nCnt++ > 0) - strArgsNotHandled += m_constStrCommaSpc; - const CMICmdArgValBase *pArg = *it; - strArgsNotHandled += pArg->GetName(); - - // Next - ++it; - } - - const CMIUtilString strWarningMsg( - CMIUtilString::Format(MIRSRC(IDS_CMD_WRN_ARGS_NOT_HANDLED), - vrCmdName.c_str(), strArgsNotHandled.c_str())); - m_pLog->WriteLog(strWarningMsg); - -#endif // MICONFIG_GIVE_WARNING_CMD_ARGS_NOT_HANDLED -} diff --git a/lldb/tools/lldb-mi/MICmdArgValBase.h b/lldb/tools/lldb-mi/MICmdArgValBase.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValBase.h +++ /dev/null @@ -1,115 +0,0 @@ -//===-- MICmdArgValBase.h ---------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -#include "MICmdArgSet.h" -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI common code class. Command argument base class. Arguments objects -// needing specialization derived from *this class. An argument knows -// what type of argument it is and how it is to interpret the options -// (context) string to find and validate a matching argument and so -// extract a value from it. -// Argument objects are added to the CMICmdArgSet container object. -// Once added the container they belong to that contain and will be -// deleted when the container goes out of scope. Allocate argument -// objects on the heap and pass in to the Add(). -// Note the code is written such that a command will produce an error -// should it be presented with arguments or options it does not -// understand. -// A command can recognise an option or argument then ignore if it -// wishes (a warning is sent to the MI's Log file). This is so it is -// hardwired to fail and catch arguments or options that presented by -// different driver clients. -// Based on the Interpreter pattern. -//-- -class CMICmdArgValBase : public CMICmdArgSet::IArg { - // Methods: -public: - CMICmdArgValBase(); - CMICmdArgValBase(const CMIUtilString &vrArgName, const bool vbMandatory, - const bool vbHandleByCmd); - - // Overrideable: - ~CMICmdArgValBase() override = default; - - // Overridden: - // From CMICmdArgSet::IArg - bool GetFound() const override; - bool GetIsHandledByCmd() const override; - bool GetIsMandatory() const override; - bool GetIsMissingOptions() const override; - const CMIUtilString &GetName() const override; - bool GetValid() const override; - bool Validate(CMICmdArgContext &vwArgContext) override; - - // Attributes: -protected: - bool - m_bFound; // True = yes found in arguments options text, false = not found - bool m_bValid; // True = yes argument parsed and valid, false = not valid - bool - m_bMandatory; // True = yes arg must be present, false = optional argument - CMIUtilString m_strArgName; - bool m_bHandled; // True = Command processes *this option, false = not handled - bool m_bIsMissingOptions; // True = Command needs more information, false = ok -}; - -//++ -//============================================================================ -// Details: MI common code class. Templated command argument base class. -//-- -template class CMICmdArgValBaseTemplate : public CMICmdArgValBase { - // Methods: -public: - CMICmdArgValBaseTemplate() = default; - CMICmdArgValBaseTemplate(const CMIUtilString &vrArgName, - const bool vbMandatory, const bool vbHandleByCmd); - // - const T &GetValue() const; - - // Overrideable: - ~CMICmdArgValBaseTemplate() override = default; - - // Attributes: -protected: - T m_argValue; -}; - -//++ -// Details: CMICmdArgValBaseTemplate constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// Return: None. -// Throws: None. -//-- -template -CMICmdArgValBaseTemplate::CMICmdArgValBaseTemplate( - const CMIUtilString &vrArgName, const bool vbMandatory, - const bool vbHandleByCmd) - : CMICmdArgValBase(vrArgName, vbMandatory, vbHandleByCmd) {} - -//++ -// Details: Retrieve the value the argument parsed from the command's argument / -// options -// text string. -// Type: Method. -// Args: None. -// Return: Template type & - The arg value of *this object. -// Throws: None. -//-- -template const T &CMICmdArgValBaseTemplate::GetValue() const { - return m_argValue; -} diff --git a/lldb/tools/lldb-mi/MICmdArgValBase.cpp b/lldb/tools/lldb-mi/MICmdArgValBase.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValBase.cpp +++ /dev/null @@ -1,129 +0,0 @@ -//===-- MICmdArgValBase.cpp -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "MICmdArgValBase.h" -#include "MICmdArgContext.h" -#include "MIUtilString.h" - -//++ -// Details: CMICmdArgValBase constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValBase::CMICmdArgValBase() - : m_bFound(false), m_bValid(false), m_bMandatory(false), m_bHandled(false), - m_bIsMissingOptions(false) {} - -//++ -// Details: CMICmdArgValBase constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// Return: None. -// Throws: None. -//-- -CMICmdArgValBase::CMICmdArgValBase(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd) - : m_bFound(false), m_bValid(false), m_bMandatory(vbMandatory), - m_strArgName(vrArgName), m_bHandled(vbHandleByCmd), - m_bIsMissingOptions(false) {} - -//++ -// Details: Retrieve the state flag of whether the argument is handled by the -// command or -// not. -// Type: Method. -// Args: None. -// Return: True - Command needs more information. -// False - All information is present as expected. -// Throws: None. -//-- -bool CMICmdArgValBase::GetIsMissingOptions() const { - return m_bIsMissingOptions; -} - -//++ -// Details: Retrieve the state flag of whether the argument is handled by the -// command or -// not. -// Type: Method. -// Args: None. -// Return: True - Command handles *this argument or option. -// False - Not handled (argument specified but ignored). -// Throws: None. -//-- -bool CMICmdArgValBase::GetIsHandledByCmd() const { return m_bHandled; } - -//++ -// Details: Retrieve the name of *this argument. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - Return the text name. -// Throws: None. -//-- -const CMIUtilString &CMICmdArgValBase::GetName() const { return m_strArgName; } - -//++ -// Details: Retrieve the state flag of whether the argument was found in the -// command's -// argument / options string. -// Type: Method. -// Args: None. -// Return: True - Argument found. -// False - Argument not found. -// Throws: None. -//-- -bool CMICmdArgValBase::GetFound() const { return m_bFound; } - -//++ -// Details: Retrieve the state flag indicating whether the value was obtained -// from the -// text arguments string and is valid. -// Type: Method. -// Args: None. -// Return: True - Argument valid. -// False - Argument not valid. -// Throws: None. -//-- -bool CMICmdArgValBase::GetValid() const { return m_bValid; } - -//++ -// Details: Retrieve the state flag indicating whether *this argument is a -// mandatory -// argument for the command or is optional to be present. -// Type: Method. -// Args: None. -// Return: True - Mandatory. -// False - Optional. -// Throws: None. -//-- -bool CMICmdArgValBase::GetIsMandatory() const { return m_bMandatory; } - -//++ -// Details: Parse the command's argument options string and try to extract the -// value *this -// argument is looking for. -// Type: Overrideable. -// Args: vArgContext - (RW) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValBase::Validate(CMICmdArgContext &vwArgContext) { - MIunused(vwArgContext); - - // Override to implement - - return MIstatus::failure; -} diff --git a/lldb/tools/lldb-mi/MICmdArgValConsume.h b/lldb/tools/lldb-mi/MICmdArgValConsume.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValConsume.h +++ /dev/null @@ -1,53 +0,0 @@ -//===-- MICmdArgValConsume.h ------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmdArgValBase.h" - -// Declarations: -class CMICmdArgContext; - -//++ -//============================================================================ -// Details: MI common code class. Command argument class. Arguments object -// needing specialization derived from the CMICmdArgValBase class. -// An argument knows what type of argument it is and how it is to -// interpret the options (context) string to find and validate a -// matching -// argument. This type having recognised its argument name just -// consumes -// that argument or option (ignores it). This is the so the validation -// process can then ask if all arguments or options have been -// recognised -// other an error will occurred "argument not recognised". For example -// this can be used to consume the "--" text which is not an argument -// in -// itself. Normally the GetValue() function (in base class) would -// return -// a value for the argument but is not the case for *this argument type -// object. -// Based on the Interpreter pattern. -//-- -class CMICmdArgValConsume : public CMICmdArgValBaseTemplate { - // Methods: -public: - /* ctor */ CMICmdArgValConsume(); - /* ctor */ CMICmdArgValConsume(const CMIUtilString &vrArgName, - const bool vbMandatory); - // - bool IsOk() const; - - // Overridden: -public: - // From CMICmdArgValBase - /* dtor */ ~CMICmdArgValConsume() override; - // From CMICmdArgSet::IArg - bool Validate(CMICmdArgContext &vwArgContext) override; -}; diff --git a/lldb/tools/lldb-mi/MICmdArgValConsume.cpp b/lldb/tools/lldb-mi/MICmdArgValConsume.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValConsume.cpp +++ /dev/null @@ -1,88 +0,0 @@ -//===-- MICmdArgValConsume.cpp ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgValConsume.h" -#include "MICmdArgContext.h" - -//++ -// Details: CMICmdArgValConsume constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValConsume::CMICmdArgValConsume() {} - -//++ -// Details: CMICmdArgValConsume constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// Return: None. -// Throws: None. -//-- -CMICmdArgValConsume::CMICmdArgValConsume(const CMIUtilString &vrArgName, - const bool vbMandatory) - : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, true) {} - -//++ -// Details: CMICmdArgValConsume destructor. -// Type: Overidden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValConsume::~CMICmdArgValConsume() {} - -//++ -// Details: Parse the command's argument options string and try to extract the -// value *this -// argument is looking for. -// Type: Overridden. -// Args: vwArgContext - (R) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValConsume::Validate(CMICmdArgContext &vwArgContext) { - if (vwArgContext.IsEmpty()) - return m_bMandatory ? MIstatus::failure : MIstatus::success; - - // Consume the optional file, line, linenum arguments till the mode '--' - // argument - const CMIUtilString::VecString_t vecOptions(vwArgContext.GetArgs()); - CMIUtilString::VecString_t::const_iterator it = vecOptions.begin(); - while (it != vecOptions.end()) { - const CMIUtilString &rTxt(*it); - - if (rTxt == "--") { - m_bFound = true; - m_bValid = true; - if (!vwArgContext.RemoveArg(rTxt)) - return MIstatus::failure; - return MIstatus::success; - } - // Next - ++it; - } - - return MIstatus::failure; -} - -//++ -// Details: Nothing to examine as we just want to consume the argument or option -// (ignore -// it). -// Type: Method. -// Args: None. -// Return: bool - True = yes ok, false = not ok. -// Throws: None. -//-- -bool CMICmdArgValConsume::IsOk() const { return true; } diff --git a/lldb/tools/lldb-mi/MICmdArgValFile.h b/lldb/tools/lldb-mi/MICmdArgValFile.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValFile.h +++ /dev/null @@ -1,47 +0,0 @@ -//===-- MICmdArgValFile.h ---------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmdArgValBase.h" - -// Declarations: -class CMICmdArgContext; - -//++ -//============================================================================ -// Details: MI common code class. Command argument class. Arguments object -// needing specialization derived from the CMICmdArgValBase class. -// An argument knows what type of argument it is and how it is to -// interpret the options (context) string to find and validate a -// matching -// argument and so extract a value from it . -// Based on the Interpreter pattern. -//-- -class CMICmdArgValFile : public CMICmdArgValBaseTemplate { - // Methods: -public: - /* ctor */ CMICmdArgValFile(); - /* ctor */ CMICmdArgValFile(const CMIUtilString &vrArgName, - const bool vbMandatory, const bool vbHandleByCmd); - // - bool IsFilePath(const CMIUtilString &vrFileNamePath) const; - CMIUtilString GetFileNamePath(const CMIUtilString &vrTxt) const; - - // Overridden: -public: - // From CMICmdArgValBase - /* dtor */ ~CMICmdArgValFile() override; - // From CMICmdArgSet::IArg - bool Validate(CMICmdArgContext &vwArgContext) override; - - // Methods: -private: - bool IsValidChars(const CMIUtilString &vrText) const; -}; diff --git a/lldb/tools/lldb-mi/MICmdArgValFile.cpp b/lldb/tools/lldb-mi/MICmdArgValFile.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValFile.cpp +++ /dev/null @@ -1,178 +0,0 @@ -//===-- MICmdArgValFile.cpp -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgValFile.h" -#include "MICmdArgContext.h" - -//++ -// Details: CMICmdArgValFile constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValFile::CMICmdArgValFile() {} - -//++ -// Details: CMICmdArgValFile constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// Return: None. -// Throws: None. -//-- -CMICmdArgValFile::CMICmdArgValFile(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd) - : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd) {} - -//++ -// Details: CMICmdArgValFile destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValFile::~CMICmdArgValFile() {} - -//++ -// Details: Parse the command's argument options string and try to extract the -// value *this -// argument is looking for. -// Type: Overridden. -// Args: vwArgContext - (R) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValFile::Validate(CMICmdArgContext &vwArgContext) { - if (vwArgContext.IsEmpty()) - return m_bMandatory ? MIstatus::failure : MIstatus::success; - - // The GDB/MI spec suggests there is only parameter - - if (vwArgContext.GetNumberArgsPresent() == 1) { - const CMIUtilString &rFile(vwArgContext.GetArgsLeftToParse()); - if (IsFilePath(rFile)) { - m_bFound = true; - m_bValid = true; - m_argValue = rFile.Trim('"'); - vwArgContext.RemoveArg(rFile); - return MIstatus::success; - } else - return MIstatus::failure; - } - - // In reality there are more than one option, if so the file option - // is the last one (don't handle that here - find the best looking one) - const CMIUtilString::VecString_t vecOptions(vwArgContext.GetArgs()); - CMIUtilString::VecString_t::const_iterator it = vecOptions.begin(); - while (it != vecOptions.end()) { - const CMIUtilString &rTxt(*it); - if (IsFilePath(rTxt)) { - m_bFound = true; - - if (vwArgContext.RemoveArg(rTxt)) { - m_bValid = true; - m_argValue = rTxt.Trim('"'); - return MIstatus::success; - } else - return MIstatus::success; - } - - // Next - ++it; - } - - return MIstatus::failure; -} - -//++ -// Details: Given some text extract the file name path from it. If a space is -// found in -// path done return the path surrounded in quotes. -// Type: Method. -// Args: vrTxt - (R) The text to extract the file name path from. -// Return: CMIUtilString - File name and or path. -// Throws: None. -//-- -CMIUtilString -CMICmdArgValFile::GetFileNamePath(const CMIUtilString &vrTxt) const { - CMIUtilString fileNamePath(vrTxt); - - // Look for a space in the path - const char cSpace = ' '; - const size_t nPos = fileNamePath.find(cSpace); - if (nPos != std::string::npos) - fileNamePath = CMIUtilString::Format("\"%s\"", fileNamePath.c_str()); - - return fileNamePath; -} - -//++ -// Details: Examine the string and determine if it is a valid file name path. -// Type: Method. -// Args: vrFileNamePath - (R) File's name and directory path. -// Return: bool - True = yes valid file path, false = no. -// Throws: None. -//-- -bool CMICmdArgValFile::IsFilePath(const CMIUtilString &vrFileNamePath) const { - if (vrFileNamePath.empty()) - return false; - - const bool bHavePosSlash = (vrFileNamePath.find('/') != std::string::npos); - const bool bHaveBckSlash = (vrFileNamePath.find('\\') != std::string::npos); - - // Look for --someLongOption - size_t nPos = vrFileNamePath.find("--"); - const bool bLong = (nPos == 0); - if (bLong) - return false; - - // Look for -f type short parameters - nPos = vrFileNamePath.find('-'); - const bool bShort = (nPos == 0); - if (bShort) - return false; - - // Look for i1 i2 i3.... - nPos = vrFileNamePath.find('i'); - const bool bFoundI1 = ((nPos == 0) && (::isdigit(vrFileNamePath[1]))); - if (bFoundI1) - return false; - - const bool bValidChars = IsValidChars(vrFileNamePath); - return bValidChars || bHavePosSlash || bHaveBckSlash; -} - -//++ -// Details: Determine if the path contains valid characters for a file path. -// Letters can be -// either upper or lower case. -// Type: Method. -// Args: vrText - (R) The text data to examine. -// Return: bool - True = yes valid, false = one or more chars is valid. -// Throws: None. -//-- -bool CMICmdArgValFile::IsValidChars(const CMIUtilString &vrText) const { - static CMIUtilString s_strSpecialCharacters(".'\"`@#$%^&*()_+-={}[]| "); - const char *pPtr = vrText.c_str(); - for (MIuint i = 0; i < vrText.length(); i++, pPtr++) { - const char c = *pPtr; - if (::isalnum((int)c) == 0) { - if (s_strSpecialCharacters.find(c) == CMIUtilString::npos) - return false; - } - } - - return true; -} diff --git a/lldb/tools/lldb-mi/MICmdArgValListBase.h b/lldb/tools/lldb-mi/MICmdArgValListBase.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValListBase.h +++ /dev/null @@ -1,101 +0,0 @@ -//===-- MICmdArgValListBase.h -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers: -#include - -// In-house headers: -#include "MICmdArgValBase.h" - -// Declarations: -class CMICmdArgContext; - -//++ -//============================================================================ -// Details: MI common code class. Command argument with addition options class. -// For example --recurse 1 2 4 [group ...]. Arguments object that -// require a list of options associated with them derive from the -// CMICmdArgValListBase class. Additional options are also extracted -// from -// the command arguments text string. -// An argument knows what type of argument it is and how it is to -// interpret the options (context) string to find and validate a -// matching -// options and so extract a values from it . -// The CMICmdArgValBase objects are added to the derived argument -// class's -// container. The option arguments belong to that derived class and -// will -// be deleted that object goes out of scope. -// Based on the Interpreter pattern. -//-- -class CMICmdArgValListBase - : public CMICmdArgValBaseTemplate> { - // Typedef: -public: - typedef std::vector VecArgObjPtr_t; - - // Enums: -public: - //++ - // Details: CMICmdArgValListBase needs to know what type of argument to look - // for in - // the command options text. It also needs to create argument objects - // of - // a specific type. - //-- - enum ArgValType_e { - eArgValType_File = 0, - eArgValType_Consume, - eArgValType_Number, - eArgValType_OptionLong, - eArgValType_OptionShort, - eArgValType_String, - eArgValType_StringQuoted, - eArgValType_StringQuotedNumber, - eArgValType_StringQuotedNumberPath, - eArgValType_StringAnything, // Accept any words for a string 'type' even if - // they look like --longOptions for example - eArgValType_ThreadGrp, - eArgValType_count, // Always the last one - eArgValType_invalid - }; - - // Methods: -public: - /* ctor */ CMICmdArgValListBase(); - /* ctor */ CMICmdArgValListBase(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd); - /* ctor */ CMICmdArgValListBase(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const ArgValType_e veType); - - // Overridden: -public: - // From CMICmdArgValBase - /* dtor */ ~CMICmdArgValListBase() override; - - // Methods: -protected: - bool IsExpectedCorrectType(const CMIUtilString &vrTxt, - const ArgValType_e veType) const; - CMICmdArgValBase *CreationObj(const CMIUtilString &vrTxt, - const ArgValType_e veType) const; - - // Attributes: -protected: - ArgValType_e m_eArgType; - - // Methods: -private: - void Destroy(); -}; diff --git a/lldb/tools/lldb-mi/MICmdArgValListBase.cpp b/lldb/tools/lldb-mi/MICmdArgValListBase.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValListBase.cpp +++ /dev/null @@ -1,209 +0,0 @@ -//===-- MICmdArgValListBase.cpp ---------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgValListBase.h" -#include "MICmdArgContext.h" -#include "MICmdArgValConsume.h" -#include "MICmdArgValFile.h" -#include "MICmdArgValNumber.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValString.h" -#include "MICmdArgValThreadGrp.h" - -//++ -// Details: CMICmdArgValListBase constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValListBase::CMICmdArgValListBase() - : m_eArgType(eArgValType_invalid) {} - -//++ -// Details: CMICmdArgValListBase constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// Return: None. -// Throws: None. -//-- -CMICmdArgValListBase::CMICmdArgValListBase(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd) - : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd), - m_eArgType(eArgValType_invalid) {} - -//++ -// Details: CMICmdArgValListBase constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// veType - (R) The type of argument to look for and create -// argument object of a certain type. -// Return: None. -// Throws: None. -//-- -CMICmdArgValListBase::CMICmdArgValListBase(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const ArgValType_e veType) - : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd), - m_eArgType(veType) {} - -//++ -// Details: CMICmdArgValListBase destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValListBase::~CMICmdArgValListBase() { - // Tidy up - Destroy(); -} - -//++ -// Details: Tear down resources used by *this object. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmdArgValListBase::Destroy() { - // Tidy up - VecArgObjPtr_t::const_iterator it = m_argValue.begin(); - while (it != m_argValue.end()) { - CMICmdArgValBase *pArgObj = *it; - delete pArgObj; - - // Next - ++it; - } - m_argValue.clear(); -} - -//++ -// Details: Create an CMICmdArgValBase derived object matching the type -// specified -// and put the option or argument's value inside it. -// Type: Method. -// Args: vrTxt - (R) Text version the option or argument. -// veType - (R) The type of argument or option object to create. -// Return: CMICmdArgValBase * - Option object holding the value. -// - NULL = Functional failed. -// Throws: None. -//-- -CMICmdArgValBase * -CMICmdArgValListBase::CreationObj(const CMIUtilString &vrTxt, - const ArgValType_e veType) const { - CMICmdArgValBase *pOptionObj = nullptr; - switch (veType) { - case eArgValType_File: - pOptionObj = new CMICmdArgValFile(); - break; - case eArgValType_Consume: - pOptionObj = new CMICmdArgValConsume(); - break; - case eArgValType_Number: - pOptionObj = new CMICmdArgValNumber(); - break; - case eArgValType_OptionLong: - pOptionObj = new CMICmdArgValOptionLong(); - break; - case eArgValType_OptionShort: - pOptionObj = new CMICmdArgValOptionShort(); - break; - case eArgValType_String: - pOptionObj = new CMICmdArgValString(); - break; - case eArgValType_StringQuoted: - pOptionObj = new CMICmdArgValString(true, false, false); - break; - case eArgValType_StringQuotedNumber: - pOptionObj = new CMICmdArgValString(true, true, false); - break; - case eArgValType_StringQuotedNumberPath: - pOptionObj = new CMICmdArgValString(true, true, true); - break; - case eArgValType_StringAnything: - pOptionObj = new CMICmdArgValString(true); - break; - case eArgValType_ThreadGrp: - pOptionObj = new CMICmdArgValThreadGrp(); - break; - default: - return nullptr; - } - - CMICmdArgContext argCntxt(vrTxt); - if (!pOptionObj->Validate(argCntxt)) - return nullptr; - - return pOptionObj; -} - -//++ -// Details: Validate the option or argument is the correct type. -// Type: Method. -// Args: vrTxt - (R) Text version the option or argument. -// veType - (R) The type of value to expect. -// Return: bool - True = Yes expected type present, False = no. -// Throws: None. -//-- -bool CMICmdArgValListBase::IsExpectedCorrectType( - const CMIUtilString &vrTxt, const ArgValType_e veType) const { - bool bValid = false; - switch (veType) { - case eArgValType_File: - bValid = CMICmdArgValFile().IsFilePath(vrTxt); - break; - case eArgValType_Consume: - bValid = CMICmdArgValConsume().IsOk(); - break; - case eArgValType_Number: - bValid = CMICmdArgValNumber().IsArgNumber(vrTxt); - break; - case eArgValType_OptionLong: - bValid = CMICmdArgValOptionLong().IsArgLongOption(vrTxt); - break; - case eArgValType_OptionShort: - bValid = CMICmdArgValOptionShort().IsArgShortOption(vrTxt); - break; - case eArgValType_String: - bValid = CMICmdArgValString().IsStringArg(vrTxt); - break; - case eArgValType_StringQuoted: - bValid = CMICmdArgValString(true, false, false).IsStringArg(vrTxt); - break; - case eArgValType_StringQuotedNumber: - bValid = CMICmdArgValString(true, true, false).IsStringArg(vrTxt); - break; - case eArgValType_StringQuotedNumberPath: - bValid = CMICmdArgValString(true, true, true).IsStringArg(vrTxt); - break; - case eArgValType_StringAnything: - bValid = CMICmdArgValString(true).IsStringArg(vrTxt); - break; - case eArgValType_ThreadGrp: - bValid = CMICmdArgValThreadGrp().IsArgThreadGrp(vrTxt); - break; - default: - return false; - } - - return bValid; -} diff --git a/lldb/tools/lldb-mi/MICmdArgValListOfN.h b/lldb/tools/lldb-mi/MICmdArgValListOfN.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValListOfN.h +++ /dev/null @@ -1,92 +0,0 @@ -//===-- MICmdArgValListOfN.h ------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers: -#include - -// In-house headers: -#include "MICmdArgValListBase.h" - -// Declarations: -class CMICmdArgContext; - -//++ -//============================================================================ -// Details: MI common code class. Command argument class. Arguments object -// needing specialization derived from the CMICmdArgValBase class. -// An argument knows what type of argument it is and how it is to -// interpret the options (context) string to find and validate a -// matching -// argument and so extract a value from it . -// The CMICmdArgValBase objects added to *this ListOfN container belong -// to this container and will be deleted when *this object goes out of -// scope. -// To parse arguments like 'thread-id ...' i.e. 1 10 12 13 ... -// If vbMandatory argument is true it takes on the (...)+ specification -// otherwise assumed to be (...)* specification. -// Based on the Interpreter pattern. -//-- -class CMICmdArgValListOfN : public CMICmdArgValListBase { - // Methods: -public: - /* ctor */ CMICmdArgValListOfN(); - /* ctor */ CMICmdArgValListOfN(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const ArgValType_e veType); - // - const VecArgObjPtr_t &GetExpectedOptions() const; - template - bool GetExpectedOption(T2 &vrwValue, - const VecArgObjPtr_t::size_type vnAt = 0) const; - - // Overridden: -public: - // From CMICmdArgValBase - /* dtor */ ~CMICmdArgValListOfN() override; - // From CMICmdArgSet::IArg - bool Validate(CMICmdArgContext &vArgContext) override; - - // Methods: -private: - bool IsListOfN(const CMIUtilString &vrTxt) const; - bool CreateList(const CMIUtilString &vrTxt); -}; - -//++ -// Details: Retrieve the first argument or option value from the list of 1 or -// more options -// parsed from the command's options string. -// Type: Template method. -// Args: vrwValue - (W) Templated type return value. -// vnAt - (R) Value at the specific position. -// T1 - The argument value's class type of the data hold in -// the list of options. -// T2 - The type pf the variable which holds the value wanted. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. List of object was empty. -// Throws: None. -//-- -template -bool CMICmdArgValListOfN::GetExpectedOption( - T2 &vrwValue, const VecArgObjPtr_t::size_type vnAt) const { - const VecArgObjPtr_t &rVecOptions(GetExpectedOptions()); - if (rVecOptions.size() <= vnAt) - return MIstatus::failure; - - VecArgObjPtr_t::const_iterator it2 = rVecOptions.begin() + vnAt; - if (it2 != rVecOptions.end()) { - const T1 *pOption = static_cast(*it2); - vrwValue = pOption->GetValue(); - return MIstatus::success; - } - - return MIstatus::failure; -} diff --git a/lldb/tools/lldb-mi/MICmdArgValListOfN.cpp b/lldb/tools/lldb-mi/MICmdArgValListOfN.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValListOfN.cpp +++ /dev/null @@ -1,167 +0,0 @@ -//===-- MICmdArgValListOfN.cpp ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgValListOfN.h" -#include "MICmdArgContext.h" -#include "MICmdArgValFile.h" -#include "MICmdArgValNumber.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValString.h" -#include "MICmdArgValThreadGrp.h" - -//++ -// Details: CMICmdArgValListOfN constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValListOfN::CMICmdArgValListOfN() {} - -//++ -// Details: CMICmdArgValListOfN constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// veType - (R) The type of argument to look for and create -// argument object of a certain type. -// Return: None. -// Throws: None. -//-- -CMICmdArgValListOfN::CMICmdArgValListOfN(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const ArgValType_e veType) - : CMICmdArgValListBase(vrArgName, vbMandatory, vbHandleByCmd, veType) {} - -//++ -// Details: CMICmdArgValListOfN destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValListOfN::~CMICmdArgValListOfN() {} - -//++ -// Details: Parse the command's argument options string and try to extract the -// list of -// arguments based on the argument object type to look for. -// Type: Overridden. -// Args: vwArgContext - (RW) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValListOfN::Validate(CMICmdArgContext &vwArgContext) { - if (m_eArgType >= eArgValType_count) { - m_eArgType = eArgValType_invalid; - return MIstatus::failure; - } - - if (vwArgContext.IsEmpty()) - return m_bMandatory ? MIstatus::failure : MIstatus::success; - - const CMIUtilString &rArg(vwArgContext.GetArgsLeftToParse()); - if (IsListOfN(rArg) && CreateList(rArg)) { - m_bFound = true; - m_bValid = true; - vwArgContext.RemoveArg(rArg); - return MIstatus::success; - } else - return MIstatus::failure; -} - -//++ -// Details: Create list of argument objects each holding a value extract from -// the command -// options line. -// Type: Method. -// Args: vrTxt - (R) Some options text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValListOfN::CreateList(const CMIUtilString &vrTxt) { - CMIUtilString::VecString_t vecOptions; - if ((m_eArgType == eArgValType_StringQuoted) || - (m_eArgType == eArgValType_StringQuotedNumber) || - (m_eArgType == eArgValType_StringQuotedNumberPath) || - (m_eArgType == eArgValType_StringAnything)) { - if (vrTxt.SplitConsiderQuotes(" ", vecOptions) == 0) - return MIstatus::failure; - } else if (vrTxt.Split(" ", vecOptions) == 0) - return MIstatus::failure; - - CMIUtilString::VecString_t::const_iterator it = vecOptions.begin(); - while (it != vecOptions.end()) { - const CMIUtilString &rOption = *it; - CMICmdArgValBase *pOption = CreationObj(rOption, m_eArgType); - if (pOption != nullptr) - m_argValue.push_back(pOption); - else - return MIstatus::failure; - - // Next - ++it; - } - - return MIstatus::success; -} - -//++ -// Details: Examine the string and determine if it is a valid string type -// argument. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValListOfN::IsListOfN(const CMIUtilString &vrTxt) const { - CMIUtilString::VecString_t vecOptions; - if ((m_eArgType == eArgValType_StringQuoted) || - (m_eArgType == eArgValType_StringQuotedNumber) || - (m_eArgType == eArgValType_StringQuotedNumberPath) || - (m_eArgType == eArgValType_StringAnything)) { - if (vrTxt.SplitConsiderQuotes(" ", vecOptions) == 0) - return false; - } else if (vrTxt.Split(" ", vecOptions) == 0) - return false; - - CMIUtilString::VecString_t::const_iterator it = vecOptions.begin(); - while (it != vecOptions.end()) { - const CMIUtilString &rOption = *it; - if (!IsExpectedCorrectType(rOption, m_eArgType)) - break; - - // Next - ++it; - } - - return true; -} - -//++ -// Details: Retrieve the list of CMICmdArgValBase derived option objects found -// following -// *this long option argument. For example "list-thread-groups [ -// --recurse 1 ]" -// where 1 is the list of expected option to follow. -// Type: Method. -// Args: None. -// Return: CMICmdArgValListBase::VecArgObjPtr_t & - List of options. -// Throws: None. -//-- -const CMICmdArgValListBase::VecArgObjPtr_t & -CMICmdArgValListOfN::GetExpectedOptions() const { - return m_argValue; -} diff --git a/lldb/tools/lldb-mi/MICmdArgValNumber.h b/lldb/tools/lldb-mi/MICmdArgValNumber.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValNumber.h +++ /dev/null @@ -1,69 +0,0 @@ -//===-- MICmdArgValNumber.h -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmdArgValBase.h" - -// Declarations: -class CMICmdArgContext; - -//++ -//============================================================================ -// Details: MI common code class. Command argument class. Arguments object -// needing specialization derived from the CMICmdArgValBase class. -// An argument knows what type of argument it is and how it is to -// interpret the options (context) string to find and validate a -// matching -// argument and so extract a value from it . -// Based on the Interpreter pattern. -//-- -class CMICmdArgValNumber : public CMICmdArgValBaseTemplate { - // Enums: -public: - //++ - // Details: CMICmdArgValNumber needs to know what format of argument to look - // for in - // the command options text. - //-- - enum ArgValNumberFormat_e { - eArgValNumberFormat_Decimal = (1u << 0), - eArgValNumberFormat_Hexadecimal = (1u << 1), - eArgValNumberFormat_Auto = - ((eArgValNumberFormat_Hexadecimal << 1) - - 1u) ///< Indicates to try and lookup everything up during a query. - }; - - // Methods: -public: - /* ctor */ CMICmdArgValNumber(); - /* ctor */ CMICmdArgValNumber( - const CMIUtilString &vrArgName, const bool vbMandatory, - const bool vbHandleByCmd, - const MIuint vnNumberFormatMask = eArgValNumberFormat_Decimal); - // - bool IsArgNumber(const CMIUtilString &vrTxt) const; - - // Overridden: -public: - // From CMICmdArgValBase - /* dtor */ ~CMICmdArgValNumber() override; - // From CMICmdArgSet::IArg - bool Validate(CMICmdArgContext &vwArgContext) override; - - // Methods: -private: - bool ExtractNumber(const CMIUtilString &vrTxt); - MIint64 GetNumber() const; - - // Attributes: -private: - MIuint m_nNumberFormatMask; - MIint64 m_nNumber; -}; diff --git a/lldb/tools/lldb-mi/MICmdArgValNumber.cpp b/lldb/tools/lldb-mi/MICmdArgValNumber.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValNumber.cpp +++ /dev/null @@ -1,156 +0,0 @@ -//===-- MICmdArgValNumber.cpp -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgValNumber.h" -#include "MICmdArgContext.h" - -//++ -// Details: CMICmdArgValNumber constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValNumber::CMICmdArgValNumber() - : m_nNumberFormatMask(CMICmdArgValNumber::eArgValNumberFormat_Decimal), - m_nNumber(0) {} - -//++ -// Details: CMICmdArgValNumber constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = -// optional argument. -// vbHandleByCmd - (R) True = Command processes *this option, -// false = not handled. -// vnNumberFormatMask - (R) Mask of the number formats. (Dflt = -// CMICmdArgValNumber::eArgValNumberFormat_Decimal) -// Return: None. -// Throws: None. -//-- -CMICmdArgValNumber::CMICmdArgValNumber( - const CMIUtilString &vrArgName, const bool vbMandatory, - const bool vbHandleByCmd, - const MIuint - vnNumberFormatMask /* = CMICmdArgValNumber::eArgValNumberFormat_Decimal*/) - : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd), - m_nNumberFormatMask(vnNumberFormatMask), m_nNumber(0) {} - -//++ -// Details: CMICmdArgValNumber destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValNumber::~CMICmdArgValNumber() {} - -//++ -// Details: Parse the command's argument options string and try to extract the -// value *this -// argument is looking for. -// Type: Overridden. -// Args: vwArgContext - (RW) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValNumber::Validate(CMICmdArgContext &vwArgContext) { - if (vwArgContext.IsEmpty()) - return m_bMandatory ? MIstatus::failure : MIstatus::success; - - if (vwArgContext.GetNumberArgsPresent() == 1) { - const CMIUtilString &rArg(vwArgContext.GetArgsLeftToParse()); - if (IsArgNumber(rArg) && ExtractNumber(rArg)) { - m_bFound = true; - m_bValid = true; - m_argValue = GetNumber(); - vwArgContext.RemoveArg(rArg); - return MIstatus::success; - } else - return MIstatus::failure; - } - - // More than one option... - const CMIUtilString::VecString_t vecOptions(vwArgContext.GetArgs()); - CMIUtilString::VecString_t::const_iterator it = vecOptions.begin(); - while (it != vecOptions.end()) { - const CMIUtilString &rArg(*it); - if (IsArgNumber(rArg) && ExtractNumber(rArg)) { - m_bFound = true; - - if (vwArgContext.RemoveArg(rArg)) { - m_bValid = true; - m_argValue = GetNumber(); - return MIstatus::success; - } else - return MIstatus::failure; - } - - // Next - ++it; - } - - return MIstatus::failure; -} - -//++ -// Details: Examine the string and determine if it is a valid string type -// argument. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValNumber::IsArgNumber(const CMIUtilString &vrTxt) const { - const bool bFormatDecimal(m_nNumberFormatMask & - CMICmdArgValNumber::eArgValNumberFormat_Decimal); - const bool bFormatHexadecimal( - m_nNumberFormatMask & - CMICmdArgValNumber::eArgValNumberFormat_Hexadecimal); - - // Look for --someLongOption - if (std::string::npos != vrTxt.find("--")) - return false; - - if (bFormatDecimal && vrTxt.IsNumber()) - return true; - - if (bFormatHexadecimal && vrTxt.IsHexadecimalNumber()) - return true; - - return false; -} - -//++ -// Details: Extract the thread group number from the thread group argument. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValNumber::ExtractNumber(const CMIUtilString &vrTxt) { - MIint64 nNumber = 0; - bool bOk = vrTxt.ExtractNumber(nNumber); - if (bOk) { - m_nNumber = static_cast(nNumber); - } - - return bOk; -} - -//++ -// Details: Retrieve the thread group ID found in the argument. -// Type: Method. -// Args: None. -// Return: MIuint - Thread group ID. -// Throws: None. -//-- -MIint64 CMICmdArgValNumber::GetNumber() const { return m_nNumber; } diff --git a/lldb/tools/lldb-mi/MICmdArgValOptionLong.h b/lldb/tools/lldb-mi/MICmdArgValOptionLong.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValOptionLong.h +++ /dev/null @@ -1,104 +0,0 @@ -//===-- MICmdArgValOptionLong.h ---------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmdArgValListBase.h" - -// Declarations: -class CMICmdArgContext; -class CMIUtilString; - -//++ -//============================================================================ -// Details: MI common code class. Command argument class. Arguments object -// needing specialization derived from the CMICmdArgValBase class. -// An argument knows what type of argument it is and how it is to -// interpret the options (context) string to find and validate a -// matching -// argument and so extract a value from it. -// If *this argument has expected options following it the option -// objects -// created to hold each of those option's values belong to *this -// argument -// object and so are deleted when *this object goes out of scope. -// Based on the Interpreter pattern. -//-- -class CMICmdArgValOptionLong : public CMICmdArgValListBase { - // Methods: -public: - /* ctor */ CMICmdArgValOptionLong(); - /* ctor */ CMICmdArgValOptionLong(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd); - /* ctor */ CMICmdArgValOptionLong(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const ArgValType_e veType, - const MIuint vnExpectingNOptions); - // - bool IsArgLongOption(const CMIUtilString &vrTxt) const; - const VecArgObjPtr_t &GetExpectedOptions() const; - template bool GetExpectedOption(T2 &vrwValue) const; - - // Overridden: -public: - // From CMICmdArgValBase - /* dtor */ ~CMICmdArgValOptionLong() override; - // From CMICmdArgSet::IArg - bool Validate(CMICmdArgContext &vArgContext) override; - - // Methods: -protected: - bool ExtractExpectedOptions(CMICmdArgContext &vrwTxt, const MIuint nArgIndex); - - // Overrideable: -protected: - virtual bool IsArgOptionCorrect(const CMIUtilString &vrTxt) const; - virtual bool ArgNameMatch(const CMIUtilString &vrTxt) const; - - // Methods: -private: - void Destroy(); - - // Attributes: -private: - MIuint m_nExpectingNOptions; // The number of options expected to read - // following *this argument - VecArgObjPtr_t m_vecArgsExpected; // The option objects holding the value - // extracted following *this argument - ArgValType_e m_eExpectingOptionType; // The type of options expected to read - // following *this argument -}; - -//++ -// Details: Retrieve the first argument or option value from the list of 1 or -// more options -// parsed from the command's options string. -// Type: Template method. -// Args: vrwValue - (W) Templated type return value. -// T1 - The argument value's class type of the data hold in -// the list of options. -// T2 - The type pf the variable which holds the value wanted. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. List of object was empty. -// Throws: None. -//-- -template -bool CMICmdArgValOptionLong::GetExpectedOption(T2 &vrwValue) const { - const VecArgObjPtr_t &rVecOptions(GetExpectedOptions()); - VecArgObjPtr_t::const_iterator it2 = rVecOptions.begin(); - if (it2 != rVecOptions.end()) { - const T1 *pOption = static_cast(*it2); - vrwValue = pOption->GetValue(); - return MIstatus::success; - } - - return MIstatus::failure; -} diff --git a/lldb/tools/lldb-mi/MICmdArgValOptionLong.cpp b/lldb/tools/lldb-mi/MICmdArgValOptionLong.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValOptionLong.cpp +++ /dev/null @@ -1,291 +0,0 @@ -//===-- MICmdArgValOptionLong.cpp -------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgValOptionLong.h" -#include "MICmdArgContext.h" - -//++ -// Details: CMICmdArgValOptionLong constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValOptionLong::CMICmdArgValOptionLong() - : m_nExpectingNOptions(0), m_eExpectingOptionType(eArgValType_invalid) {} - -//++ -// Details: CMICmdArgValOptionLong constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// Return: None. -// Throws: None. -//-- -CMICmdArgValOptionLong::CMICmdArgValOptionLong(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd) - : CMICmdArgValListBase(vrArgName, vbMandatory, vbHandleByCmd), - m_nExpectingNOptions(0), m_eExpectingOptionType(eArgValType_invalid) {} - -//++ -// Details: CMICmdArgValOptionLong constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = -// optional argument. -// vbHandleByCmd - (R) True = Command processes *this option, -// false = not handled. -// veType - (R) The type of argument to look for and -// create argument object of a certain type. -// vnExpectingNOptions - (R) The number of options expected to read -// following *this argument. -// Return: None. -// Throws: None. -//-- -CMICmdArgValOptionLong::CMICmdArgValOptionLong(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const ArgValType_e veType, - const MIuint vnExpectingNOptions) - : CMICmdArgValListBase(vrArgName, vbMandatory, vbHandleByCmd), - m_nExpectingNOptions(vnExpectingNOptions), - m_eExpectingOptionType(veType) {} - -//++ -// Details: CMICmdArgValOptionLong destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValOptionLong::~CMICmdArgValOptionLong() { - // Tidy up - Destroy(); -} - -//++ -// Details: Tear down resources used by *this object. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmdArgValOptionLong::Destroy() { - // Tidy up - VecArgObjPtr_t::const_iterator it = m_vecArgsExpected.begin(); - while (it != m_vecArgsExpected.end()) { - CMICmdArgValBase *pOptionObj = *it; - delete pOptionObj; - - // Next - ++it; - } - m_vecArgsExpected.clear(); -} - -//++ -// Details: Parse the command's argument options string and try to extract the -// long -// argument *this argument type is looking for. -// Type: Overridden. -// Args: vwArgContext - (RW) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValOptionLong::Validate(CMICmdArgContext &vwArgContext) { - if (vwArgContext.IsEmpty()) - return m_bMandatory ? MIstatus::failure : MIstatus::success; - - if (vwArgContext.GetNumberArgsPresent() == 1) { - const CMIUtilString &rArg(vwArgContext.GetArgsLeftToParse()); - if (IsArgLongOption(rArg) && ArgNameMatch(rArg)) { - m_bFound = true; - - if (!vwArgContext.RemoveArg(rArg)) - return MIstatus::failure; - - if (m_nExpectingNOptions == 0) { - m_bValid = true; - return MIstatus::success; - } - - m_bIsMissingOptions = true; - return MIstatus::failure; - } else - return MIstatus::failure; - } - - // More than one option... - MIuint nArgIndex = 0; - const CMIUtilString::VecString_t vecOptions(vwArgContext.GetArgs()); - CMIUtilString::VecString_t::const_iterator it = vecOptions.begin(); - while (it != vecOptions.end()) { - const CMIUtilString &rArg(*it); - if (IsArgOptionCorrect(rArg) && ArgNameMatch(rArg)) { - m_bFound = true; - - if (!vwArgContext.RemoveArg(rArg)) - return MIstatus::failure; - - if (m_nExpectingNOptions != 0) { - if (ExtractExpectedOptions(vwArgContext, nArgIndex)) { - m_bValid = true; - return MIstatus::success; - } - - m_bIsMissingOptions = true; - return MIstatus::failure; - } else { - m_bValid = true; - return MIstatus::success; - } - } - - // Next - ++it; - ++nArgIndex; - } - - return MIstatus::failure; -} - -//++ -// Details: Parse the text following *this argument and extract the options the -// values of -// CMICmdArgValListBase::m_eArgType forming argument objects for each -// of those -// options extracted. -// Type: Method. -// Args: vrwTxt - (RW) The command's argument options string. -// nArgIndex - (R) The Nth arg position in argument context from -// the left. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValOptionLong::ExtractExpectedOptions(CMICmdArgContext &vrwTxt, - const MIuint nArgIndex) { - CMIUtilString::VecString_t vecOptions = vrwTxt.GetArgs(); - if (vecOptions.size() == 0) - return MIstatus::failure; - - MIuint nArgIndexCnt = 0; - MIuint nTypeCnt = 0; - MIuint nTypeCnt2 = 0; - MIuint nFoundNOptionsCnt = 0; - CMIUtilString::VecString_t::const_iterator it = vecOptions.begin(); - while (it != vecOptions.end()) { - // Move to the Nth argument position from left before do validation/checking - if (nArgIndexCnt++ == nArgIndex) { - nTypeCnt++; - const CMIUtilString &rOption(*it); - if (IsExpectedCorrectType(rOption, m_eExpectingOptionType)) { - nTypeCnt2++; - CMICmdArgValBase *pOptionObj = - CreationObj(rOption, m_eExpectingOptionType); - if ((pOptionObj != nullptr) && - vrwTxt.RemoveArgAtPos(rOption, nArgIndex)) { - nFoundNOptionsCnt++; - m_vecArgsExpected.push_back(pOptionObj); - } - } - - // Is the sequence 'options' of same type broken. Expecting the same type - // until the - // next argument. - if (nTypeCnt != nTypeCnt2) - return MIstatus::failure; - - if (nFoundNOptionsCnt == m_nExpectingNOptions) - return MIstatus::success; - } - - // Next - ++it; - } - if (nFoundNOptionsCnt != m_nExpectingNOptions) - return MIstatus::failure; - - return MIstatus::success; -} - -//++ -// Details: Examine the string and determine if it is a valid long type option -// argument. -// Long type argument looks like --someLongOption. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValOptionLong::IsArgLongOption(const CMIUtilString &vrTxt) const { - const bool bHavePosSlash = (vrTxt.find('/') != std::string::npos); - const bool bHaveBckSlash = (vrTxt.find('\\') != std::string::npos); - if (bHavePosSlash || bHaveBckSlash) - return false; - - const size_t nPos = vrTxt.find("--"); - if (nPos != 0) - return false; - - if (vrTxt.length() < 3) - return false; - - const CMIUtilString strArg = vrTxt.substr(2); - return !strArg.IsNumber(); -} - -//++ -// Details: Examine the string and determine if it is a valid long type option -// argument. -// Long type argument looks like --someLongOption. -// Type: Overideable. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValOptionLong::IsArgOptionCorrect( - const CMIUtilString &vrTxt) const { - return IsArgLongOption(vrTxt); -} - -//++ -// Details: Does the argument name of the argument being parsed ATM match the -// name of -// *this argument object. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes arg name matched, false = no. -// Throws: None. -//-- -bool CMICmdArgValOptionLong::ArgNameMatch(const CMIUtilString &vrTxt) const { - const CMIUtilString strArg = vrTxt.substr(2); - return (strArg == GetName()); -} - -//++ -// Details: Retrieve the list of CMICmdArgValBase derived option objects found -// following -// *this long option argument. For example "list-thread-groups [ -// --recurse 1 ]" -// where 1 is the list of expected option to follow. -// Type: Method. -// Args: None. -// Return: CMICmdArgValListBase::VecArgObjPtr_t & - List of options. -// Throws: None. -//-- -const CMICmdArgValListBase::VecArgObjPtr_t & -CMICmdArgValOptionLong::GetExpectedOptions() const { - return m_vecArgsExpected; -} diff --git a/lldb/tools/lldb-mi/MICmdArgValOptionShort.h b/lldb/tools/lldb-mi/MICmdArgValOptionShort.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValOptionShort.h +++ /dev/null @@ -1,59 +0,0 @@ -//===-- MICmdArgValOptionShort.h --------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmdArgValOptionLong.h" - -// Declarations: -class CMICmdArgContext; -class CMIUtilString; - -//++ -//============================================================================ -// Details: MI common code class. Command argument class. Arguments object -// needing specialization derived from the CMICmdArgValOptionLong -// class. -// An argument knows what type of argument it is and how it is to -// interpret the options (context) string to find and validate a -// matching -// argument and so extract a value from it. -// If *this argument has expected options following it the option -// objects -// created to hold each of those option's values belong to *this -// argument -// object and so are deleted when *this object goes out of scope. -// Based on the Interpreter pattern. -//-- -class CMICmdArgValOptionShort : public CMICmdArgValOptionLong { - // Methods: -public: - /* ctor */ CMICmdArgValOptionShort(); - /* ctor */ CMICmdArgValOptionShort(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd); - /* ctor */ CMICmdArgValOptionShort(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const ArgValType_e veType, - const MIuint vnExpectingNOptions); - // - bool IsArgShortOption(const CMIUtilString &vrTxt) const; - - // Overridden: -public: - // From CMICmdArgValBase - /* dtor */ ~CMICmdArgValOptionShort() override; - - // Overridden: -private: - // From CMICmdArgValOptionLong - bool IsArgOptionCorrect(const CMIUtilString &vrTxt) const override; - bool ArgNameMatch(const CMIUtilString &vrTxt) const override; -}; diff --git a/lldb/tools/lldb-mi/MICmdArgValOptionShort.cpp b/lldb/tools/lldb-mi/MICmdArgValOptionShort.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValOptionShort.cpp +++ /dev/null @@ -1,121 +0,0 @@ -//===-- MICmdArgValOptionShort.cpp ------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgValOptionShort.h" -#include "MICmdArgContext.h" - -//++ -// Details: CMICmdArgValOptionShort constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValOptionShort::CMICmdArgValOptionShort() {} - -//++ -// Details: CMICmdArgValOptionShort constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// Return: None. -// Throws: None. -//-- -CMICmdArgValOptionShort::CMICmdArgValOptionShort(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd) - : CMICmdArgValOptionLong(vrArgName, vbMandatory, vbHandleByCmd) {} - -//++ -// Details: CMICmdArgValOptionLong constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = -// optional argument. -// vbHandleByCmd - (R) True = Command processes *this option, -// false = not handled. -// veType - (R) The type of argument to look for and -// create argument object of a certain type. -// vnExpectingNOptions - (R) The number of options expected to read -// following *this argument. -// Return: None. -// Throws: None. -//-- -CMICmdArgValOptionShort::CMICmdArgValOptionShort( - const CMIUtilString &vrArgName, const bool vbMandatory, - const bool vbHandleByCmd, const ArgValType_e veType, - const MIuint vnExpectingNOptions) - : CMICmdArgValOptionLong(vrArgName, vbMandatory, vbHandleByCmd, veType, - vnExpectingNOptions) {} - -//++ -// Details: CMICmdArgValOptionShort destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValOptionShort::~CMICmdArgValOptionShort() {} - -//++ -// Details: Examine the string and determine if it is a valid short type option -// argument. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValOptionShort::IsArgShortOption( - const CMIUtilString &vrTxt) const { - // Look for --someLongOption - MIint nPos = vrTxt.find("--"); - if (nPos == 0) - return false; - - // Look for -f short option - nPos = vrTxt.find('-'); - if (nPos != 0) - return false; - - if (vrTxt.length() > 2) - return false; - - return true; -} - -//++ -// Details: Examine the string and determine if it is a valid short type option -// argument. -// Long type argument looks like -f some short option. -// Type: Overridden. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValOptionShort::IsArgOptionCorrect( - const CMIUtilString &vrTxt) const { - return IsArgShortOption(vrTxt); -} - -//++ -// Details: Does the argument name of the argument being parsed ATM match the -// name of -// *this argument object. -// Type: Overridden. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes arg name matched, false = no. -// Throws: None. -//-- -bool CMICmdArgValOptionShort::ArgNameMatch(const CMIUtilString &vrTxt) const { - const CMIUtilString strArg = vrTxt.substr(1); - return (strArg == GetName()); -} diff --git a/lldb/tools/lldb-mi/MICmdArgValPrintValues.h b/lldb/tools/lldb-mi/MICmdArgValPrintValues.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValPrintValues.h +++ /dev/null @@ -1,56 +0,0 @@ -//===-- MICmdArgValPrintValues.h --------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmdArgValBase.h" - -// Declarations: -class CMICmdArgContext; - -//++ -//============================================================================ -// Details: MI common code class. Command argument class. Arguments object -// needing specialization derived from the CMICmdArgValBase class. -// An argument knows what type of argument it is and how it is to -// interpret the options (context) string to find and validate a -// matching -// argument and so extract a value from it. The print-values looks -// like: -// 0 or --no-values -// 1 or --all-values -// 2 or --simple-values -// Based on the Interpreter pattern. -//-- -class CMICmdArgValPrintValues : public CMICmdArgValBaseTemplate { - // Methods: -public: - /* ctor */ CMICmdArgValPrintValues(); - /* ctor */ CMICmdArgValPrintValues(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd); - // - bool IsArgPrintValues(const CMIUtilString &vrTxt) const; - - // Overridden: -public: - // From CMICmdArgValBase - /* dtor */ ~CMICmdArgValPrintValues() override; - // From CMICmdArgSet::IArg - bool Validate(CMICmdArgContext &vArgContext) override; - - // Methods: -private: - bool ExtractPrintValues(const CMIUtilString &vrTxt); - MIuint GetPrintValues() const; - - // Attributes: -private: - MIuint m_nPrintValues; -}; diff --git a/lldb/tools/lldb-mi/MICmdArgValPrintValues.cpp b/lldb/tools/lldb-mi/MICmdArgValPrintValues.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValPrintValues.cpp +++ /dev/null @@ -1,125 +0,0 @@ -//===-- MICmdArgValPrintValues.cpp ------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgValPrintValues.h" -#include "MICmdArgContext.h" - -//++ -// Details: CMICmdArgValPrintValues constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValPrintValues::CMICmdArgValPrintValues() : m_nPrintValues(0) {} - -//++ -// Details: CMICmdArgValPrintValues constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// Return: None. -// Throws: None. -//-- -CMICmdArgValPrintValues::CMICmdArgValPrintValues(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd) - : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd), - m_nPrintValues(0) {} - -//++ -// Details: CMICmdArgValPrintValues destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValPrintValues::~CMICmdArgValPrintValues() {} - -//++ -// Details: Parse the command's argument options string and try to extract the -// value *this -// argument is looking for. -// Type: Overridden. -// Args: vwArgContext - (RW) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValPrintValues::Validate(CMICmdArgContext &vwArgContext) { - if (vwArgContext.IsEmpty()) - return m_bMandatory ? MIstatus::failure : MIstatus::success; - - const CMIUtilString strArg(vwArgContext.GetArgs()[0]); - if (IsArgPrintValues(strArg) && ExtractPrintValues(strArg)) { - m_bFound = true; - m_bValid = true; - m_argValue = GetPrintValues(); - vwArgContext.RemoveArg(strArg); - return MIstatus::success; - } - - return MIstatus::failure; -} - -//++ -// Details: Examine the string and determine if it is a valid string type -// argument. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValPrintValues::IsArgPrintValues( - const CMIUtilString &vrTxt) const { - return (CMIUtilString::Compare(vrTxt, "0") || - CMIUtilString::Compare(vrTxt, "--no-values") || - CMIUtilString::Compare(vrTxt, "1") || - CMIUtilString::Compare(vrTxt, "--all-values") || - CMIUtilString::Compare(vrTxt, "2") || - CMIUtilString::Compare(vrTxt, "--simple-values")); -} - -//++ -// Details: Extract the print-values from the print-values argument. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValPrintValues::ExtractPrintValues(const CMIUtilString &vrTxt) { - if (CMIUtilString::Compare(vrTxt, "0") || - CMIUtilString::Compare(vrTxt, "--no-values")) - m_nPrintValues = 0; - else if (CMIUtilString::Compare(vrTxt, "1") || - CMIUtilString::Compare(vrTxt, "--all-values")) - m_nPrintValues = 1; - else if (CMIUtilString::Compare(vrTxt, "2") || - CMIUtilString::Compare(vrTxt, "--simple-values")) - m_nPrintValues = 2; - else - return MIstatus::failure; - - return MIstatus::success; -} - -//++ -// Details: Retrieve the print-values found in the argument. -// Type: Method. -// Args: None. -// Return: MIuint - The print-values. -// Throws: None. -//-- -MIuint CMICmdArgValPrintValues::GetPrintValues() const { - return m_nPrintValues; -} diff --git a/lldb/tools/lldb-mi/MICmdArgValString.h b/lldb/tools/lldb-mi/MICmdArgValString.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValString.h +++ /dev/null @@ -1,82 +0,0 @@ -//===-- MICmdArgValString.h -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmdArgValBase.h" - -// Declarations: -class CMICmdArgContext; - -//++ -//============================================================================ -// Details: MI common code class. Command argument class. Arguments object -// needing specialization derived from the CMICmdArgValBase class. -// An argument knows what type of argument it is and how it is to -// interpret the options (context) string to find and validate a -// matching -// argument and so extract a value from it . -// Based on the Interpreter pattern. -//-- -class CMICmdArgValString : public CMICmdArgValBaseTemplate { - // Methods: -public: - /* ctor */ CMICmdArgValString(); - /* ctor */ CMICmdArgValString(const bool vbAnything); - /* ctor */ CMICmdArgValString(const bool vbHandleQuotes, - const bool vbAcceptNumbers, - const bool vbHandleDirPaths); - /* ctor */ CMICmdArgValString(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const bool vbHandleQuotes = false, - const bool vbAcceptNumbers = false); - /* ctor */ CMICmdArgValString(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const bool vbHandleQuotes, - const bool vbAcceptNumbers, - const bool vbHandleDirPaths); - // - bool IsStringArg(const CMIUtilString &vrTxt) const; - - // Overridden: -public: - // From CMICmdArgValBase - /* dtor */ ~CMICmdArgValString() override; - // From CMICmdArgSet::IArg - bool Validate(CMICmdArgContext &vrwArgContext) override; - - // Methods: -private: - bool ValidateSingleText(CMICmdArgContext &vrwArgContext); - bool ValidateQuotedText(CMICmdArgContext &vrwArgContext); - bool ValidateQuotedTextEmbedded(CMICmdArgContext &vrwArgContext); - bool ValidateQuotedQuotedTextEmbedded(CMICmdArgContext &vrwArgContext); - bool IsStringArgSingleText(const CMIUtilString &vrTxt) const; - bool IsStringArgQuotedText(const CMIUtilString &vrTxt) const; - bool IsStringArgQuotedTextEmbedded(const CMIUtilString &vrTxt) const; - bool IsStringArgQuotedQuotedTextEmbedded(const CMIUtilString &vrTxt) const; - - // Attribute: -private: - bool m_bHandleQuotedString; // True = Parse a string surrounded by quotes - // spaces are not delimiters, false = only text up - // to next - // delimiting space character - bool m_bAcceptNumbers; // True = Parse a string and accept as a number if - // number, false = numbers not recognised as string - // types - bool m_bHandleDirPaths; // True = Parse a string and accept directory file - // style string if present, false = directory file - // path not - // accepted - bool m_bHandleAnything; // True = Parse a string and accept anything if - // present, false = validate for criteria matches -}; diff --git a/lldb/tools/lldb-mi/MICmdArgValString.cpp b/lldb/tools/lldb-mi/MICmdArgValString.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValString.cpp +++ /dev/null @@ -1,380 +0,0 @@ -//===-- MICmdArgValString.cpp -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgValString.h" -#include "MICmdArgContext.h" - -//++ -// Details: CMICmdArgValString constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValString::CMICmdArgValString() - : m_bHandleQuotedString(false), m_bAcceptNumbers(false), - m_bHandleDirPaths(false), m_bHandleAnything(false) {} - -//++ -// Details: CMICmdArgValString constructor. -// Type: Method. -// Args: vbAnything - (R) True = Parse a string and accept anything, false = -// do not accept anything. -// Return: None. -// Throws: None. -//-- -CMICmdArgValString::CMICmdArgValString(const bool vbAnything) - : m_bHandleQuotedString(vbAnything), m_bAcceptNumbers(false), - m_bHandleDirPaths(false), m_bHandleAnything(vbAnything) {} - -//++ -// Details: CMICmdArgValString constructor. -// Type: Method. -// Args: vbHandleQuotes - (R) True = Parse a string surrounded by quotes -// spaces are not delimiters, false = only text up to -// next delimiting space character. -// vbAcceptNumbers - (R) True = Parse a string and accept as a -// number if number, false = numbers not recognised -// as string types. -// vbHandleDirPaths - (R) True = Parse a string and accept as a file -// path if a path, false = file paths are not -// recognised as string types. -// Return: None. -// Throws: None. -//-- -CMICmdArgValString::CMICmdArgValString(const bool vbHandleQuotes, - const bool vbAcceptNumbers, - const bool vbHandleDirPaths) - : m_bHandleQuotedString(vbHandleQuotes), m_bAcceptNumbers(vbAcceptNumbers), - m_bHandleDirPaths(vbHandleDirPaths), m_bHandleAnything(false) {} - -//++ -// Details: CMICmdArgValString constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// vbHandleQuotes - (R) True = Parse a string surrounded by quotes -// spaces are not delimiters, false = only text up to -// next delimiting space character. (Dflt = false) -// vbAcceptNumbers - (R) True = Parse a string and accept as a number -// if number, false = numbers not recognised as -// string types. (Dflt = false) -// Return: None. -// Throws: None. -//-- -CMICmdArgValString::CMICmdArgValString(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const bool vbHandleQuotes /* = false */, - const bool vbAcceptNumbers /* = false */) - : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd), - m_bHandleQuotedString(vbHandleQuotes), m_bAcceptNumbers(vbAcceptNumbers), - m_bHandleDirPaths(false), m_bHandleAnything(false) {} - -//++ -// Details: CMICmdArgValString constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// vbHandleQuotes - (R) True = Parse a string surrounded by quotes -// spaces are not delimiters, false = only text up to -// next delimiting space character. -// vbAcceptNumbers - (R) True = Parse a string and accept as a number -// if number, false = numbers not recognised as -// vbHandleDirPaths - (R) True = Parse a string and accept as a file -// path if a path, false = file paths are not -// string types. -// Return: None. -// Throws: None. -//-- -CMICmdArgValString::CMICmdArgValString(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd, - const bool vbHandleQuotes, - const bool vbAcceptNumbers, - const bool vbHandleDirPaths) - : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd), - m_bHandleQuotedString(vbHandleQuotes), m_bAcceptNumbers(vbAcceptNumbers), - m_bHandleDirPaths(vbHandleDirPaths), m_bHandleAnything(false) {} - -//++ -// Details: CMICmdArgValString destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValString::~CMICmdArgValString() {} - -//++ -// Details: Parse the command's argument options string and try to extract the -// value *this -// argument is looking for. -// Type: Overridden. -// Args: vrwArgContext - (RW) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValString::Validate(CMICmdArgContext &vrwArgContext) { - if (vrwArgContext.IsEmpty()) - return m_bMandatory ? MIstatus::failure : MIstatus::success; - - if (m_bHandleQuotedString) - return ValidateQuotedText(vrwArgContext); - - return ValidateSingleText(vrwArgContext); -} - -//++ -// Details: Parse the command's argument options string and try to extract only -// the next -// word delimited by the next space. -// Type: Method. -// Args: vrwArgContext - (RW) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValString::ValidateSingleText(CMICmdArgContext &vrwArgContext) { - const CMIUtilString::VecString_t vecOptions(vrwArgContext.GetArgs()); - CMIUtilString::VecString_t::const_iterator it = vecOptions.begin(); - while (it != vecOptions.end()) { - const CMIUtilString &rArg(*it); - if (IsStringArg(rArg)) { - m_bFound = true; - - if (vrwArgContext.RemoveArg(rArg)) { - m_bValid = true; - m_argValue = rArg.StripSlashes(); - return MIstatus::success; - } else - return MIstatus::failure; - } - - // Next - ++it; - } - - return MIstatus::failure; -} - -//++ -// Details: Parse the command's argument options string and try to extract all -// the words -// between quotes then delimited by the next space. -// Type: Method. -// Args: vrwArgContext - (RW) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValString::ValidateQuotedText(CMICmdArgContext &vrwArgContext) { - const CMIUtilString::VecString_t vecOptions(vrwArgContext.GetArgs()); - if (vecOptions.size() == 0) - return MIstatus::failure; - - const CMIUtilString &rArg(vecOptions[0]); - if (!IsStringArg(rArg)) - return MIstatus::failure; - - m_bFound = true; - - if (vrwArgContext.RemoveArg(rArg)) { - m_bValid = true; - const char cQuote = '"'; - m_argValue = rArg.Trim(cQuote).StripSlashes(); - return MIstatus::success; - } - - return MIstatus::failure; -} - -//++ -// Details: Examine the string and determine if it is a valid string type -// argument. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValString::IsStringArg(const CMIUtilString &vrTxt) const { - if (m_bHandleQuotedString) - return (IsStringArgQuotedText(vrTxt) || - IsStringArgQuotedTextEmbedded(vrTxt) || - IsStringArgQuotedQuotedTextEmbedded(vrTxt) || - IsStringArgSingleText( - vrTxt)); // Still test for this as could just be one word still - - return IsStringArgSingleText(vrTxt); -} - -//++ -// Details: Examine the string and determine if it is a valid string type -// argument or -// option value. If the string looks like a long option, short option, -// a thread -// group ID or just a number it is rejected as a string type value. -// There is an -// option to allow the string to accept a number as a string type. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid argument value, false = something else. -// Throws: None. -//-- -bool CMICmdArgValString::IsStringArgSingleText( - const CMIUtilString &vrTxt) const { - if (!m_bHandleDirPaths) { - // Look for directory file paths, if found reject - const bool bHavePosSlash = (vrTxt.find('/') != std::string::npos); - const bool bHaveBckSlash = (vrTxt.find('\\') != std::string::npos); - if (bHavePosSlash || bHaveBckSlash) - return false; - } - - // Look for --someLongOption, if found reject - if (0 == vrTxt.find("--")) - return false; - - // Look for -f type short options, if found reject - if ((0 == vrTxt.find('-')) && (vrTxt.length() == 2)) - return false; - - // Look for thread group i1 i2 i3...., if found reject - if ((vrTxt.find('i') == 0) && ::isdigit(vrTxt[1])) - return false; - - // Look for numbers, if found reject - if (!m_bAcceptNumbers && vrTxt.IsNumber()) - return false; - - return true; -} - -//++ -// Details: Examine the string and determine if it is a valid string type -// argument. -// Take into account quotes surrounding the text. Note this function -// falls -// through to IsStringArgSingleText() should the criteria match fail. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValString::IsStringArgQuotedText( - const CMIUtilString &vrTxt) const { - // Accept anything as string word - if (m_bHandleAnything) - return true; - - // CODETAG_QUOTEDTEXT_SIMILAR_CODE - const char cQuote = '"'; - const size_t nPos = vrTxt.find(cQuote); - if (nPos == std::string::npos) - return false; - - // Is one and only quote at end of the string - if (nPos == (vrTxt.length() - 1)) - return false; - - // Quote must be the first character in the string or be preceded by a space - // Also check for embedded string formating quote - const char cBckSlash = '\\'; - const char cSpace = ' '; - if ((nPos > 1) && (vrTxt[nPos - 1] == cBckSlash) && - (vrTxt[nPos - 2] != cSpace)) { - return false; - } - if ((nPos > 0) && (vrTxt[nPos - 1] != cSpace)) - return false; - - // Need to find the other quote - const size_t nPos2 = vrTxt.rfind(cQuote); - if (nPos2 == std::string::npos) - return false; - - // Make sure not same quote, need two quotes - if (nPos == nPos2) - return MIstatus::failure; - - return true; -} - -//++ -// Details: Examine the string and determine if it is a valid string type -// argument. -// Take into account quotes surrounding the text. Take into account -// string format -// embedded quotes surrounding the text i.e. "\\\"%5d\\\"". Note this -// function falls -// through to IsStringArgQuotedText() should the criteria match fail. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValString::IsStringArgQuotedTextEmbedded( - const CMIUtilString &vrTxt) const { - // CODETAG_QUOTEDTEXT_SIMILAR_CODE - const char cBckSlash = '\\'; - const size_t nPos = vrTxt.find(cBckSlash); - if (nPos == std::string::npos) - return false; - - // Slash must be the first character in the string or be preceded by a space - const char cSpace = ' '; - if ((nPos > 0) && (vrTxt[nPos - 1] != cSpace)) - return false; - - // Need to find the other matching slash - const size_t nPos2 = vrTxt.rfind(cBckSlash); - if (nPos2 == std::string::npos) - return false; - - // Make sure not same back slash, need two slashes - if (nPos == nPos2) - return MIstatus::failure; - - return false; -} - -//++ -// Details: Examine the string and determine if it is a valid string type -// argument. -// Take into account quotes surrounding the text. Take into account -// string format -// embedded quotes surrounding the text i.e. "\\\"%5d\\\"". Note this -// function falls -// through to IsStringArgQuotedTextEmbedded() should the criteria match -// fail. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValString::IsStringArgQuotedQuotedTextEmbedded( - const CMIUtilString &vrTxt) const { - const size_t nPos = vrTxt.find("\"\\\""); - if (nPos == std::string::npos) - return false; - - const size_t nPos2 = vrTxt.rfind("\\\"\""); - if (nPos2 == std::string::npos) - return false; - - const size_t nLen = vrTxt.length(); - return !((nLen > 5) && ((nPos + 2) == (nPos2 - 2))); -} diff --git a/lldb/tools/lldb-mi/MICmdArgValThreadGrp.h b/lldb/tools/lldb-mi/MICmdArgValThreadGrp.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValThreadGrp.h +++ /dev/null @@ -1,53 +0,0 @@ -//===-- MICmdArgValThreadGrp.h ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmdArgValBase.h" - -// Declarations: -class CMICmdArgContext; - -//++ -//============================================================================ -// Details: MI common code class. Command argument class. Arguments object -// needing specialization derived from the CMICmdArgValBase class. -// An argument knows what type of argument it is and how it is to -// interpret the options (context) string to find and validate a -// matching -// argument and so extract a value from it. Thread group looks like -// "i1" in the options text. -// Based on the Interpreter pattern. -//-- -class CMICmdArgValThreadGrp : public CMICmdArgValBaseTemplate { - // Methods: -public: - /* ctor */ CMICmdArgValThreadGrp(); - /* ctor */ CMICmdArgValThreadGrp(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd); - // - bool IsArgThreadGrp(const CMIUtilString &vrTxt) const; - - // Overridden: -public: - // From CMICmdArgValBase - /* dtor */ ~CMICmdArgValThreadGrp() override; - // From CMICmdArgSet::IArg - bool Validate(CMICmdArgContext &vArgContext) override; - - // Methods: -private: - bool ExtractNumber(const CMIUtilString &vrTxt); - MIuint GetNumber() const; - - // Attributes: -private: - MIuint m_nThreadGrp; -}; diff --git a/lldb/tools/lldb-mi/MICmdArgValThreadGrp.cpp b/lldb/tools/lldb-mi/MICmdArgValThreadGrp.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdArgValThreadGrp.cpp +++ /dev/null @@ -1,141 +0,0 @@ -//===-- MICmdArgValThreadGrp.cpp --------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdArgValThreadGrp.h" -#include "MICmdArgContext.h" - -//++ -// Details: CMICmdArgValThreadGrp constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValThreadGrp::CMICmdArgValThreadGrp() : m_nThreadGrp(0) {} - -//++ -// Details: CMICmdArgValThreadGrp constructor. -// Type: Method. -// Args: vrArgName - (R) Argument's name to search by. -// vbMandatory - (R) True = Yes must be present, false = optional -// argument. -// vbHandleByCmd - (R) True = Command processes *this option, false = -// not handled. -// Return: None. -// Throws: None. -//-- -CMICmdArgValThreadGrp::CMICmdArgValThreadGrp(const CMIUtilString &vrArgName, - const bool vbMandatory, - const bool vbHandleByCmd) - : CMICmdArgValBaseTemplate(vrArgName, vbMandatory, vbHandleByCmd), - m_nThreadGrp(0) {} - -//++ -// Details: CMICmdArgValThreadGrp destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdArgValThreadGrp::~CMICmdArgValThreadGrp() {} - -//++ -// Details: Parse the command's argument options string and try to extract the -// value *this -// argument is looking for. -// Type: Overridden. -// Args: vwArgContext - (RW) The command's argument options string. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValThreadGrp::Validate(CMICmdArgContext &vwArgContext) { - if (vwArgContext.IsEmpty()) - return m_bMandatory ? MIstatus::failure : MIstatus::success; - - if (vwArgContext.GetNumberArgsPresent() == 1) { - const CMIUtilString &rArg(vwArgContext.GetArgsLeftToParse()); - if (IsArgThreadGrp(rArg) && ExtractNumber(rArg)) { - m_bFound = true; - m_bValid = true; - m_argValue = GetNumber(); - vwArgContext.RemoveArg(rArg); - return MIstatus::success; - } else - return MIstatus::failure; - } - - // More than one option... - const CMIUtilString::VecString_t vecOptions(vwArgContext.GetArgs()); - CMIUtilString::VecString_t::const_iterator it = vecOptions.begin(); - while (it != vecOptions.end()) { - const CMIUtilString &rArg(*it); - if (IsArgThreadGrp(rArg) && ExtractNumber(rArg)) { - m_bFound = true; - - if (vwArgContext.RemoveArg(rArg)) { - m_bValid = true; - m_argValue = GetNumber(); - return MIstatus::success; - } else - return MIstatus::failure; - } - - // Next - ++it; - } - - return MIstatus::failure; -} - -//++ -// Details: Examine the string and determine if it is a valid string type -// argument. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: bool - True = yes valid arg, false = no. -// Throws: None. -//-- -bool CMICmdArgValThreadGrp::IsArgThreadGrp(const CMIUtilString &vrTxt) const { - // Look for i1 i2 i3.... - const MIint nPos = vrTxt.find('i'); - if (nPos != 0) - return false; - - const CMIUtilString strNum = vrTxt.substr(1); - return strNum.IsNumber(); -} - -//++ -// Details: Extract the thread group number from the thread group argument. -// Type: Method. -// Args: vrTxt - (R) Some text. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdArgValThreadGrp::ExtractNumber(const CMIUtilString &vrTxt) { - const CMIUtilString strNum = vrTxt.substr(1); - MIint64 nNumber = 0; - bool bOk = strNum.ExtractNumber(nNumber); - if (bOk) { - m_nThreadGrp = static_cast(nNumber); - } - - return bOk; -} - -//++ -// Details: Retrieve the thread group ID found in the argument. -// Type: Method. -// Args: None. -// Return: MIuint - Thread group ID. -// Throws: None. -//-- -MIuint CMICmdArgValThreadGrp::GetNumber() const { return m_nThreadGrp; } diff --git a/lldb/tools/lldb-mi/MICmdBase.h b/lldb/tools/lldb-mi/MICmdBase.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdBase.h +++ /dev/null @@ -1,193 +0,0 @@ -//===-- MICmdBase.h ---------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -#include - -#include "lldb/API/SBError.h" - -#include "MICmdArgSet.h" -#include "MICmdData.h" -#include "MICmdFactory.h" -#include "MICmdInvoker.h" -#include "MICmnBase.h" -#include "MICmnMIResultRecord.h" -#include "MICmnResources.h" -#include "MIUtilString.h" - -// Declarations: -class CMICmnLLDBDebugSessionInfo; - -//++ -//============================================================================ -// Details: MI command base class. MI commands derive from this base class. -// The Command Factory creates command objects and passes them to the -// Command Invoker. The Invoker takes ownership of any commands created -// which means it is the only object to delete them when a command is -// finished working. Commands do not delete themselves. -// There are two types of command implicitly defined by the state of -// the m_bWaitForEventFromSBDebugger flag. There is the event type -// command which registers (command fn) callbacks with the SBListener -// does some work then wakes up again when called back, does more work -// perhaps, ends, then the Invoker calls the command's Acknowledge -// function. The other type of command is one that just does some work, -// ends, then the Invoker calls the command's Acknowledge function. No -// events set up. -// A command's Execute(), Acknowledge() and event callback functions -// are -// carried out in the main thread. -// A command may use the argument derived object classes -// (CMICmdArgValBase) -// to factor handling and parsing of different types of arguments -// presented to a command. A command will produce an error should it -// be presented with arguments or options it does not understand. -//-- -class CMICmdBase : public CMICmnBase, - public CMICmdInvoker::ICmd, - public CMICmdFactory::ICmd { - // Methods: -public: - CMICmdBase(); - - // Overridden: - // From CMICmdInvoker::ICmd - const SMICmdData &GetCmdData() const override; - const CMIUtilString &GetErrorDescription() const override; - void SetCmdData(const SMICmdData &vCmdData) override; - void CmdFinishedTellInvoker() const override; - const CMIUtilString &GetMIResultRecord() const override; - const CMIUtilString &GetMIResultRecordExtra() const override; - bool HasMIResultRecordExtra() const override; - bool ParseArgs() override; - // From CMICmdFactory::ICmd - const CMIUtilString &GetMiCmd() const override; - CMICmdFactory::CmdCreatorFnPtr GetCmdCreatorFn() const override; - - virtual MIuint GetGUID(); - void AddCommonArgs(); - - // Overrideable: - ~CMICmdBase() override; - virtual bool GetExitAppOnCommandFailure() const; - - // Methods: -protected: - void SetError(const CMIUtilString &rErrMsg); - bool HandleSBError(const lldb::SBError &error, - const std::function &successHandler = - [] { return MIstatus::success; }, - const std::function &errorHandler = [] {}); - bool HandleSBErrorWithSuccess(const lldb::SBError &error, - const std::function &successHandler); - bool HandleSBErrorWithFailure(const lldb::SBError &error, - const std::function &errorHandler); - template T *GetOption(const CMIUtilString &vStrOptionName); - bool ParseValidateCmdOptions(); - - // Attributes: - CMICmdFactory::CmdCreatorFnPtr m_pSelfCreatorFn; - CMIUtilString m_strCurrentErrDescription; // Reason for Execute or Acknowledge - // function failure - SMICmdData m_cmdData; // Holds information/status of *this command. Used by - // other MI code to report or determine state of a - // command. - bool m_bWaitForEventFromSBDebugger; // True = yes event type command wait, - // false = command calls Acknowledge() - // straight after Execute() - // no waiting - CMIUtilString - m_strMiCmd; // The MI text identifying *this command i.e. 'break-insert' - CMICmnMIResultRecord m_miResultRecord; // This is completed in the - // Acknowledge() function and returned - // to the Command Invoker to proceed - // stdout output. Each command forms 1 response to its input. - CMIUtilString m_miResultRecordExtra; // This is completed in the Acknowledge() - // function and returned to the Command - // Invoker to proceed - // stdout output. Hack command produce more response text to help the client - // because of using LLDB - CMICmnLLDBDebugSessionInfo &m_rLLDBDebugSessionInfo; // Access to command - // sharing information or - // data across any and - // all command based - // derived classes. - bool m_bHasResultRecordExtra; // True = Yes command produced additional MI - // output to its 1 line response, false = no - // extra MI output - // formed. - CMICmdArgSet m_setCmdArgs; // The list of arguments *this command needs to - // parse from the options string to carry out work. - const CMIUtilString m_constStrArgThreadGroup; - const CMIUtilString m_constStrArgThread; - const CMIUtilString m_constStrArgFrame; - const CMIUtilString m_constStrArgConsume; - - // These 3 members can be used by the derived classes to make any of - // "thread", "frame" or "thread-group" mandatory. - bool m_ThreadGrpArgMandatory; - bool m_ThreadArgMandatory; - bool m_FrameArgMandatory; -}; - -//++ -// Details: Retrieve the command argument or option object pointer so that it -// can be -// examined. If the option found and valid get the value (number, -// string or list -// - see CMICmdArgValBase class) from it to use with the command's -// decision -// making. If the argument is not found the command's error description -// is set -// describing the error condition. -// Type: Template method. -// Args: vStrOptionName - (R) The text name of the argument or option to -// search for in -// the list of the command's possible arguments -// or options. -// Return: T * - CMICmdArgValBase derived object. -// - nullptr = function has failed, unable to retrieve the -// option/arg object. -// Throws: None. -//-- -template -T *CMICmdBase::GetOption(const CMIUtilString &vStrOptionName) { - CMICmdArgValBase *pPtrBase = nullptr; - if (!m_setCmdArgs.GetArg(vStrOptionName, pPtrBase)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - vStrOptionName.c_str())); - return nullptr; - } - - return static_cast(pPtrBase); -} - -//++ -// Details: Retrieve the command argument or option object pointer using -// template function -// CMICmdBase::GetOption(). Should the argument (by name) not be found -// the -// command will exit with a failure (set in GetOption()). -// Type: Preprocessor macro. -// Args: a - (R) The actual variable's name. -// b - (R) The type of variable (appended to CMICmdArgVal i.e. -// CMICmdArgValString). -// c - (R) The text name of the argument or option to search for in -// the list of -// the command's possible arguments or options. -// Return: T * - CMICmdArgValBase derived object. -// - nullptr = function has failed, unable to retrieve the -// option/arg object. -// Throws: None. -//-- -#define CMICMDBASE_GETOPTION(a, b, c) \ - CMICmdArgVal##b *a = CMICmdBase::GetOption(c); \ - if (a == nullptr) \ - return MIstatus::failure; -// This comment is to stop compile warning for #define diff --git a/lldb/tools/lldb-mi/MICmdBase.cpp b/lldb/tools/lldb-mi/MICmdBase.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdBase.cpp +++ /dev/null @@ -1,329 +0,0 @@ -//===-- MICmdBase.cpp -------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdBase.h" -#include "MICmdArgValConsume.h" -#include "MICmdArgValOptionLong.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnMIValueConst.h" - -//++ -// Details: CMICmdBase constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdBase::CMICmdBase() - : m_pSelfCreatorFn(nullptr), - m_rLLDBDebugSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()), - m_bHasResultRecordExtra(false), m_constStrArgThreadGroup("thread-group"), - m_constStrArgThread("thread"), m_constStrArgFrame("frame"), - m_constStrArgConsume("--"), m_ThreadGrpArgMandatory(false), - m_ThreadArgMandatory(false), m_FrameArgMandatory(false) {} - -//++ -// Details: CMICmdBase destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdBase::~CMICmdBase() {} - -//++ -// Details: The invoker requires this function. -// Type: Overridden. -// Args: None. -// Return: SMICmdData & - *this command's present status/data/information. -// Throws: None. -//-- -const SMICmdData &CMICmdBase::GetCmdData() const { return m_cmdData; } - -//++ -// Details: The invoker requires this function. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString & - *this command's current error description. -// Empty string indicates command status ok. -// Throws: None. -//-- -const CMIUtilString &CMICmdBase::GetErrorDescription() const { - return m_strCurrentErrDescription; -} - -//++ -// Details: The CMICmdFactory requires this function. Retrieve the command and -// argument -// options description string. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString & - Command description. -// Throws: None. -//-- -const CMIUtilString &CMICmdBase::GetMiCmd() const { return m_strMiCmd; } - -//++ -// Details: Help parse the arguments that are common to all commands. -// Args: None. -// Return: None -// Throws: None. -//-- -void CMICmdBase::AddCommonArgs() { - m_setCmdArgs.Add(new CMICmdArgValOptionLong( - m_constStrArgThreadGroup, m_ThreadGrpArgMandatory, true, - CMICmdArgValListBase::eArgValType_ThreadGrp, 1)); - m_setCmdArgs.Add(new CMICmdArgValOptionLong( - m_constStrArgThread, m_ThreadArgMandatory, true, - CMICmdArgValListBase::eArgValType_Number, 1)); - m_setCmdArgs.Add( - new CMICmdArgValOptionLong(m_constStrArgFrame, m_FrameArgMandatory, true, - CMICmdArgValListBase::eArgValType_Number, 1)); - m_setCmdArgs.Add(new CMICmdArgValConsume(m_constStrArgConsume, false)); -} - -//++ -// Details: The invoker requires this function. A command must be given working -// data and -// provide data about its status or provide information to other -// objects. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmdBase::SetCmdData(const SMICmdData &vCmdData) { - m_cmdData = vCmdData; -} - -//++ -// Details: The command factory requires this function. The factory calls this -// function -// so it can obtain *this command's creation function. -// Type: Overridden. -// Args: None. -// Return: CMICmdFactory::CmdCreatorFnPtr - Function pointer. -// Throws: None. -//-- -CMICmdFactory::CmdCreatorFnPtr CMICmdBase::GetCmdCreatorFn() const { - return m_pSelfCreatorFn; -} - -//++ -// Details: If a command is an event type (has callbacks registered with -// SBListener) it -// needs to inform the Invoker that it has finished its work so that -// the -// Invoker can tidy up and call the commands Acknowledge function (yes -// the -// command itself could call the Acknowledge itself but not doing that -// way). -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmdBase::CmdFinishedTellInvoker() const { - CMICmdInvoker::Instance().CmdExecuteFinished(const_cast(*this)); -} - -//++ -// Details: Returns the final version of the MI result record built up in the -// command's -// Acknowledge function. The one line text of MI result. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString & - MI text version of the MI result record. -// Throws: None. -//-- -const CMIUtilString &CMICmdBase::GetMIResultRecord() const { - return m_miResultRecord.GetString(); -} - -//++ -// Details: Retrieve from the command additional MI result to its 1 line -// response. -// Because of using LLDB additional 'fake'/hack output is sometimes -// required to -// help the driver client operate i.e. Eclipse. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString & - MI text version of the MI result record. -// Throws: None. -//-- -const CMIUtilString &CMICmdBase::GetMIResultRecordExtra() const { - return m_miResultRecordExtra; -} - -//++ -// Details: Hss *this command got additional MI result to its 1 line response. -// Because of using LLDB additional 'fake'/hack output is sometimes -// required to -// help the driver client operate i.e. Eclipse. -// Type: Overridden. -// Args: None. -// Return: bool - True = Yes have additional MI output, false = no nothing -// extra. -// Throws: None. -//-- -bool CMICmdBase::HasMIResultRecordExtra() const { - return m_bHasResultRecordExtra; -} - -//++ -// Details: Short cut function to enter error information into the command's -// metadata -// object and set the command's error status. -// Type: Method. -// Args: rErrMsg - (R) Status description. -// Return: None. -// Throws: None. -//-- -void CMICmdBase::SetError(const CMIUtilString &rErrMsg) { - m_cmdData.bCmdValid = false; - m_cmdData.strErrorDescription = rErrMsg; - m_cmdData.bCmdExecutedSuccessfully = false; - - const CMICmnMIValueResult valueResult("msg", CMICmnMIValueConst(rErrMsg)); - const CMICmnMIResultRecord miResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - valueResult); - m_miResultRecord = miResultRecord; - m_cmdData.strMiCmdResultRecord = miResultRecord.GetString(); -} - -//++ -// Details: Short cut function to check MI command's execute status and -// set an error in case of failure. -// Type: Method. -// Args: error - (R) Error description object. -// successHandler - (R) function describing actions to execute -// in case of success state of passed SBError object. -// errorHandler - (R) function describing actions to execute -// in case of fail status of passed SBError object. -// Return: bool. -// Throws: None. -//-- -bool CMICmdBase::HandleSBError(const lldb::SBError &error, - const std::function &successHandler, - const std::function &errorHandler) { - if (error.Success()) - return successHandler(); - - SetError(error.GetCString()); - errorHandler(); - return MIstatus::failure; -} - -//++ -// Details: Short cut function to check MI command's execute status and -// call specified handler function for success case. -// Type: Method. -// Args: error - (R) Error description object. -// successHandler - (R) function describing actions to execute -// in case of success state of passed SBError object. -// Return: bool. -// Throws: None. -//-- -bool CMICmdBase::HandleSBErrorWithSuccess( - const lldb::SBError &error, - const std::function &successHandler) { - return HandleSBError(error, successHandler); -} - -//++ -// Details: Short cut function to check MI command's execute status and -// call specified handler function for error case. -// Type: Method. -// Args: error - (R) Error description object. -// errorHandler - (R) function describing actions to execute -// in case of fail status of passed SBError object. -// Return: bool. -// Throws: None. -//-- -bool CMICmdBase::HandleSBErrorWithFailure( - const lldb::SBError &error, - const std::function &errorHandler) { - return HandleSBError(error, [] { return MIstatus::success; }, errorHandler); -} - -//++ -// Details: Ask a command to provide its unique identifier. -// Type: Method. -// Args: A unique identifier for this command class. -// Return: None. -// Throws: None. -//-- -MIuint CMICmdBase::GetGUID() { - MIuint64 vptr = reinterpret_cast(this); - MIuint id = (vptr)&0xFFFFFFFF; - id ^= (vptr >> 32) & 0xFFFFFFFF; - - return id; -} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdBase::ParseArgs() { - // Do nothing - override to implement - - return MIstatus::success; -} - -//++ -// Details: Having previously given CMICmdArgSet m_setCmdArgs all the argument -// or option -// definitions for the command to handle proceed to parse and validate -// the -// command's options text for those arguments and extract the values -// for each if -// any. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdBase::ParseValidateCmdOptions() { - CMICmdArgContext argCntxt(m_cmdData.strMiCmdOption); - if (m_setCmdArgs.Validate(m_cmdData.strMiCmd, argCntxt)) - return MIstatus::success; - - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_ARGS), - m_cmdData.strMiCmd.c_str(), - m_setCmdArgs.GetErrorDescription().c_str())); - - return MIstatus::failure; -} - -//++ -// Details: If the MI Driver is not operating via a client i.e. Eclipse but say -// operating -// on a executable passed in as a argument to the drive then what -// should the driver -// do on a command failing? Either continue operating or exit the -// application. -// Override this function where a command failure cannot allow the -// driver to -// continue operating. -// Type: Overrideable. -// Args: None. -// Return: bool - True = Fatal if command fails, false = can continue if -// command fails. -// Throws: None. -//-- -bool CMICmdBase::GetExitAppOnCommandFailure() const { return false; } diff --git a/lldb/tools/lldb-mi/MICmdCmd.h b/lldb/tools/lldb-mi/MICmdCmd.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmd.h +++ /dev/null @@ -1,90 +0,0 @@ -//===-- MICmdCmd.h ----------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdEnablePrettyPrinting interface. -// CMICmdCmdSource interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -/* -MI commands implemented are: - See MICmdCommands.cpp -*/ - -#pragma once - -// Third party headers: -#include "lldb/API/SBBreakpoint.h" -#include "lldb/API/SBCommandReturnObject.h" -#include - -// In-house headers: -#include "MICmdBase.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "enable-pretty-printing". -// Enables Python base pretty printing. -// Ref: -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Variable-Objects.html -//-- -class CMICmdCmdEnablePrettyPrinting : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdEnablePrettyPrinting(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdEnablePrettyPrinting() override; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "source". -//-- -class CMICmdCmdSource : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdSource(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdSource() override; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmd.cpp b/lldb/tools/lldb-mi/MICmdCmd.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmd.cpp +++ /dev/null @@ -1,158 +0,0 @@ -//===-- MICmdCmd.cpp --------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdEnablePrettyPrinting implementation. -// CMICmdCmdSource implementation. -// - -// In-house headers: -#include "MICmdCmd.h" - -//++ -// Details: CMICmdCmdEnablePrettyPrinting constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdEnablePrettyPrinting::CMICmdCmdEnablePrettyPrinting() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "enable-pretty-printing"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdEnablePrettyPrinting::CreateSelf; -} - -//++ -// Details: CMICmdCmdEnablePrettyPrinting destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdEnablePrettyPrinting::~CMICmdCmdEnablePrettyPrinting() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdEnablePrettyPrinting::Execute() { - // Do nothing - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdEnablePrettyPrinting::Acknowledge() { - const CMICmnMIValueConst miValueConst("0"); - const CMICmnMIValueResult miValueResult("supported", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdEnablePrettyPrinting::CreateSelf() { - return new CMICmdCmdEnablePrettyPrinting(); -} - - -//++ -// Details: CMICmdCmdSource constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdSource::CMICmdCmdSource() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "source"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdSource::CreateSelf; -} - -//++ -// Details: CMICmdCmdSource destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdSource::~CMICmdCmdSource() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdSource::Execute() { - // Do nothing - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdSource::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdSource::CreateSelf() { return new CMICmdCmdSource(); } diff --git a/lldb/tools/lldb-mi/MICmdCmdBreak.h b/lldb/tools/lldb-mi/MICmdCmdBreak.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdBreak.h +++ /dev/null @@ -1,262 +0,0 @@ -//===-- MICmdCmdBreak.h -----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdBreakInsert interface. -// CMICmdCmdBreakDelete interface. -// CMICmdCmdBreakDisable interface. -// CMICmdCmdBreakEnable interface. -// CMICmdCmdBreakAfter interface. -// CMICmdCmdBreakCondition interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// Third party headers: -#include "lldb/API/SBBreakpoint.h" - -// In-house headers: -#include "MICmdBase.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "break-insert". -// This command does not follow the MI documentation exactly. -//-- -class CMICmdCmdBreakInsert : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdBreakInsert(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdBreakInsert() override; - - // Enumerations: -private: - //++ =================================================================== - // Details: The type of break point give in the MI command text. - //-- - enum BreakPoint_e { - eBreakPoint_Invalid = 0, - eBreakPoint_ByFileLine, - eBreakPoint_ByFileFn, - eBreakPoint_ByName, - eBreakPoint_ByAddress, - eBreakPoint_count, - eBreakPoint_NotDefineYet - }; - - // Attributes: -private: - bool m_bBrkPtIsTemp; - bool m_bHaveArgOptionThreadGrp; - CMIUtilString m_brkName; - CMIUtilString m_strArgOptionThreadGrp; - lldb::SBBreakpoint m_brkPt; - bool m_bBrkPtIsPending; - MIuint m_nBrkPtIgnoreCount; - bool m_bBrkPtEnabled; - bool m_bBrkPtCondition; - CMIUtilString m_brkPtCondition; - bool m_bBrkPtThreadId; - MIuint m_nBrkPtThreadId; - const CMIUtilString m_constStrArgNamedTempBrkPt; - const CMIUtilString m_constStrArgNamedHWBrkPt; // Not handled by *this command - const CMIUtilString m_constStrArgNamedPendinfBrkPt; - const CMIUtilString m_constStrArgNamedDisableBrkPt; - const CMIUtilString m_constStrArgNamedTracePt; // Not handled by *this command - const CMIUtilString m_constStrArgNamedConditionalBrkPt; - const CMIUtilString m_constStrArgNamedInoreCnt; - const CMIUtilString m_constStrArgNamedRestrictBrkPtToThreadId; - const CMIUtilString m_constStrArgNamedLocation; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "break-delete". -//-- -class CMICmdCmdBreakDelete : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdBreakDelete(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdBreakDelete() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNamedBrkPt; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "break-disable". -//-- -class CMICmdCmdBreakDisable : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdBreakDisable(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdBreakDisable() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNamedBrkPt; - bool m_bBrkPtDisabledOk; - MIuint m_nBrkPtId; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "break-enable". -//-- -class CMICmdCmdBreakEnable : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdBreakEnable(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdBreakEnable() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNamedBrkPt; - bool m_bBrkPtEnabledOk; - MIuint m_nBrkPtId; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "break-after". -//-- -class CMICmdCmdBreakAfter : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdBreakAfter(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdBreakAfter() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNamedNumber; - const CMIUtilString m_constStrArgNamedCount; - MIuint m_nBrkPtId; - MIuint m_nBrkPtCount; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "break-condition". -//-- -class CMICmdCmdBreakCondition : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdBreakCondition(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdBreakCondition() override; - - // Methods: -private: - CMIUtilString GetRestOfExpressionNotSurroundedInQuotes(); - - // Attributes: -private: - const CMIUtilString m_constStrArgNamedNumber; - const CMIUtilString m_constStrArgNamedExpr; - const CMIUtilString m_constStrArgNamedExprNoQuotes; // Not specified in MI - // spec, we need to handle - // expressions not - // surrounded by quotes - MIuint m_nBrkPtId; - CMIUtilString m_strBrkPtExpr; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdBreak.cpp b/lldb/tools/lldb-mi/MICmdCmdBreak.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdBreak.cpp +++ /dev/null @@ -1,1024 +0,0 @@ -//===-- MICmdCmdBreak.cpp ---------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdBreakInsert implementation. -// CMICmdCmdBreakDelete implementation. -// CMICmdCmdBreakDisable implementation. -// CMICmdCmdBreakEnable implementation. -// CMICmdCmdBreakAfter implementation. -// CMICmdCmdBreakCondition implementation. - -// Third Party Headers: -#include "lldb/API/SBBreakpointLocation.h" - -// In-house headers: -#include "MICmdArgValFile.h" -#include "MICmdArgValListOfN.h" -#include "MICmdArgValNumber.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValString.h" -#include "MICmdArgValThreadGrp.h" -#include "MICmdCmdBreak.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnMIOutOfBandRecord.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "MICmnStreamStdout.h" - -//++ -// Details: CMICmdCmdBreakInsert constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakInsert::CMICmdCmdBreakInsert() - : m_bBrkPtIsTemp(false), m_bBrkPtIsPending(false), m_nBrkPtIgnoreCount(0), - m_bBrkPtEnabled(false), m_bBrkPtCondition(false), m_bBrkPtThreadId(false), - m_nBrkPtThreadId(0), m_constStrArgNamedTempBrkPt("t"), - m_constStrArgNamedHWBrkPt("h"), m_constStrArgNamedPendinfBrkPt("f"), - m_constStrArgNamedDisableBrkPt("d"), m_constStrArgNamedTracePt("a"), - m_constStrArgNamedConditionalBrkPt("c"), m_constStrArgNamedInoreCnt("i"), - m_constStrArgNamedRestrictBrkPtToThreadId("p"), - m_constStrArgNamedLocation("location") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "break-insert"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdBreakInsert::CreateSelf; -} - -//++ -// Details: CMICmdCmdBreakInsert destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakInsert::~CMICmdCmdBreakInsert() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakInsert::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValOptionShort(m_constStrArgNamedTempBrkPt, false, true)); - // Not implemented m_setCmdArgs.Add(new CMICmdArgValOptionShort( - // m_constStrArgNamedHWBrkPt, false, false)); - m_setCmdArgs.Add(new CMICmdArgValOptionShort( - m_constStrArgNamedPendinfBrkPt, false, true, - CMICmdArgValListBase::eArgValType_StringQuotedNumberPath, 1)); - m_setCmdArgs.Add(new CMICmdArgValOptionShort(m_constStrArgNamedDisableBrkPt, - false, false)); - // Not implemented m_setCmdArgs.Add(new CMICmdArgValOptionShort( - // m_constStrArgNamedTracePt, false, false)); - m_setCmdArgs.Add(new CMICmdArgValOptionShort( - m_constStrArgNamedConditionalBrkPt, false, true, - CMICmdArgValListBase::eArgValType_StringQuoted, 1)); - m_setCmdArgs.Add( - new CMICmdArgValOptionShort(m_constStrArgNamedInoreCnt, false, true, - CMICmdArgValListBase::eArgValType_Number, 1)); - m_setCmdArgs.Add(new CMICmdArgValOptionShort( - m_constStrArgNamedRestrictBrkPtToThreadId, false, true, - CMICmdArgValListBase::eArgValType_Number, 1)); - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgNamedLocation, false, - true, false, false, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Helper function for CMICmdCmdBreakInsert::Execute(). -// -// Given a string, return the position of the ':' separator in 'file:func' -// or 'file:line', if any. If not found, return npos. For example, return -// 5 for 'foo.c:std::string'. -//-- -static size_t findFileSeparatorPos(const std::string &x) { - // Full paths in windows can have ':' after a drive letter, so we - // search backwards, taking care to skip C++ namespace tokens '::'. - size_t n = x.rfind(':'); - while (n != std::string::npos && n > 1 && x[n - 1] == ':') { - n = x.rfind(':', n - 2); - } - return n; -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakInsert::Execute() { - CMICMDBASE_GETOPTION(pArgTempBrkPt, OptionShort, m_constStrArgNamedTempBrkPt); - CMICMDBASE_GETOPTION(pArgThreadGroup, OptionLong, m_constStrArgThreadGroup); - CMICMDBASE_GETOPTION(pArgLocation, String, m_constStrArgNamedLocation); - CMICMDBASE_GETOPTION(pArgIgnoreCnt, OptionShort, m_constStrArgNamedInoreCnt); - CMICMDBASE_GETOPTION(pArgPendingBrkPt, OptionShort, - m_constStrArgNamedPendinfBrkPt); - CMICMDBASE_GETOPTION(pArgDisableBrkPt, OptionShort, - m_constStrArgNamedDisableBrkPt); - CMICMDBASE_GETOPTION(pArgConditionalBrkPt, OptionShort, - m_constStrArgNamedConditionalBrkPt); - CMICMDBASE_GETOPTION(pArgRestrictBrkPtToThreadId, OptionShort, - m_constStrArgNamedRestrictBrkPtToThreadId); - - // Ask LLDB for the target to check if we have valid or dummy one. - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBTarget sbTarget = rSessionInfo.GetTarget(); - - m_bBrkPtEnabled = !pArgDisableBrkPt->GetFound(); - m_bBrkPtIsTemp = pArgTempBrkPt->GetFound(); - m_bHaveArgOptionThreadGrp = pArgThreadGroup->GetFound(); - if (m_bHaveArgOptionThreadGrp) { - MIuint nThreadGrp = 0; - pArgThreadGroup->GetExpectedOption( - nThreadGrp); - m_strArgOptionThreadGrp = CMIUtilString::Format("i%d", nThreadGrp); - } - - if (sbTarget == rSessionInfo.GetDebugger().GetDummyTarget()) - m_bBrkPtIsPending = true; - else { - m_bBrkPtIsPending = pArgPendingBrkPt->GetFound(); - if (!m_bBrkPtIsPending) { - CMIUtilString pending; - if (m_rLLDBDebugSessionInfo.SharedDataRetrieve("breakpoint.pending", pending)) { - m_bBrkPtIsPending = pending == "on"; - } - } - } - - if (pArgLocation->GetFound()) - m_brkName = pArgLocation->GetValue(); - else if (m_bBrkPtIsPending) { - pArgPendingBrkPt->GetExpectedOption( - m_brkName); - } - if (pArgIgnoreCnt->GetFound()) { - pArgIgnoreCnt->GetExpectedOption( - m_nBrkPtIgnoreCount); - } - m_bBrkPtCondition = pArgConditionalBrkPt->GetFound(); - if (m_bBrkPtCondition) { - pArgConditionalBrkPt->GetExpectedOption( - m_brkPtCondition); - } - m_bBrkPtThreadId = pArgRestrictBrkPtToThreadId->GetFound(); - if (m_bBrkPtCondition) { - pArgRestrictBrkPtToThreadId->GetExpectedOption( - m_nBrkPtThreadId); - } - - // Determine if break on a file line or at a function - BreakPoint_e eBrkPtType = eBreakPoint_NotDefineYet; - CMIUtilString fileName; - MIuint nFileLine = 0; - CMIUtilString strFileFn; - CMIUtilString rStrLineOrFn; - // Is the string in the form 'file:func' or 'file:line'? - // If so, find the position of the ':' separator. - const size_t nPosColon = findFileSeparatorPos(m_brkName); - if (nPosColon != std::string::npos) { - // Extract file name and line number from it - fileName = m_brkName.substr(0, nPosColon); - rStrLineOrFn = - m_brkName.substr(nPosColon + 1, m_brkName.size() - nPosColon - 1); - - if (rStrLineOrFn.empty()) - eBrkPtType = eBreakPoint_ByName; - else { - MIint64 nValue = 0; - if (rStrLineOrFn.ExtractNumber(nValue)) { - nFileLine = static_cast(nValue); - eBrkPtType = eBreakPoint_ByFileLine; - } else { - strFileFn = rStrLineOrFn; - eBrkPtType = eBreakPoint_ByFileFn; - } - } - } - - // Determine if break defined as an address - lldb::addr_t nAddress = 0; - if (eBrkPtType == eBreakPoint_NotDefineYet) { - MIint64 nValue = 0; - if (m_brkName.ExtractNumber(nValue)) { - nAddress = static_cast(nValue); - eBrkPtType = eBreakPoint_ByAddress; - } - } - - // Break defined as an function - if (eBrkPtType == eBreakPoint_NotDefineYet) { - eBrkPtType = eBreakPoint_ByName; - } - - // Ask LLDB to create a breakpoint - bool bOk = MIstatus::success; - switch (eBrkPtType) { - case eBreakPoint_ByAddress: - m_brkPt = sbTarget.BreakpointCreateByAddress(nAddress); - break; - case eBreakPoint_ByFileFn: { - lldb::SBFileSpecList module; // search in all modules - lldb::SBFileSpecList compUnit; - compUnit.Append(lldb::SBFileSpec(fileName.c_str())); - m_brkPt = - sbTarget.BreakpointCreateByName(strFileFn.c_str(), module, compUnit); - break; - } - case eBreakPoint_ByFileLine: - m_brkPt = sbTarget.BreakpointCreateByLocation(fileName.c_str(), nFileLine); - break; - case eBreakPoint_ByName: - m_brkPt = sbTarget.BreakpointCreateByName(m_brkName.c_str(), nullptr); - break; - case eBreakPoint_count: - case eBreakPoint_NotDefineYet: - case eBreakPoint_Invalid: - bOk = MIstatus::failure; - break; - } - - if (bOk) { - if (!m_bBrkPtIsPending && (m_brkPt.GetNumLocations() == 0)) { - sbTarget.BreakpointDelete(m_brkPt.GetID()); - SetError( - CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_LOCATION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), m_brkName.c_str())); - return MIstatus::failure; - } - - m_brkPt.SetEnabled(m_bBrkPtEnabled); - m_brkPt.SetIgnoreCount(m_nBrkPtIgnoreCount); - if (m_bBrkPtCondition) - m_brkPt.SetCondition(m_brkPtCondition.c_str()); - if (m_bBrkPtThreadId) - m_brkPt.SetThreadID(m_nBrkPtThreadId); - } - - // CODETAG_LLDB_BREAKPOINT_CREATION - // This is in the main thread - // Record break point information to be by LLDB event handler function - CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfo; - if (!rSessionInfo.GetBrkPtInfo(m_brkPt, sBrkPtInfo)) - return MIstatus::failure; - sBrkPtInfo.m_id = m_brkPt.GetID(); - sBrkPtInfo.m_bDisp = m_bBrkPtIsTemp; - sBrkPtInfo.m_bEnabled = m_bBrkPtEnabled; - sBrkPtInfo.m_bHaveArgOptionThreadGrp = m_bHaveArgOptionThreadGrp; - sBrkPtInfo.m_strOptThrdGrp = m_strArgOptionThreadGrp; - sBrkPtInfo.m_nTimes = m_brkPt.GetHitCount(); - sBrkPtInfo.m_strOrigLoc = m_brkName; - sBrkPtInfo.m_nIgnore = m_nBrkPtIgnoreCount; - sBrkPtInfo.m_bPending = m_bBrkPtIsPending; - sBrkPtInfo.m_bCondition = m_bBrkPtCondition; - sBrkPtInfo.m_strCondition = m_brkPtCondition; - sBrkPtInfo.m_bBrkPtThreadId = m_bBrkPtThreadId; - sBrkPtInfo.m_nBrkPtThreadId = m_nBrkPtThreadId; - - bOk = bOk && rSessionInfo.RecordBrkPtInfo(m_brkPt.GetID(), sBrkPtInfo); - if (!bOk) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_INVALID), - m_cmdData.strMiCmd.c_str(), - m_brkName.c_str())); - return MIstatus::failure; - } - - // CODETAG_LLDB_BRKPT_ID_MAX - if (m_brkPt.GetID() > (lldb::break_id_t)rSessionInfo.m_nBrkPointCntMax) { - SetError(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_BRKPT_CNT_EXCEEDED), m_cmdData.strMiCmd.c_str(), - rSessionInfo.m_nBrkPointCntMax, m_brkName.c_str())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakInsert::Acknowledge() { - // Get breakpoint information - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfo; - if (!rSessionInfo.RecordBrkPtInfoGet(m_brkPt.GetID(), sBrkPtInfo)) - return MIstatus::failure; - - // MI print - // "^done,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016" - // PRIx64 - // "\",func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",thread-groups=[\"%s\"],times=\"%d\",original-location=\"%s\"}" - CMICmnMIValueTuple miValueTuple; - if (!rSessionInfo.MIResponseFormBrkPtInfo(sBrkPtInfo, miValueTuple)) - return MIstatus::failure; - - const CMICmnMIValueResult miValueResultD("bkpt", miValueTuple); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResultD); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdBreakInsert::CreateSelf() { - return new CMICmdCmdBreakInsert(); -} - - -//++ -// Details: CMICmdCmdBreakDelete constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakDelete::CMICmdCmdBreakDelete() - : m_constStrArgNamedBrkPt("breakpoint") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "break-delete"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdBreakDelete::CreateSelf; -} - -//++ -// Details: CMICmdCmdBreakDelete destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakDelete::~CMICmdCmdBreakDelete() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakDelete::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValListOfN(m_constStrArgNamedBrkPt, true, true, - CMICmdArgValListBase::eArgValType_Number)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakDelete::Execute() { - CMICMDBASE_GETOPTION(pArgBrkPt, ListOfN, m_constStrArgNamedBrkPt); - - // ATM we only handle one break point ID - MIuint64 nBrk = UINT64_MAX; - if (!pArgBrkPt->GetExpectedOption(nBrk)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgNamedBrkPt.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - const bool bBrkPt = rSessionInfo.GetTarget().BreakpointDelete( - static_cast(nBrk)); - if (!bBrkPt) { - const CMIUtilString strBrkNum(CMIUtilString::Format("%d", nBrk)); - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_INVALID), - m_cmdData.strMiCmd.c_str(), - strBrkNum.c_str())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakDelete::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdBreakDelete::CreateSelf() { - return new CMICmdCmdBreakDelete(); -} - - -//++ -// Details: CMICmdCmdBreakDisable constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakDisable::CMICmdCmdBreakDisable() - : m_constStrArgNamedBrkPt("breakpoint"), m_bBrkPtDisabledOk(false), - m_nBrkPtId(0) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "break-disable"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdBreakDisable::CreateSelf; -} - -//++ -// Details: CMICmdCmdBreakDisable destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakDisable::~CMICmdCmdBreakDisable() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakDisable::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValListOfN(m_constStrArgNamedBrkPt, true, true, - CMICmdArgValListBase::eArgValType_Number)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakDisable::Execute() { - CMICMDBASE_GETOPTION(pArgBrkPt, ListOfN, m_constStrArgNamedBrkPt); - - // ATM we only handle one break point ID - MIuint64 nBrk = UINT64_MAX; - if (!pArgBrkPt->GetExpectedOption(nBrk)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgNamedBrkPt.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBBreakpoint brkPt = rSessionInfo.GetTarget().FindBreakpointByID( - static_cast(nBrk)); - if (brkPt.IsValid()) { - m_bBrkPtDisabledOk = true; - brkPt.SetEnabled(false); - m_nBrkPtId = nBrk; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakDisable::Acknowledge() { - if (m_bBrkPtDisabledOk) { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - const CMIUtilString strBrkPtId(CMIUtilString::Format("%d", m_nBrkPtId)); - const CMICmnMIValueConst miValueConst(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_BRKPT_INVALID), strBrkPtId.c_str())); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdBreakDisable::CreateSelf() { - return new CMICmdCmdBreakDisable(); -} - - -//++ -// Details: CMICmdCmdBreakEnable constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakEnable::CMICmdCmdBreakEnable() - : m_constStrArgNamedBrkPt("breakpoint"), m_bBrkPtEnabledOk(false), - m_nBrkPtId(0) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "break-enable"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdBreakEnable::CreateSelf; -} - -//++ -// Details: CMICmdCmdBreakEnable destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakEnable::~CMICmdCmdBreakEnable() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakEnable::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValListOfN(m_constStrArgNamedBrkPt, true, true, - CMICmdArgValListBase::eArgValType_Number)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakEnable::Execute() { - CMICMDBASE_GETOPTION(pArgBrkPt, ListOfN, m_constStrArgNamedBrkPt); - - // ATM we only handle one break point ID - MIuint64 nBrk = UINT64_MAX; - if (!pArgBrkPt->GetExpectedOption(nBrk)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgNamedBrkPt.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBBreakpoint brkPt = rSessionInfo.GetTarget().FindBreakpointByID( - static_cast(nBrk)); - if (brkPt.IsValid()) { - m_bBrkPtEnabledOk = true; - brkPt.SetEnabled(true); - m_nBrkPtId = nBrk; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakEnable::Acknowledge() { - if (m_bBrkPtEnabledOk) { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - const CMIUtilString strBrkPtId(CMIUtilString::Format("%d", m_nBrkPtId)); - const CMICmnMIValueConst miValueConst(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_BRKPT_INVALID), strBrkPtId.c_str())); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdBreakEnable::CreateSelf() { - return new CMICmdCmdBreakEnable(); -} - - -//++ -// Details: CMICmdCmdBreakAfter constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakAfter::CMICmdCmdBreakAfter() - : m_constStrArgNamedNumber("number"), m_constStrArgNamedCount("count"), - m_nBrkPtId(0), m_nBrkPtCount(0) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "break-after"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdBreakAfter::CreateSelf; -} - -//++ -// Details: CMICmdCmdBreakAfter destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakAfter::~CMICmdCmdBreakAfter() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakAfter::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValNumber(m_constStrArgNamedNumber, true, true)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgNamedCount, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakAfter::Execute() { - CMICMDBASE_GETOPTION(pArgNumber, Number, m_constStrArgNamedNumber); - CMICMDBASE_GETOPTION(pArgCount, Number, m_constStrArgNamedCount); - - m_nBrkPtId = pArgNumber->GetValue(); - m_nBrkPtCount = pArgCount->GetValue(); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBBreakpoint brkPt = rSessionInfo.GetTarget().FindBreakpointByID( - static_cast(m_nBrkPtId)); - if (brkPt.IsValid()) { - brkPt.SetIgnoreCount(m_nBrkPtCount); - - CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfo; - if (!rSessionInfo.RecordBrkPtInfoGet(m_nBrkPtId, sBrkPtInfo)) { - SetError( - CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_INFO_OBJ_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), m_nBrkPtId)); - return MIstatus::failure; - } - sBrkPtInfo.m_nIgnore = m_nBrkPtCount; - rSessionInfo.RecordBrkPtInfo(m_nBrkPtId, sBrkPtInfo); - } else { - const CMIUtilString strBrkPtId(CMIUtilString::Format("%d", m_nBrkPtId)); - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_INVALID), - m_cmdData.strMiCmd.c_str(), - strBrkPtId.c_str())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakAfter::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdBreakAfter::CreateSelf() { - return new CMICmdCmdBreakAfter(); -} - - -//++ -// Details: CMICmdCmdBreakCondition constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakCondition::CMICmdCmdBreakCondition() - : m_constStrArgNamedNumber("number"), m_constStrArgNamedExpr("expr"), - m_constStrArgNamedExprNoQuotes( - "expression not surround by quotes") // Not specified in MI spec, we - // need to handle expressions not - // surrounded by quotes - , - m_nBrkPtId(0) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "break-condition"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdBreakCondition::CreateSelf; -} - -//++ -// Details: CMICmdCmdBreakCondition destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdBreakCondition::~CMICmdCmdBreakCondition() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakCondition::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValNumber(m_constStrArgNamedNumber, true, true)); - m_setCmdArgs.Add( - new CMICmdArgValString(m_constStrArgNamedExpr, true, true, true, true)); - m_setCmdArgs.Add(new CMICmdArgValListOfN( - m_constStrArgNamedExprNoQuotes, false, false, - CMICmdArgValListBase::eArgValType_StringQuotedNumber)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakCondition::Execute() { - CMICMDBASE_GETOPTION(pArgNumber, Number, m_constStrArgNamedNumber); - CMICMDBASE_GETOPTION(pArgExpr, String, m_constStrArgNamedExpr); - - m_nBrkPtId = pArgNumber->GetValue(); - m_strBrkPtExpr = pArgExpr->GetValue(); - m_strBrkPtExpr += GetRestOfExpressionNotSurroundedInQuotes(); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBBreakpoint brkPt = rSessionInfo.GetTarget().FindBreakpointByID( - static_cast(m_nBrkPtId)); - if (brkPt.IsValid()) { - brkPt.SetCondition(m_strBrkPtExpr.c_str()); - - CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfo; - if (!rSessionInfo.RecordBrkPtInfoGet(m_nBrkPtId, sBrkPtInfo)) { - SetError( - CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_INFO_OBJ_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), m_nBrkPtId)); - return MIstatus::failure; - } - sBrkPtInfo.m_strCondition = m_strBrkPtExpr; - rSessionInfo.RecordBrkPtInfo(m_nBrkPtId, sBrkPtInfo); - } else { - const CMIUtilString strBrkPtId(CMIUtilString::Format("%d", m_nBrkPtId)); - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_INVALID), - m_cmdData.strMiCmd.c_str(), - strBrkPtId.c_str())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdBreakCondition::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdBreakCondition::CreateSelf() { - return new CMICmdCmdBreakCondition(); -} - -//++ -// Details: A breakpoint expression can be passed to *this command as: -// a single string i.e. '2' -> ok. -// a quoted string i.e. "a > 100" -> ok -// a non quoted string i.e. 'a > 100' -> not ok -// CMICmdArgValString only extracts the first space separated string, -// the "a". -// This function using the optional argument type CMICmdArgValListOfN -// collects -// the rest of the expression so that is may be added to the 'a' part -// to form a -// complete expression string i.e. "a > 100". -// If the expression value was guaranteed to be surrounded by quotes -// them this -// function would not be necessary. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Rest of the breakpoint expression. -// Throws: None. -//-- -CMIUtilString -CMICmdCmdBreakCondition::GetRestOfExpressionNotSurroundedInQuotes() { - CMIUtilString strExpression; - - CMICmdArgValListOfN *pArgExprNoQuotes = - CMICmdBase::GetOption( - m_constStrArgNamedExprNoQuotes); - if (pArgExprNoQuotes != nullptr) { - const CMICmdArgValListBase::VecArgObjPtr_t &rVecExprParts( - pArgExprNoQuotes->GetExpectedOptions()); - if (!rVecExprParts.empty()) { - CMICmdArgValListBase::VecArgObjPtr_t::const_iterator it = - rVecExprParts.begin(); - while (it != rVecExprParts.end()) { - const CMICmdArgValString *pPartExpr = - static_cast(*it); - const CMIUtilString &rPartExpr = pPartExpr->GetValue(); - strExpression += " "; - strExpression += rPartExpr; - - // Next - ++it; - } - strExpression = strExpression.Trim(); - } - } - - return strExpression; -} diff --git a/lldb/tools/lldb-mi/MICmdCmdData.h b/lldb/tools/lldb-mi/MICmdCmdData.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdData.h +++ /dev/null @@ -1,381 +0,0 @@ -//===-- MICmdCmdData.h ------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdDataEvaluateExpression interface. -// CMICmdCmdDataDisassemble interface. -// CMICmdCmdDataReadMemoryBytes interface. -// CMICmdCmdDataReadMemory interface. -// CMICmdCmdDataListRegisterNames interface. -// CMICmdCmdDataListRegisterValues interface. -// CMICmdCmdDataListRegisterChanged interface. -// CMICmdCmdDataWriteMemoryBytes interface. -// CMICmdCmdDataWriteMemory interface. -// CMICmdCmdDataInfoLine interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. -// - -#pragma once - -// Third party headers: -#include "lldb/API/SBError.h" - -// In-house headers: -#include "MICmdBase.h" -#include "MICmnLLDBDebugSessionInfoVarObj.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" -#include "MICmnMIResultRecord.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "data-evaluate-expression". -//-- -class CMICmdCmdDataEvaluateExpression : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdDataEvaluateExpression(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdDataEvaluateExpression() override; - - // Methods: -private: - bool HaveInvalidCharacterInExpression(const CMIUtilString &vrExpr, - char &vrwInvalidChar); - - // Attributes: -private: - bool m_bExpressionValid; // True = yes is valid, false = not valid - bool m_bEvaluatedExpression; // True = yes is expression evaluated, false = - // failed - lldb::SBError m_Error; // Status object, which is examined when - // m_bEvaluatedExpression is false - CMIUtilString m_strValue; - CMICmnMIValueTuple m_miValueTuple; - bool m_bFoundInvalidChar; // True = yes found unexpected character in the - // expression, false = all ok - char m_cExpressionInvalidChar; - const CMIUtilString m_constStrArgExpr; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "data-disassemble". -//-- -class CMICmdCmdDataDisassemble : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdDataDisassemble(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdDataDisassemble() override; - - // Attributes: -private: - const CMIUtilString - m_constStrArgAddrStart; // MI spec non mandatory, *this command mandatory - const CMIUtilString - m_constStrArgAddrEnd; // MI spec non mandatory, *this command mandatory - const CMIUtilString m_constStrArgMode; - CMICmnMIValueList m_miValueList; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "data-read-memory-bytes". -//-- -class CMICmdCmdDataReadMemoryBytes : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdDataReadMemoryBytes(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdDataReadMemoryBytes() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgByteOffset; - const CMIUtilString m_constStrArgAddrExpr; - const CMIUtilString m_constStrArgNumBytes; - unsigned char *m_pBufferMemory; - MIuint64 m_nAddrStart; - MIuint64 m_nAddrNumBytesToRead; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "data-read-memory". -//-- -class CMICmdCmdDataReadMemory : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdDataReadMemory(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdDataReadMemory() override; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "data-list-register-names". -//-- -class CMICmdCmdDataListRegisterNames : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdDataListRegisterNames(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdDataListRegisterNames() override; - - // Methods: -private: - lldb::SBValue GetRegister(const MIuint vRegisterIndex) const; - - // Attributes: -private: - const CMIUtilString m_constStrArgRegNo; // Not handled by *this command - CMICmnMIValueList m_miValueList; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "data-list-register-values". -//-- -class CMICmdCmdDataListRegisterValues : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdDataListRegisterValues(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdDataListRegisterValues() override; - - // Methods: -private: - lldb::SBValue GetRegister(const MIuint vRegisterIndex) const; - void AddToOutput(const MIuint vnIndex, const lldb::SBValue &vrValue, - CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veVarFormat); - - // Attributes: -private: - const CMIUtilString m_constStrArgSkip; // Not handled by *this command - const CMIUtilString m_constStrArgFormat; - const CMIUtilString m_constStrArgRegNo; - CMICmnMIValueList m_miValueList; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "data-list-changed-registers". -//-- -class CMICmdCmdDataListRegisterChanged : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdDataListRegisterChanged(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdDataListRegisterChanged() override; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "data-read-memory-bytes". -//-- -class CMICmdCmdDataWriteMemoryBytes : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdDataWriteMemoryBytes(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdDataWriteMemoryBytes() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgAddr; - const CMIUtilString m_constStrArgContents; - const CMIUtilString m_constStrArgCount; - CMIUtilString m_strContents; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "data-read-memory". -// Not specified in MI spec but Eclipse gives *this command. -//-- -class CMICmdCmdDataWriteMemory : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdDataWriteMemory(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdDataWriteMemory() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgOffset; // Not specified in MI spec but - // Eclipse gives this option. - const CMIUtilString m_constStrArgAddr; // Not specified in MI spec but Eclipse - // gives this option. - const CMIUtilString - m_constStrArgD; // Not specified in MI spec but Eclipse gives this option. - const CMIUtilString m_constStrArgNumber; // Not specified in MI spec but - // Eclipse gives this option. - const CMIUtilString m_constStrArgContents; // Not specified in MI spec but - // Eclipse gives this option. - MIuint64 m_nAddr; - CMIUtilString m_strContents; - MIuint64 m_nCount; - unsigned char *m_pBufferMemory; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "data-info-line". -// See MIExtensions.txt for details. -//-- -class CMICmdCmdDataInfoLine : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdDataInfoLine(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdDataInfoLine() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgLocation; - CMICmnMIResultRecord m_resultRecord; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdData.cpp b/lldb/tools/lldb-mi/MICmdCmdData.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdData.cpp +++ /dev/null @@ -1,1673 +0,0 @@ -//===-- MICmdCmdData.cpp ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdDataEvaluateExpression implementation. -// CMICmdCmdDataDisassemble implementation. -// CMICmdCmdDataReadMemoryBytes implementation. -// CMICmdCmdDataReadMemory implementation. -// CMICmdCmdDataListRegisterNames implementation. -// CMICmdCmdDataListRegisterValues implementation. -// CMICmdCmdDataListRegisterChanged implementation. -// CMICmdCmdDataWriteMemoryBytes implementation. -// CMICmdCmdDataWriteMemory implementation. -// CMICmdCmdDataInfoLine implementation. - -// Third Party Headers: -#include "lldb/API/SBInstruction.h" -#include "lldb/API/SBInstructionList.h" -#include "lldb/API/SBStream.h" -#include "lldb/API/SBThread.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/Twine.h" -#include -#include - -// In-house headers: -#include "MICmdArgValConsume.h" -#include "MICmdArgValListOfN.h" -#include "MICmdArgValNumber.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValString.h" -#include "MICmdArgValThreadGrp.h" -#include "MICmdCmdData.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugSessionInfoVarObj.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnLLDBProxySBValue.h" -#include "MICmnLLDBUtilSBValue.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "Platform.h" - -namespace { -CMIUtilString IntToHexAddrStr(uint32_t number) { - return CMIUtilString("0x" + llvm::Twine::utohexstr(number).str()); -} -} // namespace - -//++ -// Details: CMICmdCmdDataEvaluateExpression constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataEvaluateExpression::CMICmdCmdDataEvaluateExpression() - : m_bExpressionValid(true), m_bEvaluatedExpression(true), m_strValue("??"), - m_bFoundInvalidChar(false), m_cExpressionInvalidChar(0x00), - m_constStrArgExpr("expr") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "data-evaluate-expression"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdDataEvaluateExpression::CreateSelf; -} - -//++ -// Details: CMICmdCmdDataEvaluateExpression destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataEvaluateExpression::~CMICmdCmdDataEvaluateExpression() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataEvaluateExpression::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValString(m_constStrArgExpr, true, true, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataEvaluateExpression::Execute() { - CMICMDBASE_GETOPTION(pArgExpr, String, m_constStrArgExpr); - - const CMIUtilString &rExpression(pArgExpr->GetValue()); - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - lldb::SBThread thread = sbProcess.GetSelectedThread(); - m_bExpressionValid = (thread.GetNumFrames() > 0); - if (!m_bExpressionValid) - return MIstatus::success; - - lldb::SBFrame frame = thread.GetSelectedFrame(); - lldb::SBValue value = frame.EvaluateExpression(rExpression.c_str()); - m_Error = value.GetError(); - if (!value.IsValid() || m_Error.Fail()) - value = frame.FindVariable(rExpression.c_str()); - const CMICmnLLDBUtilSBValue utilValue(value, true); - if (!utilValue.IsValid() || utilValue.IsValueUnknown()) { - m_bEvaluatedExpression = false; - return MIstatus::success; - } - if (!utilValue.HasName()) { - if (HaveInvalidCharacterInExpression(rExpression, - m_cExpressionInvalidChar)) { - m_bFoundInvalidChar = true; - return MIstatus::success; - } - - m_strValue = rExpression; - return MIstatus::success; - } - if (rExpression.IsQuoted()) { - m_strValue = rExpression.Trim('\"'); - return MIstatus::success; - } - m_strValue = utilValue.GetValue(true).Escape().AddSlashes(); - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataEvaluateExpression::Acknowledge() { - if (m_bExpressionValid) { - if (m_bEvaluatedExpression) { - if (m_bFoundInvalidChar) { - const CMICmnMIValueConst miValueConst(CMIUtilString::Format( - "Invalid character '%c' in expression", m_cExpressionInvalidChar)); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - const CMICmnMIValueConst miValueConst(m_strValue); - const CMICmnMIValueResult miValueResult("value", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - CMIUtilString mi_error_msg = "Could not evaluate expression"; - if (const char *err_msg = m_Error.GetCString()) - mi_error_msg = err_msg; - const CMICmnMIValueConst miValueConst(mi_error_msg.Escape(true)); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - const CMICmnMIValueConst miValueConst("Invalid expression"); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdDataEvaluateExpression::CreateSelf() { - return new CMICmdCmdDataEvaluateExpression(); -} - -//++ -// Details: Examine the expression string to see if it contains invalid -// characters. -// Type: Method. -// Args: vrExpr - (R) Expression string given to *this command. -// vrwInvalidChar - (W) True = Invalid character found, false = -// nothing found. -// Return: bool - True = Invalid character found, false = nothing found. -// Throws: None. -//-- -bool CMICmdCmdDataEvaluateExpression::HaveInvalidCharacterInExpression( - const CMIUtilString &vrExpr, char &vrwInvalidChar) { - static const std::string strInvalidCharacters(";#\\"); - const size_t nInvalidCharacterOffset = - vrExpr.find_first_of(strInvalidCharacters); - const bool bFoundInvalidCharInExpression = - (nInvalidCharacterOffset != CMIUtilString::npos); - vrwInvalidChar = - bFoundInvalidCharInExpression ? vrExpr[nInvalidCharacterOffset] : 0x00; - return bFoundInvalidCharInExpression; -} - - -//++ -// Details: CMICmdCmdDataDisassemble constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataDisassemble::CMICmdCmdDataDisassemble() - : m_constStrArgAddrStart("s"), m_constStrArgAddrEnd("e"), - m_constStrArgMode("mode"), m_miValueList(true) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "data-disassemble"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdDataDisassemble::CreateSelf; -} - -//++ -// Details: CMICmdCmdDataDisassemble destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataDisassemble::~CMICmdCmdDataDisassemble() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataDisassemble::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValOptionShort( - m_constStrArgAddrStart, true, true, - CMICmdArgValListBase::eArgValType_StringQuotedNumber, 1)); - m_setCmdArgs.Add(new CMICmdArgValOptionShort( - m_constStrArgAddrEnd, true, true, - CMICmdArgValListBase::eArgValType_StringQuotedNumber, 1)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgMode, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataDisassemble::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - CMICMDBASE_GETOPTION(pArgAddrStart, OptionShort, m_constStrArgAddrStart); - CMICMDBASE_GETOPTION(pArgAddrEnd, OptionShort, m_constStrArgAddrEnd); - CMICMDBASE_GETOPTION(pArgMode, Number, m_constStrArgMode); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgThread->GetExpectedOption(nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - CMIUtilString strAddrStart; - if (!pArgAddrStart->GetExpectedOption( - strAddrStart)) { - SetError(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_DISASM_ADDR_START_INVALID), - m_cmdData.strMiCmd.c_str(), m_constStrArgAddrStart.c_str())); - return MIstatus::failure; - } - MIint64 nAddrStart = 0; - if (!strAddrStart.ExtractNumber(nAddrStart)) { - SetError(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_DISASM_ADDR_START_INVALID), - m_cmdData.strMiCmd.c_str(), m_constStrArgAddrStart.c_str())); - return MIstatus::failure; - } - - CMIUtilString strAddrEnd; - if (!pArgAddrEnd->GetExpectedOption( - strAddrEnd)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_DISASM_ADDR_END_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgAddrEnd.c_str())); - return MIstatus::failure; - } - MIint64 nAddrEnd = 0; - if (!strAddrEnd.ExtractNumber(nAddrEnd)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_DISASM_ADDR_END_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgAddrEnd.c_str())); - return MIstatus::failure; - } - const MIuint nDisasmMode = pArgMode->GetValue(); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBTarget sbTarget = rSessionInfo.GetTarget(); - lldb::addr_t lldbStartAddr = static_cast(nAddrStart); - lldb::SBInstructionList instructions = sbTarget.ReadInstructions( - lldb::SBAddress(lldbStartAddr, sbTarget), nAddrEnd - nAddrStart); - const MIuint nInstructions = instructions.GetSize(); - // Calculate the offset of first instruction so that we can generate offset - // starting at 0 - lldb::addr_t start_offset = 0; - if (nInstructions > 0) - start_offset = - instructions.GetInstructionAtIndex(0).GetAddress().GetOffset(); - - for (size_t i = 0; i < nInstructions; i++) { - const char *pUnknown = "??"; - lldb::SBInstruction instrt = instructions.GetInstructionAtIndex(i); - const char *pStrMnemonic = instrt.GetMnemonic(sbTarget); - pStrMnemonic = (pStrMnemonic != nullptr) ? pStrMnemonic : pUnknown; - const char *pStrComment = instrt.GetComment(sbTarget); - CMIUtilString strComment; - if (pStrComment != nullptr && *pStrComment != '\0') - strComment = CMIUtilString::Format("; %s", pStrComment); - lldb::SBAddress address = instrt.GetAddress(); - lldb::addr_t addr = address.GetLoadAddress(sbTarget); - const char *pFnName = address.GetFunction().GetName(); - pFnName = (pFnName != nullptr) ? pFnName : pUnknown; - lldb::addr_t addrOffSet = address.GetOffset() - start_offset; - const char *pStrOperands = instrt.GetOperands(sbTarget); - pStrOperands = (pStrOperands != nullptr) ? pStrOperands : pUnknown; - const size_t instrtSize = instrt.GetByteSize(); - - // MI "{address=\"0x%016" PRIx64 - // "\",func-name=\"%s\",offset=\"%lld\",inst=\"%s %s\"}" - const CMICmnMIValueConst miValueConst( - CMIUtilString::Format("0x%016" PRIx64, addr)); - const CMICmnMIValueResult miValueResult("address", miValueConst); - CMICmnMIValueTuple miValueTuple(miValueResult); - const CMICmnMIValueConst miValueConst2(pFnName); - const CMICmnMIValueResult miValueResult2("func-name", miValueConst2); - miValueTuple.Add(miValueResult2); - const CMICmnMIValueConst miValueConst3( - CMIUtilString::Format("%lld", addrOffSet)); - const CMICmnMIValueResult miValueResult3("offset", miValueConst3); - miValueTuple.Add(miValueResult3); - const CMICmnMIValueConst miValueConst4( - CMIUtilString::Format("%d", instrtSize)); - const CMICmnMIValueResult miValueResult4("size", miValueConst4); - miValueTuple.Add(miValueResult4); - const CMICmnMIValueConst miValueConst5( - CMIUtilString::Format("%s %s%s", pStrMnemonic, pStrOperands, - strComment.Escape(true).c_str())); - const CMICmnMIValueResult miValueResult5("inst", miValueConst5); - miValueTuple.Add(miValueResult5); - - if (nDisasmMode == 1) { - lldb::SBLineEntry lineEntry = address.GetLineEntry(); - const MIuint nLine = lineEntry.GetLine(); - const char *pFileName = lineEntry.GetFileSpec().GetFilename(); - pFileName = (pFileName != nullptr) ? pFileName : pUnknown; - // Get a full path to the file. - char pathBuffer[PATH_MAX]; - lineEntry.GetFileSpec().GetPath(pathBuffer, PATH_MAX); - - // MI "src_and_asm_line={line=\"%u\",file=\"%s\",line_asm_insn=[ ], - // fullname=\"%s\"}" - const CMICmnMIValueConst miValueConst( - CMIUtilString::Format("%u", nLine)); - const CMICmnMIValueResult miValueResult("line", miValueConst); - CMICmnMIValueTuple miValueTuple2(miValueResult); - const CMICmnMIValueConst miValueConst2(pFileName); - const CMICmnMIValueResult miValueResult2("file", miValueConst2); - miValueTuple2.Add(miValueResult2); - const CMICmnMIValueList miValueList(miValueTuple); - const CMICmnMIValueResult miValueResult3("line_asm_insn", miValueList); - miValueTuple2.Add(miValueResult3); - const CMICmnMIValueConst miValueConst5(pathBuffer); - const CMICmnMIValueResult miValueResult5("fullname", miValueConst5); - miValueTuple2.Add(miValueResult5); - const CMICmnMIValueResult miValueResult4("src_and_asm_line", - miValueTuple2); - m_miValueList.Add(miValueResult4); - } else { - m_miValueList.Add(miValueTuple); - } - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataDisassemble::Acknowledge() { - const CMICmnMIValueResult miValueResult("asm_insns", m_miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdDataDisassemble::CreateSelf() { - return new CMICmdCmdDataDisassemble(); -} - - -//++ -// Details: CMICmdCmdDataReadMemoryBytes constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataReadMemoryBytes::CMICmdCmdDataReadMemoryBytes() - : m_constStrArgByteOffset("o"), m_constStrArgAddrExpr("address"), - m_constStrArgNumBytes("count"), m_pBufferMemory(nullptr), m_nAddrStart(0), - m_nAddrNumBytesToRead(0) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "data-read-memory-bytes"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdDataReadMemoryBytes::CreateSelf; -} - -//++ -// Details: CMICmdCmdDataReadMemoryBytes destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataReadMemoryBytes::~CMICmdCmdDataReadMemoryBytes() { - if (m_pBufferMemory != nullptr) { - delete[] m_pBufferMemory; - m_pBufferMemory = nullptr; - } -} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataReadMemoryBytes::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValOptionShort(m_constStrArgByteOffset, false, true, - CMICmdArgValListBase::eArgValType_Number, 1)); - m_setCmdArgs.Add( - new CMICmdArgValString(m_constStrArgAddrExpr, true, true, true, true)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgNumBytes, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdDataReadMemoryBytes::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - CMICMDBASE_GETOPTION(pArgFrame, OptionLong, m_constStrArgFrame); - CMICMDBASE_GETOPTION(pArgAddrOffset, OptionShort, m_constStrArgByteOffset); - CMICMDBASE_GETOPTION(pArgAddrExpr, String, m_constStrArgAddrExpr); - CMICMDBASE_GETOPTION(pArgNumBytes, Number, m_constStrArgNumBytes); - - // get the --thread option value - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgThread->GetExpectedOption(nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - - // get the --frame option value - MIuint64 nFrame = UINT64_MAX; - if (pArgFrame->GetFound() && - !pArgFrame->GetExpectedOption(nFrame)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgFrame.c_str())); - return MIstatus::failure; - } - - // get the -o option value - MIuint64 nAddrOffset = 0; - if (pArgAddrOffset->GetFound() && - !pArgAddrOffset->GetExpectedOption( - nAddrOffset)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgByteOffset.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - if (!sbProcess.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - lldb::SBThread thread = (nThreadId != UINT64_MAX) - ? sbProcess.GetThreadByIndexID(nThreadId) - : sbProcess.GetSelectedThread(); - if (!thread.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - lldb::SBFrame frame = (nFrame != UINT64_MAX) ? thread.GetFrameAtIndex(nFrame) - : thread.GetSelectedFrame(); - if (!frame.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_FRAME_INVALID), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - const CMIUtilString &rAddrExpr = pArgAddrExpr->GetValue(); - lldb::SBValue addrExprValue = frame.EvaluateExpression(rAddrExpr.c_str()); - lldb::SBError error = addrExprValue.GetError(); - if (error.Fail()) { - SetError(error.GetCString()); - return MIstatus::failure; - } else if (!addrExprValue.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_EXPR_INVALID), - rAddrExpr.c_str())); - return MIstatus::failure; - } - - MIuint64 nAddrStart = 0; - if (!CMICmnLLDBProxySBValue::GetValueAsUnsigned(addrExprValue, nAddrStart)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_EXPR_INVALID), - rAddrExpr.c_str())); - return MIstatus::failure; - } - - nAddrStart += nAddrOffset; - const MIuint64 nAddrNumBytes = pArgNumBytes->GetValue(); - - m_pBufferMemory = new unsigned char[nAddrNumBytes]; - if (m_pBufferMemory == nullptr) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_MEMORY_ALLOC_FAILURE), - m_cmdData.strMiCmd.c_str(), nAddrNumBytes)); - return MIstatus::failure; - } - - const MIuint64 nReadBytes = - sbProcess.ReadMemory(static_cast(nAddrStart), - (void *)m_pBufferMemory, nAddrNumBytes, error); - if (nReadBytes != nAddrNumBytes) { - SetError(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_LLDB_ERR_NOT_READ_WHOLE_BLK), - m_cmdData.strMiCmd.c_str(), nAddrNumBytes, nAddrStart)); - return MIstatus::failure; - } - if (error.Fail()) { - lldb::SBStream err; - const bool bOk = error.GetDescription(err); - MIunused(bOk); - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_LLDB_ERR_READ_MEM_BYTES), - m_cmdData.strMiCmd.c_str(), nAddrNumBytes, - nAddrStart, err.GetData())); - return MIstatus::failure; - } - - m_nAddrStart = nAddrStart; - m_nAddrNumBytesToRead = nAddrNumBytes; - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataReadMemoryBytes::Acknowledge() { - // MI: memory=[{begin=\"0x%016" PRIx64 "\",offset=\"0x%016" PRIx64" - // \",end=\"0x%016" PRIx64 "\",contents=\" \" }]" - const CMICmnMIValueConst miValueConst( - CMIUtilString::Format("0x%016" PRIx64, m_nAddrStart)); - const CMICmnMIValueResult miValueResult("begin", miValueConst); - CMICmnMIValueTuple miValueTuple(miValueResult); - const MIuint64 nAddrOffset = 0; - const CMICmnMIValueConst miValueConst2( - CMIUtilString::Format("0x%016" PRIx64, nAddrOffset)); - const CMICmnMIValueResult miValueResult2("offset", miValueConst2); - miValueTuple.Add(miValueResult2); - const CMICmnMIValueConst miValueConst3(CMIUtilString::Format( - "0x%016" PRIx64, m_nAddrStart + m_nAddrNumBytesToRead)); - const CMICmnMIValueResult miValueResult3("end", miValueConst3); - miValueTuple.Add(miValueResult3); - - // MI: contents=\" \" - CMIUtilString strContent; - strContent.reserve((m_nAddrNumBytesToRead << 1) + 1); - for (MIuint64 i = 0; i < m_nAddrNumBytesToRead; i++) { - strContent += CMIUtilString::Format("%02hhx", m_pBufferMemory[i]); - } - const CMICmnMIValueConst miValueConst4(strContent); - const CMICmnMIValueResult miValueResult4("contents", miValueConst4); - miValueTuple.Add(miValueResult4); - const CMICmnMIValueList miValueList(miValueTuple); - const CMICmnMIValueResult miValueResult5("memory", miValueList); - - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult5); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdDataReadMemoryBytes::CreateSelf() { - return new CMICmdCmdDataReadMemoryBytes(); -} - - -//++ -// Details: CMICmdCmdDataReadMemory constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataReadMemory::CMICmdCmdDataReadMemory() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "data-read-memory"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdDataReadMemory::CreateSelf; -} - -//++ -// Details: CMICmdCmdDataReadMemory destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataReadMemory::~CMICmdCmdDataReadMemory() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataReadMemory::Execute() { - // Do nothing - command deprecated use "data-read-memory-bytes" command - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataReadMemory::Acknowledge() { - // Command CMICmdCmdSupportListFeatures sends "data-read-memory-bytes" which - // causes this command not to be called - const CMICmnMIValueConst miValueConst( - MIRSRC(IDS_CMD_ERR_NOT_IMPLEMENTED_DEPRECATED)); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdDataReadMemory::CreateSelf() { - return new CMICmdCmdDataReadMemory(); -} - - -//++ -// Details: CMICmdCmdDataListRegisterNames constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataListRegisterNames::CMICmdCmdDataListRegisterNames() - : m_constStrArgRegNo("regno"), m_miValueList(true) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "data-list-register-names"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdDataListRegisterNames::CreateSelf; -} - -//++ -// Details: CMICmdCmdDataReadMemoryBytes destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataListRegisterNames::~CMICmdCmdDataListRegisterNames() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataListRegisterNames::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValListOfN(m_constStrArgRegNo, false, false, - CMICmdArgValListBase::eArgValType_Number)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataListRegisterNames::Execute() { - CMICMDBASE_GETOPTION(pArgRegNo, ListOfN, m_constStrArgRegNo); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - if (!sbProcess.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - const CMICmdArgValListBase::VecArgObjPtr_t &rVecRegNo( - pArgRegNo->GetExpectedOptions()); - if (!rVecRegNo.empty()) { - // List of required registers - CMICmdArgValListBase::VecArgObjPtr_t::const_iterator it = rVecRegNo.begin(); - while (it != rVecRegNo.end()) { - const CMICmdArgValNumber *pRegNo = static_cast(*it); - const MIuint nRegIndex = pRegNo->GetValue(); - lldb::SBValue regValue = GetRegister(nRegIndex); - if (regValue.IsValid()) { - const CMICmnMIValueConst miValueConst( - CMICmnLLDBUtilSBValue(regValue).GetName()); - m_miValueList.Add(miValueConst); - } - - // Next - ++it; - } - } else { - // List of all registers - lldb::SBThread thread = sbProcess.GetSelectedThread(); - lldb::SBFrame frame = thread.GetSelectedFrame(); - lldb::SBValueList registers = frame.GetRegisters(); - const MIuint nRegisters = registers.GetSize(); - for (MIuint i = 0; i < nRegisters; i++) { - lldb::SBValue value = registers.GetValueAtIndex(i); - const MIuint nRegChildren = value.GetNumChildren(); - for (MIuint j = 0; j < nRegChildren; j++) { - lldb::SBValue regValue = value.GetChildAtIndex(j); - if (regValue.IsValid()) { - const CMICmnMIValueConst miValueConst( - CMICmnLLDBUtilSBValue(regValue).GetName()); - m_miValueList.Add(miValueConst); - } - } - } - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataListRegisterNames::Acknowledge() { - const CMICmnMIValueResult miValueResult("register-names", m_miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdDataListRegisterNames::CreateSelf() { - return new CMICmdCmdDataListRegisterNames(); -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Method. -// Args: None. -// Return: lldb::SBValue - LLDB SBValue object. -// Throws: None. -//-- -lldb::SBValue -CMICmdCmdDataListRegisterNames::GetRegister(const MIuint vRegisterIndex) const { - lldb::SBThread thread = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess().GetSelectedThread(); - lldb::SBFrame frame = thread.GetSelectedFrame(); - lldb::SBValueList registers = frame.GetRegisters(); - const MIuint nRegisters = registers.GetSize(); - MIuint nRegisterIndex(vRegisterIndex); - for (MIuint i = 0; i < nRegisters; i++) { - lldb::SBValue value = registers.GetValueAtIndex(i); - const MIuint nRegChildren = value.GetNumChildren(); - if (nRegisterIndex >= nRegChildren) { - nRegisterIndex -= nRegChildren; - continue; - } - - lldb::SBValue value2 = value.GetChildAtIndex(nRegisterIndex); - if (value2.IsValid()) { - return value2; - } - } - - return lldb::SBValue(); -} - - -//++ -// Details: CMICmdCmdDataListRegisterValues constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataListRegisterValues::CMICmdCmdDataListRegisterValues() - : m_constStrArgSkip("skip-unavailable"), m_constStrArgFormat("fmt"), - m_constStrArgRegNo("regno"), m_miValueList(true) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "data-list-register-values"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdDataListRegisterValues::CreateSelf; -} - -//++ -// Details: CMICmdCmdDataListRegisterValues destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataListRegisterValues::~CMICmdCmdDataListRegisterValues() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataListRegisterValues::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValOptionLong(m_constStrArgThread, false, false, - CMICmdArgValListBase::eArgValType_Number, 1)); - m_setCmdArgs.Add(new CMICmdArgValOptionLong(m_constStrArgSkip, false, false)); - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgFormat, true, true)); - m_setCmdArgs.Add( - new CMICmdArgValListOfN(m_constStrArgRegNo, false, true, - CMICmdArgValListBase::eArgValType_Number)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataListRegisterValues::Execute() { - CMICMDBASE_GETOPTION(pArgFormat, String, m_constStrArgFormat); - CMICMDBASE_GETOPTION(pArgRegNo, ListOfN, m_constStrArgRegNo); - - const CMIUtilString &rStrFormat(pArgFormat->GetValue()); - if (rStrFormat.length() != 1) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_FORMAT_TYPE), - m_cmdData.strMiCmd.c_str(), - rStrFormat.c_str())); - return MIstatus::failure; - } - const CMICmnLLDBDebugSessionInfoVarObj::varFormat_e eFormat = - CMICmnLLDBDebugSessionInfoVarObj::GetVarFormatForChar(rStrFormat[0]); - if (eFormat == CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Invalid) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_FORMAT_TYPE), - m_cmdData.strMiCmd.c_str(), - rStrFormat.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - if (!sbProcess.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - const CMICmdArgValListBase::VecArgObjPtr_t &rVecRegNo( - pArgRegNo->GetExpectedOptions()); - if (!rVecRegNo.empty()) { - // List of required registers - CMICmdArgValListBase::VecArgObjPtr_t::const_iterator it = rVecRegNo.begin(); - while (it != rVecRegNo.end()) { - const CMICmdArgValNumber *pRegNo = static_cast(*it); - const MIuint nRegIndex = pRegNo->GetValue(); - lldb::SBValue regValue = GetRegister(nRegIndex); - if (regValue.IsValid()) { - AddToOutput(nRegIndex, regValue, eFormat); - } - - // Next - ++it; - } - } else { - // No register numbers are provided. Output all registers. - lldb::SBThread thread = sbProcess.GetSelectedThread(); - lldb::SBFrame frame = thread.GetSelectedFrame(); - lldb::SBValueList registers = frame.GetRegisters(); - const MIuint nRegisters = registers.GetSize(); - MIuint nRegIndex = 0; - for (MIuint i = 0; i < nRegisters; i++) { - lldb::SBValue value = registers.GetValueAtIndex(i); - const MIuint nRegChildren = value.GetNumChildren(); - for (MIuint j = 0; j < nRegChildren; j++) { - lldb::SBValue regValue = value.GetChildAtIndex(j); - if (regValue.IsValid()) { - AddToOutput(nRegIndex, regValue, eFormat); - } - - // Next - ++nRegIndex; - } - } - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataListRegisterValues::Acknowledge() { - const CMICmnMIValueResult miValueResult("register-values", m_miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdDataListRegisterValues::CreateSelf() { - return new CMICmdCmdDataListRegisterValues(); -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Method. -// Args: None. -// Return: lldb::SBValue - LLDB SBValue object. -// Throws: None. -//-- -lldb::SBValue CMICmdCmdDataListRegisterValues::GetRegister( - const MIuint vRegisterIndex) const { - lldb::SBThread thread = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess().GetSelectedThread(); - lldb::SBFrame frame = thread.GetSelectedFrame(); - lldb::SBValueList registers = frame.GetRegisters(); - const MIuint nRegisters = registers.GetSize(); - MIuint nRegisterIndex(vRegisterIndex); - for (MIuint i = 0; i < nRegisters; i++) { - lldb::SBValue value = registers.GetValueAtIndex(i); - const MIuint nRegChildren = value.GetNumChildren(); - if (nRegisterIndex >= nRegChildren) { - nRegisterIndex -= nRegChildren; - continue; - } - - lldb::SBValue value2 = value.GetChildAtIndex(nRegisterIndex); - if (value2.IsValid()) { - return value2; - } - } - - return lldb::SBValue(); -} - -//++ -// Details: Adds the register value to the output list. -// Type: Method. -// Args: Value of the register, its index and output format. -// Return: None -// Throws: None. -//-- -void CMICmdCmdDataListRegisterValues::AddToOutput( - const MIuint vnIndex, const lldb::SBValue &vrValue, - CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veVarFormat) { - const CMICmnMIValueConst miValueConst(CMIUtilString::Format("%u", vnIndex)); - const CMICmnMIValueResult miValueResult("number", miValueConst); - CMICmnMIValueTuple miValueTuple(miValueResult); - const CMIUtilString strRegValue( - CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted(vrValue, - veVarFormat)); - const CMICmnMIValueConst miValueConst2(strRegValue); - const CMICmnMIValueResult miValueResult2("value", miValueConst2); - miValueTuple.Add(miValueResult2); - m_miValueList.Add(miValueTuple); -} - - -//++ -// Details: CMICmdCmdDataListRegisterChanged constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataListRegisterChanged::CMICmdCmdDataListRegisterChanged() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "data-list-changed-registers"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdDataListRegisterChanged::CreateSelf; -} - -//++ -// Details: CMICmdCmdDataListRegisterChanged destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataListRegisterChanged::~CMICmdCmdDataListRegisterChanged() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataListRegisterChanged::Execute() { - // Do nothing - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataListRegisterChanged::Acknowledge() { - const CMICmnMIValueConst miValueConst(MIRSRC(IDS_WORD_NOT_IMPLEMENTED)); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdDataListRegisterChanged::CreateSelf() { - return new CMICmdCmdDataListRegisterChanged(); -} - - -//++ -// Details: CMICmdCmdDataWriteMemoryBytes constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataWriteMemoryBytes::CMICmdCmdDataWriteMemoryBytes() - : m_constStrArgAddr("address"), m_constStrArgContents("contents"), - m_constStrArgCount("count") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "data-write-memory-bytes"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdDataWriteMemoryBytes::CreateSelf; -} - -//++ -// Details: CMICmdCmdDataWriteMemoryBytes destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataWriteMemoryBytes::~CMICmdCmdDataWriteMemoryBytes() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataWriteMemoryBytes::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValString(m_constStrArgAddr, true, true, false, true)); - m_setCmdArgs.Add( - new CMICmdArgValString(m_constStrArgContents, true, true, true, true)); - m_setCmdArgs.Add( - new CMICmdArgValString(m_constStrArgCount, false, true, false, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataWriteMemoryBytes::Execute() { - // Do nothing - not reproduceable (yet) in Eclipse - // CMICMDBASE_GETOPTION( pArgOffset, OptionShort, m_constStrArgOffset ); - // CMICMDBASE_GETOPTION( pArgAddr, String, m_constStrArgAddr ); - // CMICMDBASE_GETOPTION( pArgNumber, String, m_constStrArgNumber ); - // CMICMDBASE_GETOPTION( pArgContents, String, m_constStrArgContents ); - // - // Numbers extracts as string types as they could be hex numbers - // '&' is not recognised and so has to be removed - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataWriteMemoryBytes::Acknowledge() { - const CMICmnMIValueConst miValueConst(MIRSRC(IDS_WORD_NOT_IMPLEMENTED)); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdDataWriteMemoryBytes::CreateSelf() { - return new CMICmdCmdDataWriteMemoryBytes(); -} - - -//++ -// Details: CMICmdCmdDataWriteMemory constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataWriteMemory::CMICmdCmdDataWriteMemory() - : m_constStrArgOffset("o"), m_constStrArgAddr("address"), - m_constStrArgD("d"), m_constStrArgNumber("a number"), - m_constStrArgContents("contents"), m_nAddr(0), m_nCount(0), - m_pBufferMemory(nullptr) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "data-write-memory"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdDataWriteMemory::CreateSelf; -} - -//++ -// Details: CMICmdCmdDataWriteMemory destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataWriteMemory::~CMICmdCmdDataWriteMemory() { - if (m_pBufferMemory != nullptr) { - delete[] m_pBufferMemory; - m_pBufferMemory = nullptr; - } -} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataWriteMemory::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValOptionShort(m_constStrArgOffset, false, true, - CMICmdArgValListBase::eArgValType_Number, 1)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgAddr, true, true)); - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgD, true, true)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgNumber, true, true)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgContents, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataWriteMemory::Execute() { - CMICMDBASE_GETOPTION(pArgOffset, OptionShort, m_constStrArgOffset); - CMICMDBASE_GETOPTION(pArgAddr, Number, m_constStrArgAddr); - CMICMDBASE_GETOPTION(pArgNumber, Number, m_constStrArgNumber); - CMICMDBASE_GETOPTION(pArgContents, Number, m_constStrArgContents); - - MIuint nAddrOffset = 0; - if (pArgOffset->GetFound() && - !pArgOffset->GetExpectedOption(nAddrOffset)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ARGS_ERR_VALIDATION_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgAddr.c_str())); - return MIstatus::failure; - } - m_nAddr = pArgAddr->GetValue(); - m_nCount = pArgNumber->GetValue(); - const MIuint64 nValue = pArgContents->GetValue(); - - m_pBufferMemory = new unsigned char[m_nCount]; - if (m_pBufferMemory == nullptr) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_MEMORY_ALLOC_FAILURE), - m_cmdData.strMiCmd.c_str(), m_nCount)); - return MIstatus::failure; - } - *m_pBufferMemory = static_cast(nValue); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - lldb::SBError error; - lldb::addr_t addr = static_cast(m_nAddr + nAddrOffset); - const size_t nBytesWritten = sbProcess.WriteMemory( - addr, (const void *)m_pBufferMemory, (size_t)m_nCount, error); - if (nBytesWritten != static_cast(m_nCount)) { - SetError( - CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_LLDB_ERR_NOT_WRITE_WHOLEBLK), - m_cmdData.strMiCmd.c_str(), m_nCount, addr)); - return MIstatus::failure; - } - if (error.Fail()) { - lldb::SBStream err; - const bool bOk = error.GetDescription(err); - MIunused(bOk); - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_LLDB_ERR_WRITE_MEM_BYTES), - m_cmdData.strMiCmd.c_str(), m_nCount, addr, - err.GetData())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataWriteMemory::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdDataWriteMemory::CreateSelf() { - return new CMICmdCmdDataWriteMemory(); -} - - -//++ -// Details: CMICmdCmdDataInfoLine constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataInfoLine::CMICmdCmdDataInfoLine() - : m_constStrArgLocation("location"), - m_resultRecord(m_cmdData.strMiCmdToken, - CMICmnMIResultRecord::eResultClass_Done) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "data-info-line"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdDataInfoLine::CreateSelf; -} - -//++ -// Details: CMICmdCmdDataInfoLine destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdDataInfoLine::~CMICmdCmdDataInfoLine() = default; - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataInfoLine::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgLocation, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataInfoLine::Execute() { - CMICMDBASE_GETOPTION(pArgLocation, String, m_constStrArgLocation); - - lldb::SBLineEntry line; - bool found_line = false; - const CMIUtilString &strLocation(pArgLocation->GetValue()); - lldb::SBTarget target = CMICmnLLDBDebugSessionInfo::Instance().GetTarget(); - - if (strLocation.at(0) == '*') { - // Parse argument: - // *0x12345 - // ^^^^^^^^^ -- address - lldb::addr_t address = 0x0; - if (llvm::StringRef(strLocation.substr(1)).getAsInteger(0, address)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_SOME_ERROR), - m_cmdData.strMiCmd.c_str(), - "Failed to parse address.")); - return MIstatus::failure; - } - line = target.ResolveFileAddress(address).GetLineEntry(); - // Check that found line is valid. - if (line.GetLine()) - found_line = true; - } else { - const size_t nLineStartPos = strLocation.rfind(':'); - if ((nLineStartPos == std::string::npos) || (nLineStartPos == 0) || - (nLineStartPos == strLocation.length() - 1)) { - SetError(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_INVALID_LOCATION_FORMAT), - m_cmdData.strMiCmd.c_str(), strLocation.c_str())); - return MIstatus::failure; - } - // Parse argument: - // hello.cpp:5 - // ^^^^^^^^^ -- file - // ^ -- line - const CMIUtilString &strFile(strLocation.substr(0, nLineStartPos)); - uint32_t numLine = 0; - llvm::StringRef(strLocation.substr(nLineStartPos + 1)) - .getAsInteger(0, numLine); - lldb::SBSymbolContextList sc_cu_list = - target.FindCompileUnits(lldb::SBFileSpec(strFile.c_str(), false)); - for (uint32_t i = 0, e = sc_cu_list.GetSize(); i < e; ++i) { - const lldb::SBCompileUnit &cu = - sc_cu_list.GetContextAtIndex(i).GetCompileUnit(); - // Break if we have already found requested line. - if (found_line) - break; - for (uint32_t j = 0, e = cu.GetNumLineEntries(); j < e; ++j) { - const lldb::SBLineEntry &curLine = cu.GetLineEntryAtIndex(j); - if (curLine.GetLine() == numLine) { - line = curLine; - found_line = true; - break; - } - } - } - } - if (!found_line) { - SetError(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_SOME_ERROR), m_cmdData.strMiCmd.c_str(), - "The LineEntry is absent or has an unknown format.")); - return MIstatus::failure; - } - // Start address. - m_resultRecord.Add(CMICmnMIValueResult( - "start", CMICmnMIValueConst(IntToHexAddrStr( - line.GetStartAddress().GetFileAddress())))); - // End address. - m_resultRecord.Add(CMICmnMIValueResult( - "end", CMICmnMIValueConst(IntToHexAddrStr( - line.GetEndAddress().GetFileAddress())))); - // File. - std::unique_ptr upPath(new char[PATH_MAX]); - line.GetFileSpec().GetPath(upPath.get(), PATH_MAX); - m_resultRecord.Add(CMICmnMIValueResult( - "file", CMICmnMIValueConst(CMIUtilString(upPath.get())))); - // Line. - m_resultRecord.Add(CMICmnMIValueResult( - "line", CMICmnMIValueConst(std::to_string(line.GetLine())))); - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdDataInfoLine::Acknowledge() { - m_miResultRecord = m_resultRecord; - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdDataInfoLine::CreateSelf() { - return new CMICmdCmdDataInfoLine(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdEnviro.h b/lldb/tools/lldb-mi/MICmdCmdEnviro.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdEnviro.h +++ /dev/null @@ -1,57 +0,0 @@ -//===-- MICmdCmdEnviro.h ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdEnvironmentCd interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "environment-cd". -//-- -class CMICmdCmdEnvironmentCd : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdEnvironmentCd(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdEnvironmentCd() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNamePathDir; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdEnviro.cpp b/lldb/tools/lldb-mi/MICmdCmdEnviro.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdEnviro.cpp +++ /dev/null @@ -1,145 +0,0 @@ -//===-- MICmdCmdEnviro.cpp --------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdEnvironmentCd implementation. - -// In-house headers: -#include "MICmdCmdEnviro.h" -#include "MICmdArgValFile.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" - -//++ -// Details: CMICmdCmdEnvironmentCd constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdEnvironmentCd::CMICmdCmdEnvironmentCd() - : m_constStrArgNamePathDir("pathdir") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "environment-cd"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdEnvironmentCd::CreateSelf; -} - -//++ -// Details: CMICmdCmdEnvironmentCd destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdEnvironmentCd::~CMICmdCmdEnvironmentCd() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdEnvironmentCd::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValFile(m_constStrArgNamePathDir, true, true)); - CMICmdArgContext argCntxt(m_cmdData.strMiCmdOption); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdEnvironmentCd::Execute() { - CMICMDBASE_GETOPTION(pArgPathDir, File, m_constStrArgNamePathDir); - const CMIUtilString &strWkDir(pArgPathDir->GetValue()); - CMICmnLLDBDebugger &rDbg(CMICmnLLDBDebugger::Instance()); - lldb::SBDebugger &rLldbDbg = rDbg.GetTheDebugger(); - bool bOk = rLldbDbg.SetCurrentPlatformSDKRoot(strWkDir.c_str()); - if (bOk) { - const CMIUtilString &rStrKeyWkDir( - m_rLLDBDebugSessionInfo.m_constStrSharedDataKeyWkDir); - if (!m_rLLDBDebugSessionInfo.SharedDataAdd(rStrKeyWkDir, - strWkDir)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_DBGSESSION_ERR_SHARED_DATA_ADD), - m_cmdData.strMiCmd.c_str(), - rStrKeyWkDir.c_str())); - bOk = MIstatus::failure; - } - } else - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_FNFAILED), - m_cmdData.strMiCmd.c_str(), - "SetCurrentPlatformSDKRoot()")); - - lldb::SBTarget sbTarget = m_rLLDBDebugSessionInfo.GetTarget(); - if (sbTarget.IsValid()) { - lldb::SBLaunchInfo sbLaunchInfo = sbTarget.GetLaunchInfo(); - sbLaunchInfo.SetWorkingDirectory(strWkDir.c_str()); - sbTarget.SetLaunchInfo(sbLaunchInfo); - } - - return bOk; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdEnvironmentCd::Acknowledge() { - const CMIUtilString &rStrKeyWkDir( - m_rLLDBDebugSessionInfo.m_constStrSharedDataKeyWkDir); - CMIUtilString strWkDir; - const bool bOk = m_rLLDBDebugSessionInfo.SharedDataRetrieve( - rStrKeyWkDir, strWkDir); - if (bOk) { - const CMICmnMIValueConst miValueConst(strWkDir); - const CMICmnMIValueResult miValueResult("path", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_SHARED_DATA_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - rStrKeyWkDir.c_str())); - return MIstatus::failure; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdEnvironmentCd::CreateSelf() { - return new CMICmdCmdEnvironmentCd(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdExec.h b/lldb/tools/lldb-mi/MICmdCmdExec.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdExec.h +++ /dev/null @@ -1,316 +0,0 @@ -//===-- MICmdCmdExec.h ------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdExecRun interface. -// CMICmdCmdExecContinue interface. -// CMICmdCmdExecNext interface. -// CMICmdCmdExecStep interface. -// CMICmdCmdExecNextInstruction interface. -// CMICmdCmdExecStepInstruction interface. -// CMICmdCmdExecFinish interface. -// CMICmdCmdExecInterrupt interface. -// CMICmdCmdExecArguments interface. -// CMICmdCmdExecAbort interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// Third party headers: -// In-house headers: -#include "MICmdBase.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "exec-run". -//-- -class CMICmdCmdExecRun : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdExecRun(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdExecRun() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgStart; // StopAtEntry - run to first - // instruction or main() if specified -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "exec-continue". -//-- -class CMICmdCmdExecContinue : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdExecContinue(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdExecContinue() override; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "exec-next". -//-- -class CMICmdCmdExecNext : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdExecNext(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdExecNext() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNumber; // Not specified in MI spec but - // Eclipse gives this option -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "exec-step". -//-- -class CMICmdCmdExecStep : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdExecStep(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdExecStep() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNumber; // Not specified in MI spec but - // Eclipse gives this option -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "exec-next-instruction". -//-- -class CMICmdCmdExecNextInstruction : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdExecNextInstruction(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdExecNextInstruction() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNumber; // Not specified in MI spec but - // Eclipse gives this option -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "exec-step-instruction". -//-- -class CMICmdCmdExecStepInstruction : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdExecStepInstruction(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdExecStepInstruction() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNumber; // Not specified in MI spec but - // Eclipse gives this option -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "exec-finish". -//-- -class CMICmdCmdExecFinish : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdExecFinish(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdExecFinish() override; -}; - -// CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "exec-interrupt". -// Gotchas: Using Eclipse this command is injected into the command system when -// a -// SIGINT signal is received while running an inferior program. -//-- -class CMICmdCmdExecInterrupt : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdExecInterrupt(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdExecInterrupt() override; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "exec-arguments". -//-- -class CMICmdCmdExecArguments : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdExecArguments(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdExecArguments() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgArguments; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "exec-abort". -//-- -class CMICmdCmdExecAbort : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdExecAbort(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdExecAbort() override; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdExec.cpp b/lldb/tools/lldb-mi/MICmdCmdExec.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdExec.cpp +++ /dev/null @@ -1,1115 +0,0 @@ -//===-- MICmdCmdExec.cpp ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdExecRun implementation. -// CMICmdCmdExecContinue implementation. -// CMICmdCmdExecNext implementation. -// CMICmdCmdExecStep implementation. -// CMICmdCmdExecNextInstruction implementation. -// CMICmdCmdExecStepInstruction implementation. -// CMICmdCmdExecFinish implementation. -// CMICmdCmdExecInterrupt implementation. -// CMICmdCmdExecArguments implementation. -// CMICmdCmdExecAbort implementation. - -// Third Party Headers: -#include "lldb/API/SBCommandInterpreter.h" -#include "lldb/API/SBProcess.h" -#include "lldb/API/SBStream.h" -#include "lldb/API/SBThread.h" -#include "lldb/lldb-enumerations.h" - -// In-house headers: -#include "MICmdArgValListOfN.h" -#include "MICmdArgValNumber.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValString.h" -#include "MICmdArgValThreadGrp.h" -#include "MICmdCmdExec.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnMIOutOfBandRecord.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "MICmnStreamStdout.h" -#include "MIDriver.h" - -//++ -// Details: CMICmdCmdExecRun constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecRun::CMICmdCmdExecRun() : m_constStrArgStart("start") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "exec-run"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdExecRun::CreateSelf; -} - -//++ -// Details: CMICmdCmdExecRun destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecRun::~CMICmdCmdExecRun() {} - -//++ -// Details: The invoker requires this function. It parses the command line -// options' -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecRun::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValOptionLong( - m_constStrArgStart, false, true, - CMICmdArgValListBase::eArgValType_OptionLong, 0)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecRun::Execute() { - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - - { - // Check we have a valid target. - // Note: target created via 'file-exec-and-symbols' command. - lldb::SBTarget sbTarget = rSessionInfo.GetTarget(); - if (!sbTarget.IsValid() || - sbTarget == rSessionInfo.GetDebugger().GetDummyTarget()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET_CURRENT), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - } - - lldb::SBError error; - lldb::SBStream errMsg; - lldb::SBLaunchInfo launchInfo = rSessionInfo.GetTarget().GetLaunchInfo(); - launchInfo.SetListener(rSessionInfo.GetListener()); - - // Run to first instruction or main() requested? - CMICMDBASE_GETOPTION(pArgStart, OptionLong, m_constStrArgStart); - if (pArgStart->GetFound()) { - launchInfo.SetLaunchFlags(launchInfo.GetLaunchFlags() | - lldb::eLaunchFlagStopAtEntry); - } - - lldb::SBProcess process = rSessionInfo.GetTarget().Launch(launchInfo, error); - if (!process.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), - m_cmdData.strMiCmd.c_str(), - errMsg.GetData())); - return MIstatus::failure; - } - - const auto successHandler = [this] { - if (!CMIDriver::Instance().SetDriverStateRunningDebugging()) { - const CMIUtilString &rErrMsg(CMIDriver::Instance().GetErrorDescription()); - SetError(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE), - m_cmdData.strMiCmd.c_str(), rErrMsg.c_str())); - return MIstatus::failure; - } - return MIstatus::success; - }; - - return HandleSBErrorWithSuccess(error, successHandler); -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Called only if Execute() set status as successful on completion. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecRun::Acknowledge() { - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID(); - // Give the client '=thread-group-started,id="i1" pid="xyz"' - m_bHasResultRecordExtra = true; - const CMICmnMIValueConst miValueConst2("i1"); - const CMICmnMIValueResult miValueResult2("id", miValueConst2); - const CMIUtilString strPid(CMIUtilString::Format("%lld", pid)); - const CMICmnMIValueConst miValueConst(strPid); - const CMICmnMIValueResult miValueResult("pid", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBand( - CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupStarted, miValueResult2); - miOutOfBand.Add(miValueResult); - m_miResultRecordExtra = miOutOfBand.GetString(); - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdExecRun::CreateSelf() { return new CMICmdCmdExecRun(); } - - -//++ -// Details: CMICmdCmdExecContinue constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecContinue::CMICmdCmdExecContinue() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "exec-continue"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdExecContinue::CreateSelf; -} - -//++ -// Details: CMICmdCmdExecContinue destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecContinue::~CMICmdCmdExecContinue() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecContinue::Execute() { - const auto successHandler = [this] { - // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM - if (!CMIDriver::Instance().SetDriverStateRunningDebugging()) { - const CMIUtilString &rErrMsg(CMIDriver::Instance().GetErrorDescription()); - SetError(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE), - m_cmdData.strMiCmd.c_str(), rErrMsg.c_str())); - return MIstatus::failure; - } - return MIstatus::success; - }; - - return HandleSBErrorWithSuccess( - CMICmnLLDBDebugSessionInfo::Instance().GetProcess().Continue(), - successHandler); -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecContinue::Acknowledge() { - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running); - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdExecContinue::CreateSelf() { - return new CMICmdCmdExecContinue(); -} - - -//++ -// Details: CMICmdCmdExecNext constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecNext::CMICmdCmdExecNext() : m_constStrArgNumber("number") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "exec-next"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdExecNext::CreateSelf; -} - -//++ -// Details: CMICmdCmdExecNext destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecNext::~CMICmdCmdExecNext() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecNext::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgNumber, false, false)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecNext::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgThread->GetExpectedOption(nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - - lldb::SBError error; - if (nThreadId != UINT64_MAX) { - lldb::SBThread sbThread = rSessionInfo.GetProcess().GetThreadByIndexID(nThreadId); - if (!sbThread.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - sbThread.StepOver(lldb::eOnlyDuringStepping, error); - } else - rSessionInfo.GetProcess().GetSelectedThread().StepOver( - lldb::eOnlyDuringStepping, error); - - return HandleSBError(error); -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecNext::Acknowledge() { - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running); - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdExecNext::CreateSelf() { return new CMICmdCmdExecNext(); } - - -//++ -// Details: CMICmdCmdExecStep constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecStep::CMICmdCmdExecStep() : m_constStrArgNumber("number") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "exec-step"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdExecStep::CreateSelf; -} - -//++ -// Details: CMICmdCmdExecStep destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecStep::~CMICmdCmdExecStep() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecStep::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgNumber, false, false)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecStep::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgThread->GetExpectedOption(nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - - lldb::SBError error; - if (nThreadId != UINT64_MAX) { - lldb::SBThread sbThread = - rSessionInfo.GetProcess().GetThreadByIndexID(nThreadId); - if (!sbThread.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - sbThread.StepInto(nullptr, LLDB_INVALID_LINE_NUMBER, error); - } else - rSessionInfo.GetProcess().GetSelectedThread().StepInto( - nullptr, LLDB_INVALID_LINE_NUMBER, error); - - return HandleSBError(error); -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecStep::Acknowledge() { - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running); - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdExecStep::CreateSelf() { return new CMICmdCmdExecStep(); } - - -//++ -// Details: CMICmdCmdExecNextInstruction constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecNextInstruction::CMICmdCmdExecNextInstruction() - : m_constStrArgNumber("number") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "exec-next-instruction"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdExecNextInstruction::CreateSelf; -} - -//++ -// Details: CMICmdCmdExecNextInstruction destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecNextInstruction::~CMICmdCmdExecNextInstruction() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecNextInstruction::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgNumber, false, false)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecNextInstruction::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgThread->GetExpectedOption(nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - - lldb::SBError error; - if (nThreadId != UINT64_MAX) { - lldb::SBThread sbThread = - rSessionInfo.GetProcess().GetThreadByIndexID(nThreadId); - if (!sbThread.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - sbThread.StepInstruction(true, error); - } else - rSessionInfo.GetProcess().GetSelectedThread().StepInstruction( - true, error); - - return HandleSBError(error); -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecNextInstruction::Acknowledge() { - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running); - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdExecNextInstruction::CreateSelf() { - return new CMICmdCmdExecNextInstruction(); -} - - -//++ -// Details: CMICmdCmdExecStepInstruction constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecStepInstruction::CMICmdCmdExecStepInstruction() - : m_constStrArgNumber("number") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "exec-step-instruction"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdExecStepInstruction::CreateSelf; -} - -//++ -// Details: CMICmdCmdExecStepInstruction destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecStepInstruction::~CMICmdCmdExecStepInstruction() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecStepInstruction::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgNumber, false, false)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecStepInstruction::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgThread->GetExpectedOption(nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - - lldb::SBError error; - if (nThreadId != UINT64_MAX) { - lldb::SBThread sbThread = - rSessionInfo.GetProcess().GetThreadByIndexID(nThreadId); - if (!sbThread.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - sbThread.StepInstruction(false, error); - } else - rSessionInfo.GetProcess().GetSelectedThread().StepInstruction( - false, error); - - return HandleSBError(error); -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecStepInstruction::Acknowledge() { - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running); - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdExecStepInstruction::CreateSelf() { - return new CMICmdCmdExecStepInstruction(); -} - - -//++ -// Details: CMICmdCmdExecFinish constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecFinish::CMICmdCmdExecFinish() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "exec-finish"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdExecFinish::CreateSelf; -} - -//++ -// Details: CMICmdCmdExecFinish destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecFinish::~CMICmdCmdExecFinish() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecFinish::ParseArgs() { return ParseValidateCmdOptions(); } - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecFinish::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgThread->GetExpectedOption(nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - - lldb::SBError error; - if (nThreadId != UINT64_MAX) { - lldb::SBThread sbThread = - rSessionInfo.GetProcess().GetThreadByIndexID(nThreadId); - if (!sbThread.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - sbThread.StepOut(error); - } else - rSessionInfo.GetProcess().GetSelectedThread().StepOut(error); - - return HandleSBError(error); -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecFinish::Acknowledge() { - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Running); - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdExecFinish::CreateSelf() { - return new CMICmdCmdExecFinish(); -} - - -//++ -// Details: CMICmdCmdExecInterrupt constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecInterrupt::CMICmdCmdExecInterrupt() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "exec-interrupt"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdExecInterrupt::CreateSelf; -} - -//++ -// Details: CMICmdCmdExecInterrupt destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecInterrupt::~CMICmdCmdExecInterrupt() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecInterrupt::Execute() { - const auto successHandler = [this] { - // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM - if (!CMIDriver::Instance().SetDriverStateRunningNotDebugging()) { - const CMIUtilString &rErrMsg(CMIDriver::Instance().GetErrorDescription()); - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_SET_NEW_DRIVER_STATE), - m_cmdData.strMiCmd.c_str(), - rErrMsg.c_str())); - return MIstatus::failure; - } - return MIstatus::success; - }; - - return HandleSBErrorWithSuccess( - CMICmnLLDBDebugSessionInfo::Instance().GetProcess().Stop(), - successHandler); -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdExecInterrupt::Acknowledge() { - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdExecInterrupt::CreateSelf() { - return new CMICmdCmdExecInterrupt(); -} - - -//++ -// Details: CMICmdCmdExecArguments constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecArguments::CMICmdCmdExecArguments() - : m_constStrArgArguments("arguments") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "exec-arguments"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdExecArguments::CreateSelf; -} - -//++ -// Details: CMICmdCmdExecArguments destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecArguments::~CMICmdCmdExecArguments() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdExecArguments::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValListOfN( - m_constStrArgArguments, false, true, - CMICmdArgValListBase::eArgValType_StringAnything)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdExecArguments::Execute() { - CMICMDBASE_GETOPTION(pArgArguments, ListOfN, m_constStrArgArguments); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBTarget sbTarget = rSessionInfo.GetTarget(); - if (!sbTarget.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET_CURRENT), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - lldb::SBLaunchInfo sbLaunchInfo = sbTarget.GetLaunchInfo(); - sbLaunchInfo.SetArguments(nullptr, false); - - CMIUtilString strArg; - size_t nArgIndex = 0; - while (pArgArguments->GetExpectedOption( - strArg, nArgIndex)) { - const char *argv[2] = {strArg.c_str(), nullptr}; - sbLaunchInfo.SetArguments(argv, true); - ++nArgIndex; - } - - sbTarget.SetLaunchInfo(sbLaunchInfo); - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdExecArguments::Acknowledge() { - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdExecArguments::CreateSelf() { - return new CMICmdCmdExecArguments(); -} - - -//++ -// Details: CMICmdCmdExecAbort constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecAbort::CMICmdCmdExecAbort() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "exec-abort"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdExecAbort::CreateSelf; -} - -//++ -// Details: CMICmdCmdExecAbort destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdExecAbort::~CMICmdCmdExecAbort() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdExecAbort::Execute() { - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - if (!sbProcess.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - lldb::SBError sbError = sbProcess.Destroy(); - if (sbError.Fail()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_LLDBPROCESS_DESTROY), - m_cmdData.strMiCmd.c_str(), - sbError.GetCString())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdExecAbort::Acknowledge() { - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdExecAbort::CreateSelf() { - return new CMICmdCmdExecAbort(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdFile.h b/lldb/tools/lldb-mi/MICmdCmdFile.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdFile.h +++ /dev/null @@ -1,66 +0,0 @@ -//===-- MICmdCmdFile.h ------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdFileExecAndSymbols interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "file-exec-and-symbols". -// This command does not follow the MI documentation exactly. -// Gotchas: This command has additional flags that were not available in GDB MI. -// See MIextensions.txt for details. -//-- -class CMICmdCmdFileExecAndSymbols : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdFileExecAndSymbols(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdFileExecAndSymbols() override; - bool GetExitAppOnCommandFailure() const override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNameFile; - const CMIUtilString - m_constStrArgNamedPlatformName; // Added to support iOS platform selection - const CMIUtilString m_constStrArgNamedRemotePath; // Added to support iOS - // device remote file - // location -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdFile.cpp b/lldb/tools/lldb-mi/MICmdCmdFile.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdFile.cpp +++ /dev/null @@ -1,206 +0,0 @@ -//===-- MICmdCmdFile.cpp ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdFileExecAndSymbols implementation. - -// Third Party Headers: -#include "lldb/API/SBStream.h" - -// In-house headers: -#include "MICmdArgValFile.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValString.h" -#include "MICmdCmdFile.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnMIResultRecord.h" -#include "MIUtilFileStd.h" - -//++ -// Details: CMICmdCmdFileExecAndSymbols constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdFileExecAndSymbols::CMICmdCmdFileExecAndSymbols() - : m_constStrArgNameFile("file"), m_constStrArgNamedPlatformName("p"), - m_constStrArgNamedRemotePath("r") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "file-exec-and-symbols"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdFileExecAndSymbols::CreateSelf; -} - -//++ -// Details: CMICmdCmdFileExecAndSymbols destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdFileExecAndSymbols::~CMICmdCmdFileExecAndSymbols() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdFileExecAndSymbols::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValFile(m_constStrArgNameFile, true, true)); - m_setCmdArgs.Add( - new CMICmdArgValOptionShort(m_constStrArgNamedPlatformName, false, true, - CMICmdArgValListBase::eArgValType_String, 1)); - m_setCmdArgs.Add(new CMICmdArgValOptionShort( - m_constStrArgNamedRemotePath, false, true, - CMICmdArgValListBase::eArgValType_StringQuotedNumberPath, 1)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Synopsis: -file-exec-and-symbols file -// Ref: -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-File-Commands.html#GDB_002fMI-File-Commands -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdFileExecAndSymbols::Execute() { - CMICMDBASE_GETOPTION(pArgNamedFile, File, m_constStrArgNameFile); - CMICMDBASE_GETOPTION(pArgPlatformName, OptionShort, - m_constStrArgNamedPlatformName); - CMICMDBASE_GETOPTION(pArgRemotePath, OptionShort, - m_constStrArgNamedRemotePath); - CMICmdArgValFile *pArgFile = static_cast(pArgNamedFile); - const CMIUtilString &strExeFilePath(pArgFile->GetValue()); - bool bPlatformName = pArgPlatformName->GetFound(); - CMIUtilString platformName; - if (bPlatformName) { - pArgPlatformName->GetExpectedOption( - platformName); - } - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBDebugger &rDbgr = rSessionInfo.GetDebugger(); - lldb::SBError error; - const char *pTargetTriple = nullptr; // Let LLDB discover the triple required - const char *pTargetPlatformName = platformName.c_str(); - const bool bAddDepModules = false; - lldb::SBTarget target = - rDbgr.CreateTarget(strExeFilePath.c_str(), pTargetTriple, - pTargetPlatformName, bAddDepModules, error); - CMIUtilString strWkDir; - const CMIUtilString &rStrKeyWkDir(rSessionInfo.m_constStrSharedDataKeyWkDir); - if (!rSessionInfo.SharedDataRetrieve(rStrKeyWkDir, strWkDir)) { - strWkDir = CMIUtilFileStd::StripOffFileName(strExeFilePath); - if (!rSessionInfo.SharedDataAdd(rStrKeyWkDir, strWkDir)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_DBGSESSION_ERR_SHARED_DATA_ADD), - m_cmdData.strMiCmd.c_str(), - rStrKeyWkDir.c_str())); - return MIstatus::failure; - } - } - if (!rDbgr.SetCurrentPlatformSDKRoot(strWkDir.c_str())) { - - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_FNFAILED), - m_cmdData.strMiCmd.c_str(), - "SetCurrentPlatformSDKRoot()")); - return MIstatus::failure; - } - if (pArgRemotePath->GetFound()) { - CMIUtilString remotePath; - pArgRemotePath->GetExpectedOption( - remotePath); - lldb::SBModule module = target.FindModule(target.GetExecutable()); - if (module.IsValid()) { - module.SetPlatformFileSpec(lldb::SBFileSpec(remotePath.c_str())); - } - } - lldb::SBStream err; - if (error.Fail()) { - const bool bOk = error.GetDescription(err); - MIunused(bOk); - } - if (!target.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET), - m_cmdData.strMiCmd.c_str(), - strExeFilePath.c_str(), err.GetData())); - return MIstatus::failure; - } - if (error.Fail()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_CREATE_TARGET), - m_cmdData.strMiCmd.c_str(), err.GetData())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdFileExecAndSymbols::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdFileExecAndSymbols::CreateSelf() { - return new CMICmdCmdFileExecAndSymbols(); -} - -//++ -// Details: If the MI Driver is not operating via a client i.e. Eclipse but say -// operating -// on a executable passed in as a argument to the drive then what -// should the driver -// do on a command failing? Either continue operating or exit the -// application. -// Override this function where a command failure cannot allow the -// driver to -// continue operating. -// Type: Overridden. -// Args: None. -// Return: bool - True = Fatal if command fails, false = can continue if -// command fails. -// Throws: None. -//-- -bool CMICmdCmdFileExecAndSymbols::GetExitAppOnCommandFailure() const { - return true; -} diff --git a/lldb/tools/lldb-mi/MICmdCmdGdbInfo.h b/lldb/tools/lldb-mi/MICmdCmdGdbInfo.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdGdbInfo.h +++ /dev/null @@ -1,87 +0,0 @@ -//===-- MICmdCmdGdbInfo.h ---------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdGdbInfo interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// Third party headers: -#include - -// In-house headers: -#include "MICmdBase.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements GDB command "info". -// The design of matching the info request to a request action (or -// command) is very simple. The request function which carries out -// the task of information gathering and printing to stdout is part of -// *this class. Should the request function become more complicated -// then -// that request should really reside in a command type class. Then this -// class instantiates a request info command for a matching request. -// The -// design/code of *this class then does not then become bloated. Use a -// lightweight version of the current MI command system. -//-- -class CMICmdCmdGdbInfo : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdGdbInfo(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdGdbInfo() override; - - // Typedefs: -private: - typedef bool (CMICmdCmdGdbInfo::*FnPrintPtr)(); - typedef std::map MapPrintFnNameToPrintFn_t; - - // Methods: -private: - bool GetPrintFn(const CMIUtilString &vrPrintFnName, FnPrintPtr &vrwpFn) const; - bool PrintFnSharedLibrary(); - - // Attributes: -private: - const static MapPrintFnNameToPrintFn_t ms_mapPrintFnNameToPrintFn; - // - const CMIUtilString m_constStrArgNamedPrint; - bool m_bPrintFnRecognised; // True = This command has a function with a name - // that matches the Print argument, false = not - // found - bool m_bPrintFnSuccessful; // True = The print function completed its task ok, - // false = function failed for some reason - CMIUtilString m_strPrintFnName; - CMIUtilString m_strPrintFnError; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdGdbInfo.cpp b/lldb/tools/lldb-mi/MICmdCmdGdbInfo.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdGdbInfo.cpp +++ /dev/null @@ -1,225 +0,0 @@ -//===-- MICmdCmdGdbInfo.cpp -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdGdbInfo implementation. - -// Third party headers: -#include "lldb/API/SBCommandReturnObject.h" -#include - -// In-house headers: -#include "MICmdArgValString.h" -#include "MICmdCmdGdbInfo.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "MICmnStreamStdout.h" - -// Instantiations: -const CMICmdCmdGdbInfo::MapPrintFnNameToPrintFn_t - CMICmdCmdGdbInfo::ms_mapPrintFnNameToPrintFn = { - {"sharedlibrary", &CMICmdCmdGdbInfo::PrintFnSharedLibrary}}; - -//++ -// Details: CMICmdCmdGdbInfo constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdGdbInfo::CMICmdCmdGdbInfo() - : m_constStrArgNamedPrint("print"), m_bPrintFnRecognised(true), - m_bPrintFnSuccessful(false), - m_strPrintFnError(MIRSRC(IDS_WORD_ERR_MSG_NOT_IMPLEMENTED_BRKTS)) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "info"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdGdbInfo::CreateSelf; -} - -//++ -// Details: CMICmdCmdGdbInfo destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdGdbInfo::~CMICmdCmdGdbInfo() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbInfo::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgNamedPrint, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbInfo::Execute() { - CMICMDBASE_GETOPTION(pArgPrint, String, m_constStrArgNamedPrint); - const CMIUtilString &rPrintRequest(pArgPrint->GetValue()); - - FnPrintPtr pPrintRequestFn = nullptr; - if (!GetPrintFn(rPrintRequest, pPrintRequestFn)) { - m_strPrintFnName = rPrintRequest; - m_bPrintFnRecognised = false; - return MIstatus::success; - } - - m_bPrintFnSuccessful = (this->*(pPrintRequestFn))(); - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbInfo::Acknowledge() { - if (!m_bPrintFnRecognised) { - const CMICmnMIValueConst miValueConst(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_INFO_PRINTFN_NOT_FOUND), m_strPrintFnName.c_str())); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - if (m_bPrintFnSuccessful) { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - const CMICmnMIValueConst miValueConst(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_INFO_PRINTFN_FAILED), m_strPrintFnError.c_str())); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdGdbInfo::CreateSelf() { return new CMICmdCmdGdbInfo(); } - -//++ -// Details: Retrieve the print function's pointer for the matching print -// request. -// Type: Method. -// Args: vrPrintFnName - (R) The info requested. -// vrwpFn - (W) The print function's pointer of the function -// to carry out -// Return: bool - True = Print request is implemented, false = not found. -// Throws: None. -//-- -bool CMICmdCmdGdbInfo::GetPrintFn(const CMIUtilString &vrPrintFnName, - FnPrintPtr &vrwpFn) const { - vrwpFn = nullptr; - - const MapPrintFnNameToPrintFn_t::const_iterator it = - ms_mapPrintFnNameToPrintFn.find(vrPrintFnName); - if (it != ms_mapPrintFnNameToPrintFn.end()) { - vrwpFn = (*it).second; - return true; - } - - return false; -} - -//++ -// Details: Carry out work to complete the request to prepare and send back -// information -// asked for. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbInfo::PrintFnSharedLibrary() { - bool bOk = CMICmnStreamStdout::TextToStdout( - "~\"From To Syms Read Shared Object Library\""); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBTarget sbTarget = rSessionInfo.GetTarget(); - const MIuint nModules = sbTarget.GetNumModules(); - for (MIuint i = 0; bOk && (i < nModules); i++) { - lldb::SBModule module = sbTarget.GetModuleAtIndex(i); - if (module.IsValid()) { - const CMIUtilString strModuleFilePath( - module.GetFileSpec().GetDirectory()); - const CMIUtilString strModuleFileName(module.GetFileSpec().GetFilename()); - const CMIUtilString strModuleFullPath(CMIUtilString::Format( - "%s/%s", strModuleFilePath.c_str(), strModuleFileName.c_str())); - const CMIUtilString strHasSymbols = - (module.GetNumSymbols() > 0) ? "Yes" : "No"; - lldb::addr_t addrLoadS = 0xffffffffffffffff; - lldb::addr_t addrLoadSize = 0; - bool bHaveAddrLoad = false; - const MIuint nSections = module.GetNumSections(); - for (MIuint j = 0; j < nSections; j++) { - lldb::SBSection section = module.GetSectionAtIndex(j); - lldb::addr_t addrLoad = section.GetLoadAddress(sbTarget); - if (addrLoad != (lldb::addr_t)-1) { - if (!bHaveAddrLoad) { - bHaveAddrLoad = true; - addrLoadS = addrLoad; - } - - addrLoadSize += section.GetByteSize(); - } - } - bOk = bOk && - CMICmnStreamStdout::TextToStdout(CMIUtilString::Format( - "~\"0x%016" PRIx64 "\t0x%016" PRIx64 "\t%s\t\t%s\"", addrLoadS, - addrLoadS + addrLoadSize, strHasSymbols.c_str(), - strModuleFullPath.c_str())); - } - } - - return bOk; -} diff --git a/lldb/tools/lldb-mi/MICmdCmdGdbSet.h b/lldb/tools/lldb-mi/MICmdCmdGdbSet.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdGdbSet.h +++ /dev/null @@ -1,101 +0,0 @@ -//===-- MICmdCmdGdbSet.h ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdGdbSet interface. -// -// To implement new MI commands, derive a new command class from -// the command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "gdb-set". -// This command does not follow the MI documentation exactly. While -// *this -// command is implemented it does not do anything with the gdb-set -// variable past in. -// The design of matching the info request to a request action (or -// command) is very simple. The request function which carries out -// the task of information gathering and printing to stdout is part of -// *this class. Should the request function become more complicated -// then -// that request should really reside in a command type class. Then this -// class instantiates a request info command for a matching request. -// The -// design/code of *this class then does not then become bloated. Use a -// lightweight version of the current MI command system. -//-- -class CMICmdCmdGdbSet : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdGdbSet(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdGdbSet() override; - - // Typedefs: -private: - typedef bool (CMICmdCmdGdbSet::*FnGdbOptionPtr)( - const CMIUtilString::VecString_t &vrWords); - typedef std::map - MapGdbOptionNameToFnGdbOptionPtr_t; - - // Methods: -private: - bool GetOptionFn(const CMIUtilString &vrGdbOptionName, - FnGdbOptionPtr &vrwpFn) const; - bool OptionFnTargetAsync(const CMIUtilString::VecString_t &vrWords); - bool OptionFnPrint(const CMIUtilString::VecString_t &vrWords); - bool OptionFnSolibSearchPath(const CMIUtilString::VecString_t &vrWords); - bool OptionFnOutputRadix(const CMIUtilString::VecString_t &vrWords); - bool OptionFnDisassemblyFlavor(const CMIUtilString::VecString_t &vrWords); - bool OptionFnBreakpoint(const CMIUtilString::VecString_t &vrWords); - bool OptionFnFallback(const CMIUtilString::VecString_t &vrWords); - - // Attributes: -private: - const static MapGdbOptionNameToFnGdbOptionPtr_t - ms_mapGdbOptionNameToFnGdbOptionPtr; - // - const CMIUtilString m_constStrArgNamedGdbOption; - bool m_bGdbOptionRecognised; // True = This command has a function with a name - // that matches the Print argument, false = not - // found - bool m_bGdbOptionFnSuccessful; // True = The print function completed its task - // ok, false = function failed for some reason - bool m_bGbbOptionFnHasError; // True = The option function has an error - // condition (not the command!), false = option - // function ok. - CMIUtilString m_strGdbOptionName; - CMIUtilString m_strGdbOptionFnError; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdGdbSet.cpp b/lldb/tools/lldb-mi/MICmdCmdGdbSet.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdGdbSet.cpp +++ /dev/null @@ -1,491 +0,0 @@ -//===-- MICmdCmdGdbSet.cpp --------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdGdbSet implementation. - -// In-house headers: -#include "MICmdCmdGdbSet.h" -#include "MICmdArgValListOfN.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValString.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" - -// Instantiations: -const CMICmdCmdGdbSet::MapGdbOptionNameToFnGdbOptionPtr_t - CMICmdCmdGdbSet::ms_mapGdbOptionNameToFnGdbOptionPtr = { - {"target-async", &CMICmdCmdGdbSet::OptionFnTargetAsync}, - {"print", &CMICmdCmdGdbSet::OptionFnPrint}, - // { "auto-solib-add", &CMICmdCmdGdbSet::OptionFnAutoSolibAdd }, // - // Example code if need to implement GDB set other options - {"output-radix", &CMICmdCmdGdbSet::OptionFnOutputRadix}, - {"solib-search-path", &CMICmdCmdGdbSet::OptionFnSolibSearchPath}, - {"disassembly-flavor", &CMICmdCmdGdbSet::OptionFnDisassemblyFlavor}, - {"fallback", &CMICmdCmdGdbSet::OptionFnFallback}, - {"breakpoint", &CMICmdCmdGdbSet::OptionFnBreakpoint}}; - -//++ -// Details: CMICmdCmdGdbSet constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdGdbSet::CMICmdCmdGdbSet() - : m_constStrArgNamedGdbOption("option"), m_bGdbOptionRecognised(true), - m_bGdbOptionFnSuccessful(false), m_bGbbOptionFnHasError(false), - m_strGdbOptionFnError(MIRSRC(IDS_WORD_ERR_MSG_NOT_IMPLEMENTED_BRKTS)) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "gdb-set"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdGdbSet::CreateSelf; -} - -//++ -// Details: CMICmdCmdGdbSet destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdGdbSet::~CMICmdCmdGdbSet() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValListOfN( - m_constStrArgNamedGdbOption, true, true, - CMICmdArgValListBase::eArgValType_StringAnything)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command is executed in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::Execute() { - CMICMDBASE_GETOPTION(pArgGdbOption, ListOfN, m_constStrArgNamedGdbOption); - const CMICmdArgValListBase::VecArgObjPtr_t &rVecWords( - pArgGdbOption->GetExpectedOptions()); - - // Get the gdb-set option to carry out. This option will be used as an action - // which should be done. Further arguments will be used as parameters for it. - CMICmdArgValListBase::VecArgObjPtr_t::const_iterator it = rVecWords.begin(); - const CMICmdArgValString *pOption = - static_cast(*it); - const CMIUtilString strOption(pOption->GetValue()); - ++it; - - // Retrieve the parameter(s) for the option - CMIUtilString::VecString_t vecWords; - while (it != rVecWords.end()) { - const CMICmdArgValString *pWord = - static_cast(*it); - vecWords.push_back(pWord->GetValue()); - - // Next - ++it; - } - - FnGdbOptionPtr pPrintRequestFn = nullptr; - if (!GetOptionFn(strOption, pPrintRequestFn)) { - // For unimplemented option handlers, fallback on a generic handler - // ToDo: Remove this when ALL options have been implemented - if (!GetOptionFn("fallback", pPrintRequestFn)) { - m_bGdbOptionRecognised = false; - m_strGdbOptionName = "fallback"; // This would be the strOption name - return MIstatus::success; - } - } - - m_bGdbOptionFnSuccessful = (this->*(pPrintRequestFn))(vecWords); - if (!m_bGdbOptionFnSuccessful && !m_bGbbOptionFnHasError) - return MIstatus::failure; - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute() method. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::Acknowledge() { - // Print error if option isn't recognized: - // ^error,msg="The request '%s' was not recognized, not implemented" - if (!m_bGdbOptionRecognised) { - const CMICmnMIValueConst miValueConst( - CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INFO_PRINTFN_NOT_FOUND), - m_strGdbOptionName.c_str())); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - // ^done,value="%s" - if (m_bGdbOptionFnSuccessful) { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - // Print error if request failed: - // ^error,msg="The request '%s' failed. - const CMICmnMIValueConst miValueConst(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_INFO_PRINTFN_FAILED), m_strGdbOptionFnError.c_str())); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdGdbSet::CreateSelf() { return new CMICmdCmdGdbSet(); } - -//++ -// Details: Retrieve the print function's pointer for the matching print -// request. -// Type: Method. -// Args: vrPrintFnName - (R) The info requested. -// vrwpFn - (W) The print function's pointer of the function -// to carry out -// Return: bool - True = Print request is implemented, false = not found. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::GetOptionFn(const CMIUtilString &vrPrintFnName, - FnGdbOptionPtr &vrwpFn) const { - vrwpFn = nullptr; - - const MapGdbOptionNameToFnGdbOptionPtr_t::const_iterator it = - ms_mapGdbOptionNameToFnGdbOptionPtr.find(vrPrintFnName); - if (it != ms_mapGdbOptionNameToFnGdbOptionPtr.end()) { - vrwpFn = (*it).second; - return true; - } - - return false; -} - -//++ -// Details: Carry out work to complete the GDB set option 'target-async' to -// prepare -// and send back information asked for. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::OptionFnTargetAsync( - const CMIUtilString::VecString_t &vrWords) { - bool bAsyncMode = false; - bool bOk = true; - - if (vrWords.size() > 1) - // Too many arguments. - bOk = false; - else if (vrWords.size() == 0) - // If no arguments, default is "on". - bAsyncMode = true; - else if (CMIUtilString::Compare(vrWords[0], "on")) - bAsyncMode = true; - else if (CMIUtilString::Compare(vrWords[0], "off")) - bAsyncMode = false; - else - // Unrecognized argument. - bOk = false; - - if (!bOk) { - // Report error. - m_bGbbOptionFnHasError = true; - m_strGdbOptionFnError = MIRSRC(IDS_CMD_ERR_GDBSET_OPT_TARGETASYNC); - return MIstatus::failure; - } - - // Turn async mode on/off. - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - rSessionInfo.GetDebugger().SetAsync(bAsyncMode); - - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB set option -// 'print-char-array-as-string' to -// prepare and send back information asked for. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::OptionFnPrint(const CMIUtilString::VecString_t &vrWords) { - const bool bAllArgs(vrWords.size() == 2); - const bool bArgOn(bAllArgs && (CMIUtilString::Compare(vrWords[1], "on") || - CMIUtilString::Compare(vrWords[1], "1"))); - const bool bArgOff(bAllArgs && (CMIUtilString::Compare(vrWords[1], "off") || - CMIUtilString::Compare(vrWords[1], "0"))); - if (!bAllArgs || (!bArgOn && !bArgOff)) { - m_bGbbOptionFnHasError = true; - m_strGdbOptionFnError = MIRSRC(IDS_CMD_ERR_GDBSET_OPT_PRINT_BAD_ARGS); - return MIstatus::failure; - } - - const CMIUtilString strOption(vrWords[0]); - CMIUtilString strOptionKey; - if (CMIUtilString::Compare(strOption, "char-array-as-string")) - strOptionKey = m_rLLDBDebugSessionInfo.m_constStrPrintCharArrayAsString; - else if (CMIUtilString::Compare(strOption, "expand-aggregates")) - strOptionKey = m_rLLDBDebugSessionInfo.m_constStrPrintExpandAggregates; - else if (CMIUtilString::Compare(strOption, "aggregate-field-names")) - strOptionKey = m_rLLDBDebugSessionInfo.m_constStrPrintAggregateFieldNames; - else { - m_bGbbOptionFnHasError = true; - m_strGdbOptionFnError = CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_GDBSET_OPT_PRINT_UNKNOWN_OPTION), strOption.c_str()); - return MIstatus::failure; - } - - const bool bOptionValue(bArgOn); - if (!m_rLLDBDebugSessionInfo.SharedDataAdd(strOptionKey, - bOptionValue)) { - m_bGbbOptionFnHasError = false; - SetError(CMIUtilString::Format(MIRSRC(IDS_DBGSESSION_ERR_SHARED_DATA_ADD), - m_cmdData.strMiCmd.c_str(), - strOptionKey.c_str())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB set option 'solib-search-path' to -// prepare -// and send back information asked for. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::OptionFnSolibSearchPath( - const CMIUtilString::VecString_t &vrWords) { - // Check we have at least one argument - if (vrWords.size() < 1) { - m_bGbbOptionFnHasError = true; - m_strGdbOptionFnError = MIRSRC(IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH); - return MIstatus::failure; - } - const CMIUtilString &rStrValSolibPath(vrWords[0]); - - // Add 'solib-search-path' to the shared data list - const CMIUtilString &rStrKeySolibPath( - m_rLLDBDebugSessionInfo.m_constStrSharedDataSolibPath); - if (!m_rLLDBDebugSessionInfo.SharedDataAdd(rStrKeySolibPath, - rStrValSolibPath)) { - m_bGbbOptionFnHasError = false; - SetError(CMIUtilString::Format(MIRSRC(IDS_DBGSESSION_ERR_SHARED_DATA_ADD), - m_cmdData.strMiCmd.c_str(), - rStrKeySolibPath.c_str())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB set option 'output-radix' to -// prepare -// and send back information asked for. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::OptionFnOutputRadix( - const CMIUtilString::VecString_t &vrWords) { - // Check we have at least one argument - if (vrWords.size() < 1) { - m_bGbbOptionFnHasError = true; - m_strGdbOptionFnError = MIRSRC(IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH); - return MIstatus::failure; - } - const CMIUtilString &rStrValOutputRadix(vrWords[0]); - - CMICmnLLDBDebugSessionInfoVarObj::varFormat_e format = - CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Invalid; - MIint64 radix; - if (rStrValOutputRadix.ExtractNumber(radix)) { - switch (radix) { - case 8: - format = CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Octal; - break; - case 10: - format = CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Natural; - break; - case 16: - format = CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Hex; - break; - default: - format = CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Invalid; - break; - } - } - if (format == CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Invalid) { - m_bGbbOptionFnHasError = false; - SetError(CMIUtilString::Format(MIRSRC(IDS_DBGSESSION_ERR_SHARED_DATA_ADD), - m_cmdData.strMiCmd.c_str(), "Output Radix")); - return MIstatus::failure; - } - CMICmnLLDBDebugSessionInfoVarObj::VarObjSetFormat(format); - - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB set option 'disassembly-flavor' -// to prepare -// and send back information asked for. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::OptionFnDisassemblyFlavor( - const CMIUtilString::VecString_t &vrWords) { - // Check we have at least one argument - if (vrWords.size() < 1) { - m_bGbbOptionFnHasError = true; - // m_strGdbOptionFnError = MIRSRC(IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH); - return MIstatus::failure; - } - const CMIUtilString &rStrValDisasmFlavor(vrWords[0]); - - lldb::SBDebugger &rDbgr = m_rLLDBDebugSessionInfo.GetDebugger(); - lldb::SBError error = lldb::SBDebugger::SetInternalVariable( - "target.x86-disassembly-flavor", rStrValDisasmFlavor.c_str(), - rDbgr.GetInstanceName()); - if (error.Fail()) { - m_strGdbOptionFnError = error.GetCString(); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB set option 'breakpoint' to -// prepare -// and send back information asked for. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::OptionFnBreakpoint( - const CMIUtilString::VecString_t &vrWords) { - bool bPending = false; - bool bOk = true; - - if (vrWords.size() != 2) - // Wrong number of arguments. - bOk = false; - else if (CMIUtilString::Compare(vrWords[0], "pending") && - (CMIUtilString::Compare(vrWords[1], "on") || - CMIUtilString::Compare(vrWords[1], "1"))) - bPending = true; - else if (CMIUtilString::Compare(vrWords[0], "pending") && - (CMIUtilString::Compare(vrWords[1], "off") || - CMIUtilString::Compare(vrWords[1], "0"))) - bPending = false; - else - // Unrecognized argument(s). - bOk = false; - - if (!bOk) { - // Report error. - m_bGbbOptionFnHasError = false; - SetError(MIRSRC(IDS_CMD_ERR_GDBSET_OPT_BREAKPOINT)); - return MIstatus::failure; - } - - CMIUtilString sPendingVal = bPending ? "on" : "off"; - CMIUtilString sKey = "breakpoint.pending"; - if (!m_rLLDBDebugSessionInfo.SharedDataAdd(sKey, sPendingVal)) { - m_bGbbOptionFnHasError = false; - SetError(CMIUtilString::Format(MIRSRC(IDS_DBGSESSION_ERR_SHARED_DATA_ADD), - m_cmdData.strMiCmd.c_str(), sKey.c_str())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB set option to prepare and send -// back the -// requested information. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbSet::OptionFnFallback( - const CMIUtilString::VecString_t &vrWords) { - MIunused(vrWords); - - // Do nothing - intentional. This is a fallback function to do nothing. - // This allows the search for gdb-set options to always succeed when the - // option is not - // found (implemented). - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MICmdCmdGdbShow.h b/lldb/tools/lldb-mi/MICmdCmdGdbShow.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdGdbShow.h +++ /dev/null @@ -1,101 +0,0 @@ -//===-- MICmdCmdGdbShow.h ---------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdGdbShow interface. -// -// To implement new MI commands, derive a new command class from -// the command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "gdb-show". -// This command does not follow the MI documentation exactly. While -// *this -// command is implemented it does not do anything with the gdb-set -// variable past in. -// The design of matching the info request to a request action (or -// command) is very simple. The request function which carries out -// the task of information gathering and printing to stdout is part of -// *this class. Should the request function become more complicated -// then -// that request should really reside in a command type class. Then this -// class instantiates a request info command for a matching request. -// The -// design/code of *this class then does not then become bloated. Use a -// lightweight version of the current MI command system. -//-- -class CMICmdCmdGdbShow : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdGdbShow(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdGdbShow() override; - - // Typedefs: -private: - typedef bool (CMICmdCmdGdbShow::*FnGdbOptionPtr)( - const CMIUtilString::VecString_t &vrWords); - typedef std::map - MapGdbOptionNameToFnGdbOptionPtr_t; - - // Methods: -private: - bool GetOptionFn(const CMIUtilString &vrGdbOptionName, - FnGdbOptionPtr &vrwpFn) const; - bool OptionFnTargetAsync(const CMIUtilString::VecString_t &vrWords); - bool OptionFnPrint(const CMIUtilString::VecString_t &vrWords); - bool OptionFnLanguage(const CMIUtilString::VecString_t &vrWords); - bool OptionFnDisassemblyFlavor(const CMIUtilString::VecString_t &vrWords); - bool OptionFnFallback(const CMIUtilString::VecString_t &vrWords); - bool OptionFnBreakpoint(const CMIUtilString::VecString_t &vrWords); - - // Attributes: -private: - const static MapGdbOptionNameToFnGdbOptionPtr_t - ms_mapGdbOptionNameToFnGdbOptionPtr; - - const CMIUtilString m_constStrArgNamedGdbOption; - bool m_bGdbOptionRecognised; // True = This command has a function with a name - // that matches the Print argument, false = not - // found - bool m_bGdbOptionFnSuccessful; // True = The print function completed its task - // ok, false = function failed for some reason - bool m_bGbbOptionFnHasError; // True = The option function has an error - // condition (not the command!), false = option - // function ok. - CMIUtilString m_strGdbOptionName; - CMIUtilString m_strGdbOptionFnError; - CMIUtilString m_strValue; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdGdbShow.cpp b/lldb/tools/lldb-mi/MICmdCmdGdbShow.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdGdbShow.cpp +++ /dev/null @@ -1,395 +0,0 @@ -//===-- MICmdCmdGdbShow.cpp -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdGdbShow implementation. - -// Third party headers: -#include "lldb/API/SBCompileUnit.h" -#include "lldb/API/SBFrame.h" -#include "lldb/API/SBLanguageRuntime.h" -#include "lldb/API/SBStringList.h" -#include "lldb/API/SBThread.h" - -// In-house headers: -#include "MICmdArgValListOfN.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValString.h" -#include "MICmdCmdGdbShow.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" - -// Instantiations: -const CMICmdCmdGdbShow::MapGdbOptionNameToFnGdbOptionPtr_t - CMICmdCmdGdbShow::ms_mapGdbOptionNameToFnGdbOptionPtr = { - {"target-async", &CMICmdCmdGdbShow::OptionFnTargetAsync}, - {"print", &CMICmdCmdGdbShow::OptionFnPrint}, - {"language", &CMICmdCmdGdbShow::OptionFnLanguage}, - {"disassembly-flavor", &CMICmdCmdGdbShow::OptionFnDisassemblyFlavor}, - {"fallback", &CMICmdCmdGdbShow::OptionFnFallback}, - {"breakpoint", &CMICmdCmdGdbShow::OptionFnBreakpoint}}; - -//++ -// Details: CMICmdCmdGdbShow constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdGdbShow::CMICmdCmdGdbShow() - : m_constStrArgNamedGdbOption("option"), m_bGdbOptionRecognised(true), - m_bGdbOptionFnSuccessful(false), m_bGbbOptionFnHasError(false), - m_strGdbOptionFnError(MIRSRC(IDS_WORD_ERR_MSG_NOT_IMPLEMENTED_BRKTS)) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "gdb-show"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdGdbShow::CreateSelf; -} - -//++ -// Details: CMICmdCmdGdbShow destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdGdbShow::~CMICmdCmdGdbShow() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbShow::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValListOfN( - m_constStrArgNamedGdbOption, true, true, - CMICmdArgValListBase::eArgValType_StringAnything)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command is executed in this -// function. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbShow::Execute() { - CMICMDBASE_GETOPTION(pArgGdbOption, ListOfN, m_constStrArgNamedGdbOption); - const CMICmdArgValListBase::VecArgObjPtr_t &rVecWords( - pArgGdbOption->GetExpectedOptions()); - - // Get the gdb-show option to carry out. This option will be used as an action - // which should be done. Further arguments will be used as parameters for it. - CMICmdArgValListBase::VecArgObjPtr_t::const_iterator it = rVecWords.begin(); - const CMICmdArgValString *pOption = - static_cast(*it); - const CMIUtilString strOption(pOption->GetValue()); - ++it; - - // Retrieve the parameter(s) for the option - CMIUtilString::VecString_t vecWords; - while (it != rVecWords.end()) { - const CMICmdArgValString *pWord = - static_cast(*it); - vecWords.push_back(pWord->GetValue()); - - // Next - ++it; - } - - FnGdbOptionPtr pPrintRequestFn = nullptr; - if (!GetOptionFn(strOption, pPrintRequestFn)) { - // For unimplemented option handlers, fallback to a generic handler - // ToDo: Remove this when ALL options have been implemented - if (!GetOptionFn("fallback", pPrintRequestFn)) { - m_bGdbOptionRecognised = false; - m_strGdbOptionName = "fallback"; // This would be the strOption name - return MIstatus::success; - } - } - - m_bGdbOptionFnSuccessful = (this->*(pPrintRequestFn))(vecWords); - if (!m_bGdbOptionFnSuccessful && !m_bGbbOptionFnHasError) - return MIstatus::failure; - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute() method. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbShow::Acknowledge() { - // Print error if option isn't recognized: - // ^error,msg="The request '%s' was not recognized, not implemented" - if (!m_bGdbOptionRecognised) { - const CMICmnMIValueConst miValueConst( - CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INFO_PRINTFN_NOT_FOUND), - m_strGdbOptionName.c_str())); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - // ^done,value="%s" - if (m_bGdbOptionFnSuccessful && !m_strValue.empty()) { - const CMICmnMIValueConst miValueConst(m_strValue); - const CMICmnMIValueResult miValueResult("value", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } else if (m_bGdbOptionFnSuccessful) { - // Ignore empty value (for fallback) - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - // Print error if request failed: - // ^error,msg="The request '%s' failed. - const CMICmnMIValueConst miValueConst(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_INFO_PRINTFN_FAILED), m_strGdbOptionFnError.c_str())); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdGdbShow::CreateSelf() { return new CMICmdCmdGdbShow(); } - -//++ -// Details: Retrieve the print function's pointer for the matching print -// request. -// Type: Method. -// Args: vrPrintFnName - (R) The info requested. -// vrwpFn - (W) The print function's pointer of the function -// to carry out -// Return: bool - True = Print request is implemented, false = not found. -// Throws: None. -//-- -bool CMICmdCmdGdbShow::GetOptionFn(const CMIUtilString &vrPrintFnName, - FnGdbOptionPtr &vrwpFn) const { - vrwpFn = nullptr; - - const MapGdbOptionNameToFnGdbOptionPtr_t::const_iterator it = - ms_mapGdbOptionNameToFnGdbOptionPtr.find(vrPrintFnName); - if (it != ms_mapGdbOptionNameToFnGdbOptionPtr.end()) { - vrwpFn = (*it).second; - return true; - } - - return false; -} - -//++ -// Details: Carry out work to complete the GDB show option 'target-async' to -// prepare -// and send back the requested information. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbShow::OptionFnTargetAsync( - const CMIUtilString::VecString_t &vrWords) { - MIunused(vrWords); - - // Get async mode - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - const bool bAsyncMode = rSessionInfo.GetDebugger().GetAsync(); - - m_strValue = bAsyncMode ? "on" : "off"; - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB show option 'print' to prepare -// and send -// back the requested information. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbShow::OptionFnPrint( - const CMIUtilString::VecString_t &vrWords) { - const bool bAllArgs(vrWords.size() == 1); - if (!bAllArgs) { - m_bGbbOptionFnHasError = true; - m_strGdbOptionFnError = MIRSRC(IDS_CMD_ERR_GDBSHOW_OPT_PRINT_BAD_ARGS); - return MIstatus::failure; - } - - const CMIUtilString strOption(vrWords[0]); - CMIUtilString strOptionKey; - bool bOptionValueDefault = false; - if (CMIUtilString::Compare(strOption, "char-array-as-string")) - strOptionKey = m_rLLDBDebugSessionInfo.m_constStrPrintCharArrayAsString; - else if (CMIUtilString::Compare(strOption, "expand-aggregates")) - strOptionKey = m_rLLDBDebugSessionInfo.m_constStrPrintExpandAggregates; - else if (CMIUtilString::Compare(strOption, "aggregate-field-names")) { - strOptionKey = m_rLLDBDebugSessionInfo.m_constStrPrintAggregateFieldNames; - bOptionValueDefault = true; - } else { - m_bGbbOptionFnHasError = true; - m_strGdbOptionFnError = CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_GDBSHOW_OPT_PRINT_UNKNOWN_OPTION), - strOption.c_str()); - return MIstatus::failure; - } - - bool bOptionValue = false; - bOptionValue = bOptionValueDefault - ? !m_rLLDBDebugSessionInfo.SharedDataRetrieve( - strOptionKey, bOptionValue) || - bOptionValue - : m_rLLDBDebugSessionInfo.SharedDataRetrieve( - strOptionKey, bOptionValue) && - bOptionValue; - - m_strValue = bOptionValue ? "on" : "off"; - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB show option 'language' to prepare -// and send back the requested information. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbShow::OptionFnLanguage( - const CMIUtilString::VecString_t &vrWords) { - MIunused(vrWords); - - // Get current language - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBThread sbThread = rSessionInfo.GetProcess().GetSelectedThread(); - const lldb::SBFrame sbFrame = sbThread.GetSelectedFrame(); - lldb::SBCompileUnit sbCompileUnit = sbFrame.GetCompileUnit(); - const lldb::LanguageType eLanguageType = sbCompileUnit.GetLanguage(); - - m_strValue = lldb::SBLanguageRuntime::GetNameForLanguageType(eLanguageType); - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB show option 'disassembly-flavor' to prepare -// and send back the requested information. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbShow::OptionFnDisassemblyFlavor(const CMIUtilString::VecString_t &vrWords) { - MIunused(vrWords); - - // Get current disassembly flavor - lldb::SBDebugger &rDbgr = m_rLLDBDebugSessionInfo.GetDebugger(); - m_strValue = lldb::SBDebugger::GetInternalVariableValue("target.x86-disassembly-flavor", - rDbgr.GetInstanceName()).GetStringAtIndex(0); - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB show option 'breakpoint' to -// prepare -// and send back the requested information. -// Type: Method. -// Args: vrWords - (R) List of additional parameters used by this option. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbShow::OptionFnBreakpoint( - const CMIUtilString::VecString_t &vrWords) { - if (vrWords.size() != 1) { - m_bGbbOptionFnHasError = true; - m_strGdbOptionFnError = MIRSRC(IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_BAD_ARGS); - return MIstatus::failure; - } - - const CMIUtilString strOption(vrWords[0]); - if (!CMIUtilString::Compare(strOption, "pending")) { - m_bGbbOptionFnHasError = true; - m_strGdbOptionFnError = CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_UNKNOWN_OPTION), - strOption.c_str()); - return MIstatus::failure; - } - - if (!m_rLLDBDebugSessionInfo.SharedDataRetrieve("breakpoint.pending", - m_strValue)) { - if (m_strValue.empty()) - m_strValue = "off"; - } - - return MIstatus::success; -} - -//++ -// Details: Carry out work to complete the GDB show option to prepare and send -// back the -// requested information. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdGdbShow::OptionFnFallback( - const CMIUtilString::VecString_t &vrWords) { - MIunused(vrWords); - - // Do nothing - intentional. This is a fallback function to do nothing. - // This allows the search for gdb-show options to always succeed when the - // option is not - // found (implemented). - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MICmdCmdGdbThread.h b/lldb/tools/lldb-mi/MICmdCmdGdbThread.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdGdbThread.h +++ /dev/null @@ -1,50 +0,0 @@ -//===-- MICmdCmdGdbThread.h -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdGdbThread interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements GDB command "thread". -//-- -class CMICmdCmdGdbThread : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdGdbThread(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdGdbThread() override; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdGdbThread.cpp b/lldb/tools/lldb-mi/MICmdCmdGdbThread.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdGdbThread.cpp +++ /dev/null @@ -1,89 +0,0 @@ -//===-- MICmdCmdGdbThread.cpp -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdGdbThread implementation. - -// In-house headers: -#include "MICmdCmdGdbThread.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" - -//++ -// Details: CMICmdCmdGdbThread constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdGdbThread::CMICmdCmdGdbThread() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "thread"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdGdbThread::CreateSelf; -} - -//++ -// Details: CMICmdCmdThread destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdGdbThread::~CMICmdCmdGdbThread() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbThread::Execute() { - // Do nothing - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbThread::Acknowledge() { - const CMICmnMIValueConst miValueConst(MIRSRC(IDS_WORD_NOT_IMPLEMENTED)); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdGdbThread::CreateSelf() { - return new CMICmdCmdGdbThread(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdMiscellanous.h b/lldb/tools/lldb-mi/MICmdCmdMiscellanous.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdMiscellanous.h +++ /dev/null @@ -1,156 +0,0 @@ -//===-- MICmdCmdMiscellanous.h ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdGdbExit interface. -// CMICmdCmdListThreadGroups interface. -// CMICmdCmdInterpreterExec interface. -// CMICmdCmdInferiorTtySet interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// Third party headers: -#include "lldb/API/SBCommandReturnObject.h" - -// In-house headers: -#include "MICmdBase.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "gdb-exit". -//-- -class CMICmdCmdGdbExit : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdGdbExit(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdGdbExit() override; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "list-thread-groups". -// This command does not follow the MI documentation exactly. -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Miscellaneous-Commands.html#GDB_002fMI-Miscellaneous-Commands -//-- -class CMICmdCmdListThreadGroups : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdListThreadGroups(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdListThreadGroups() override; - - // Typedefs: -private: - typedef std::vector VecMIValueTuple_t; - - // Attributes: -private: - bool m_bIsI1; // True = Yes command argument equal "i1", false = no match - bool m_bHaveArgOption; // True = Yes "--available" present, false = not found - bool m_bHaveArgRecurse; // True = Yes command argument "--recurse", false = no - // found - VecMIValueTuple_t m_vecMIValueTuple; - const CMIUtilString m_constStrArgNamedAvailable; - const CMIUtilString m_constStrArgNamedRecurse; - const CMIUtilString m_constStrArgNamedGroup; - const CMIUtilString m_constStrArgNamedThreadGroup; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "interpreter-exec". -//-- -class CMICmdCmdInterpreterExec : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdInterpreterExec(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdInterpreterExec() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNamedInterpreter; - const CMIUtilString m_constStrArgNamedCommand; - lldb::SBCommandReturnObject m_lldbResult; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "inferior-tty-set". -//-- -class CMICmdCmdInferiorTtySet : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdInferiorTtySet(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdInferiorTtySet() override; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdMiscellanous.cpp b/lldb/tools/lldb-mi/MICmdCmdMiscellanous.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdMiscellanous.cpp +++ /dev/null @@ -1,586 +0,0 @@ -//===-- MICmdCmdMiscellanous.cpp --------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdGdbExit implementation. -// CMICmdCmdListThreadGroups implementation. -// CMICmdCmdInterpreterExec implementation. -// CMICmdCmdInferiorTtySet implementation. - -// Third Party Headers: -#include "lldb/API/SBCommandInterpreter.h" -#include "lldb/API/SBThread.h" - -// In-house headers: -#include "MICmdArgValFile.h" -#include "MICmdArgValListOfN.h" -#include "MICmdArgValNumber.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValString.h" -#include "MICmdArgValThreadGrp.h" -#include "MICmdCmdMiscellanous.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnMIOutOfBandRecord.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "MICmnStreamStderr.h" -#include "MICmnStreamStdout.h" -#include "MIDriverBase.h" - -//++ -// Details: CMICmdCmdGdbExit constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdGdbExit::CMICmdCmdGdbExit() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "gdb-exit"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdGdbExit::CreateSelf; -} - -//++ -// Details: CMICmdCmdGdbExit destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdGdbExit::~CMICmdCmdGdbExit() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbExit::Execute() { - CMICmnLLDBDebugger::Instance().GetDriver().SetExitApplicationFlag(true); - const lldb::SBError sbErr = m_rLLDBDebugSessionInfo.GetProcess().Destroy(); - // Do not check for sbErr.Fail() here, m_lldbProcess is likely !IsValid() - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdGdbExit::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Exit); - m_miResultRecord = miRecordResult; - - // Prod the client i.e. Eclipse with out-of-band results to help it 'continue' - // because it is using LLDB debugger - // Give the client '=thread-group-exited,id="i1"' - m_bHasResultRecordExtra = true; - const CMICmnMIValueConst miValueConst2("i1"); - const CMICmnMIValueResult miValueResult2("id", miValueConst2); - const CMICmnMIOutOfBandRecord miOutOfBand( - CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupExited, miValueResult2); - m_miResultRecordExtra = miOutOfBand.GetString(); - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdGdbExit::CreateSelf() { return new CMICmdCmdGdbExit(); } - - -//++ -// Details: CMICmdCmdListThreadGroups constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdListThreadGroups::CMICmdCmdListThreadGroups() - : m_bIsI1(false), m_bHaveArgOption(false), m_bHaveArgRecurse(false), - m_constStrArgNamedAvailable("available"), - m_constStrArgNamedRecurse("recurse"), m_constStrArgNamedGroup("group"), - m_constStrArgNamedThreadGroup("i1") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "list-thread-groups"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdListThreadGroups::CreateSelf; -} - -//++ -// Details: CMICmdCmdListThreadGroups destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdListThreadGroups::~CMICmdCmdListThreadGroups() { - m_vecMIValueTuple.clear(); -} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdListThreadGroups::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValOptionLong(m_constStrArgNamedAvailable, false, true)); - m_setCmdArgs.Add( - new CMICmdArgValOptionLong(m_constStrArgNamedRecurse, false, true, - CMICmdArgValListBase::eArgValType_Number, 1)); - m_setCmdArgs.Add( - new CMICmdArgValListOfN(m_constStrArgNamedGroup, false, true, - CMICmdArgValListBase::eArgValType_Number)); - m_setCmdArgs.Add( - new CMICmdArgValThreadGrp(m_constStrArgNamedThreadGroup, false, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Synopsis: -list-thread-groups [ --available ] [ --recurse 1 ] [ -// group ... ] -// This command does not follow the MI documentation exactly. Has an -// extra -// argument "i1" to handle. -// Ref: -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Miscellaneous-Commands.html#GDB_002fMI-Miscellaneous-Commands -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdListThreadGroups::Execute() { - if (m_setCmdArgs.IsArgContextEmpty()) - // No options so "top level thread groups" - return MIstatus::success; - - CMICMDBASE_GETOPTION(pArgAvailable, OptionLong, m_constStrArgNamedAvailable); - CMICMDBASE_GETOPTION(pArgRecurse, OptionLong, m_constStrArgNamedRecurse); - CMICMDBASE_GETOPTION(pArgThreadGroup, ThreadGrp, - m_constStrArgNamedThreadGroup); - - // Got some options so "threads" - if (pArgAvailable->GetFound()) { - if (pArgRecurse->GetFound()) { - m_bHaveArgRecurse = true; - return MIstatus::success; - } - - m_bHaveArgOption = true; - return MIstatus::success; - } - // "i1" as first argument (pos 0 of possible arg) - if (!pArgThreadGroup->GetFound()) - return MIstatus::success; - m_bIsI1 = true; - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - - // Note do not check for sbProcess is IsValid(), continue - - m_vecMIValueTuple.clear(); - const MIuint nThreads = sbProcess.GetNumThreads(); - for (MIuint i = 0; i < nThreads; i++) { - // GetThreadAtIndex() uses a base 0 index - // GetThreadByIndexID() uses a base 1 index - lldb::SBThread thread = sbProcess.GetThreadAtIndex(i); - - if (thread.IsValid()) { - CMICmnMIValueTuple miTuple; - if (!rSessionInfo.MIResponseFormThreadInfo( - m_cmdData, thread, - CMICmnLLDBDebugSessionInfo::eThreadInfoFormat_NoFrames, miTuple)) - return MIstatus::failure; - - m_vecMIValueTuple.push_back(miTuple); - } - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdListThreadGroups::Acknowledge() { - if (m_bHaveArgOption) { - if (m_bHaveArgRecurse) { - const CMICmnMIValueConst miValueConst( - MIRSRC(IDS_WORD_NOT_IMPLEMENTED_BRKTS)); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; - } - - const CMICmnMIValueConst miValueConst1("i1"); - const CMICmnMIValueResult miValueResult1("id", miValueConst1); - CMICmnMIValueTuple miTuple(miValueResult1); - - const CMICmnMIValueConst miValueConst2("process"); - const CMICmnMIValueResult miValueResult2("type", miValueConst2); - miTuple.Add(miValueResult2); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - if (rSessionInfo.GetProcess().IsValid()) { - const lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID(); - const CMIUtilString strPid(CMIUtilString::Format("%lld", pid)); - const CMICmnMIValueConst miValueConst3(strPid); - const CMICmnMIValueResult miValueResult3("pid", miValueConst3); - miTuple.Add(miValueResult3); - } - - const CMICmnMIValueConst miValueConst4( - MIRSRC(IDS_WORD_NOT_IMPLEMENTED_BRKTS)); - const CMICmnMIValueResult miValueResult4("num_children", miValueConst4); - miTuple.Add(miValueResult4); - - const CMICmnMIValueConst miValueConst5( - MIRSRC(IDS_WORD_NOT_IMPLEMENTED_BRKTS)); - const CMICmnMIValueResult miValueResult5("cores", miValueConst5); - miTuple.Add(miValueResult5); - - const CMICmnMIValueList miValueList(miTuple); - const CMICmnMIValueResult miValueResult6("groups", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult6); - m_miResultRecord = miRecordResult; - - return MIstatus::success; - } - - if (!m_bIsI1) { - const CMICmnMIValueConst miValueConst1("i1"); - const CMICmnMIValueResult miValueResult1("id", miValueConst1); - CMICmnMIValueTuple miTuple(miValueResult1); - - const CMICmnMIValueConst miValueConst2("process"); - const CMICmnMIValueResult miValueResult2("type", miValueConst2); - miTuple.Add(miValueResult2); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - if (rSessionInfo.GetProcess().IsValid()) { - const lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID(); - const CMIUtilString strPid(CMIUtilString::Format("%lld", pid)); - const CMICmnMIValueConst miValueConst3(strPid); - const CMICmnMIValueResult miValueResult3("pid", miValueConst3); - miTuple.Add(miValueResult3); - } - - if (rSessionInfo.GetTarget().IsValid()) { - lldb::SBTarget sbTrgt = rSessionInfo.GetTarget(); - const char *pDir = sbTrgt.GetExecutable().GetDirectory(); - const char *pFileName = sbTrgt.GetExecutable().GetFilename(); - const CMIUtilString strFile( - CMIUtilString::Format("%s/%s", - CMIUtilString::WithNullAsEmpty(pDir), - CMIUtilString::WithNullAsEmpty(pFileName))); - const CMICmnMIValueConst miValueConst4(strFile); - const CMICmnMIValueResult miValueResult4("executable", miValueConst4); - miTuple.Add(miValueResult4); - } - - const CMICmnMIValueList miValueList(miTuple); - const CMICmnMIValueResult miValueResult5("groups", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult5); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - // Build up a list of thread information from tuples - VecMIValueTuple_t::const_iterator it = m_vecMIValueTuple.begin(); - if (it == m_vecMIValueTuple.end()) { - const CMICmnMIValueConst miValueConst("[]"); - const CMICmnMIValueResult miValueResult("threads", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - CMICmnMIValueList miValueList(*it); - ++it; - while (it != m_vecMIValueTuple.end()) { - const CMICmnMIValueTuple &rTuple(*it); - miValueList.Add(rTuple); - - // Next - ++it; - } - - const CMICmnMIValueResult miValueResult("threads", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdListThreadGroups::CreateSelf() { - return new CMICmdCmdListThreadGroups(); -} - - -//++ -// Details: CMICmdCmdInterpreterExec constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdInterpreterExec::CMICmdCmdInterpreterExec() - : m_constStrArgNamedInterpreter("interpreter"), - m_constStrArgNamedCommand("command") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "interpreter-exec"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdInterpreterExec::CreateSelf; -} - -//++ -// Details: CMICmdCmdInterpreterExec destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdInterpreterExec::~CMICmdCmdInterpreterExec() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdInterpreterExec::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValString(m_constStrArgNamedInterpreter, true, true)); - m_setCmdArgs.Add( - new CMICmdArgValString(m_constStrArgNamedCommand, true, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdInterpreterExec::Execute() { - CMICMDBASE_GETOPTION(pArgInterpreter, String, m_constStrArgNamedInterpreter); - CMICMDBASE_GETOPTION(pArgCommand, String, m_constStrArgNamedCommand); - - // Handle the interpreter parameter by do nothing on purpose (set to 'handled' - // in the arg definition above) - const CMIUtilString &rStrInterpreter(pArgInterpreter->GetValue()); - MIunused(rStrInterpreter); - - const CMIUtilString &rStrCommand(pArgCommand->GetValue()); - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - const lldb::ReturnStatus rtn = - rSessionInfo.GetDebugger().GetCommandInterpreter().HandleCommand( - rStrCommand.c_str(), m_lldbResult, true); - MIunused(rtn); - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdInterpreterExec::Acknowledge() { - if (m_lldbResult.GetOutputSize() > 0) { - const CMIUtilString line(m_lldbResult.GetOutput()); - const bool bEscapeQuotes(true); - CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes)); - CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_ConsoleStreamOutput, miValueConst); - const bool bOk = CMICmnStreamStdout::TextToStdout(miOutOfBandRecord.GetString()); - if (!bOk) - return MIstatus::failure; - } - if (m_lldbResult.GetErrorSize() > 0) { - const CMIUtilString line(m_lldbResult.GetError()); - const bool bEscapeQuotes(true); - CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes)); - CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_LogStreamOutput, miValueConst); - const bool bOk = CMICmnStreamStdout::TextToStdout(miOutOfBandRecord.GetString()); - if (!bOk) - return MIstatus::failure; - } - - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdInterpreterExec::CreateSelf() { - return new CMICmdCmdInterpreterExec(); -} - - -//++ -// Details: CMICmdCmdInferiorTtySet constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdInferiorTtySet::CMICmdCmdInferiorTtySet() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "inferior-tty-set"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdInferiorTtySet::CreateSelf; -} - -//++ -// Details: CMICmdCmdInferiorTtySet destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdInferiorTtySet::~CMICmdCmdInferiorTtySet() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdInferiorTtySet::Execute() { - // Do nothing - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdInferiorTtySet::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdInferiorTtySet::CreateSelf() { - return new CMICmdCmdInferiorTtySet(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdStack.h b/lldb/tools/lldb-mi/MICmdCmdStack.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdStack.h +++ /dev/null @@ -1,256 +0,0 @@ -//===-- MICmdCmdStack.h -----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdStackInfoDepth interface. -// CMICmdCmdStackInfoFrame interface. -// CMICmdCmdStackListFrames interface. -// CMICmdCmdStackListArguments interface. -// CMICmdCmdStackListLocals interface. -// CMICmdCmdStackSelectFrame interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "stack-info-depth". -//-- -class CMICmdCmdStackInfoDepth : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdStackInfoDepth(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdStackInfoDepth() override; - - // Attributes: -private: - MIuint m_nThreadFrames; - const CMIUtilString m_constStrArgMaxDepth; // Not handled by *this command -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "stack-info-frame". -//-- -class CMICmdCmdStackInfoFrame : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdStackInfoFrame(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdStackInfoFrame() override; - - // Attributes: -private: - CMICmnMIValueTuple m_miValueTuple; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "stack-list-frames". -//-- -class CMICmdCmdStackListFrames : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdStackListFrames(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdStackListFrames() override; - - // Typedefs: -private: - typedef std::vector VecMIValueResult_t; - - // Attributes: -private: - MIuint m_nThreadFrames; - VecMIValueResult_t m_vecMIValueResult; - const CMIUtilString m_constStrArgFrameLow; - const CMIUtilString m_constStrArgFrameHigh; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "stack-list-arguments". -//-- -class CMICmdCmdStackListArguments : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdStackListArguments(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdStackListArguments() override; - - // Attributes: -private: - bool m_bThreadInvalid; // True = yes invalid thread, false = thread object - // valid - CMICmnMIValueList m_miValueList; - const CMIUtilString m_constStrArgPrintValues; - const CMIUtilString m_constStrArgFrameLow; - const CMIUtilString m_constStrArgFrameHigh; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "stack-list-locals". -//-- -class CMICmdCmdStackListLocals : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdStackListLocals(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdStackListLocals() override; - - // Attributes: -private: - bool m_bThreadInvalid; // True = yes invalid thread, false = thread object - // valid - CMICmnMIValueList m_miValueList; - const CMIUtilString m_constStrArgPrintValues; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "stack-list-variables". -//-- -class CMICmdCmdStackListVariables : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdStackListVariables(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdStackListVariables() override; - - // Attributes -private: - bool m_bThreadInvalid; // True = yes invalid thread, false = thread object - // valid - CMICmnMIValueList m_miValueList; - const CMIUtilString m_constStrArgPrintValues; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "stack-select-frame". -//-- -class CMICmdCmdStackSelectFrame : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdStackSelectFrame(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdStackSelectFrame() override; - - // Attributes: -private: - bool m_bFrameInvalid; // True = yes invalid frame, false = ok - const CMIUtilString m_constStrArgFrameId; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdStack.cpp b/lldb/tools/lldb-mi/MICmdCmdStack.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdStack.cpp +++ /dev/null @@ -1,1053 +0,0 @@ -//===-- MICmdCmdStack.cpp ---------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdStackInfoDepth implementation. -// CMICmdCmdStackInfoFrame implementation. -// CMICmdCmdStackListFrames implementation. -// CMICmdCmdStackListArguments implementation. -// CMICmdCmdStackListLocals implementation. -// CMICmdCmdStackSelectFrame implementation. - -// Third Party Headers: -#include "lldb/API/SBThread.h" - -// In-house headers: -#include "MICmdArgValListOfN.h" -#include "MICmdArgValNumber.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValPrintValues.h" -#include "MICmdArgValString.h" -#include "MICmdArgValThreadGrp.h" -#include "MICmdCmdStack.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnMIOutOfBandRecord.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" - -#include - -//++ -// Details: CMICmdCmdStackInfoDepth constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackInfoDepth::CMICmdCmdStackInfoDepth() - : m_nThreadFrames(0), m_constStrArgMaxDepth("max-depth") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "stack-info-depth"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdStackInfoDepth::CreateSelf; -} - -//++ -// Details: CMICmdCmdStackInfoDepth destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackInfoDepth::~CMICmdCmdStackInfoDepth() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackInfoDepth::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgMaxDepth, false, false)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackInfoDepth::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - CMICMDBASE_GETOPTION(pArgMaxDepth, Number, m_constStrArgMaxDepth); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgThread->GetExpectedOption(nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - lldb::SBThread thread = (nThreadId != UINT64_MAX) - ? sbProcess.GetThreadByIndexID(nThreadId) - : sbProcess.GetSelectedThread(); - m_nThreadFrames = thread.GetNumFrames(); - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackInfoDepth::Acknowledge() { - const CMIUtilString strDepth(CMIUtilString::Format("%d", m_nThreadFrames)); - const CMICmnMIValueConst miValueConst(strDepth); - const CMICmnMIValueResult miValueResult("depth", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdStackInfoDepth::CreateSelf() { - return new CMICmdCmdStackInfoDepth(); -} - - -//++ -// Details: CMICmdCmdStackInfoFrame constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackInfoFrame::CMICmdCmdStackInfoFrame() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "stack-info-frame"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdStackInfoFrame::CreateSelf; -} - -//++ -// Details: CMICmdCmdStackInfoFrame destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackInfoFrame::~CMICmdCmdStackInfoFrame() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdStackInfoFrame::ParseArgs() { return ParseValidateCmdOptions(); } - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdStackInfoFrame::Execute() { - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - if (!sbProcess.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - lldb::SBThread sbThread = sbProcess.GetSelectedThread(); - MIuint nFrameId = sbThread.GetSelectedFrame().GetFrameID(); - if (!rSessionInfo.MIResponseFormFrameInfo( - sbThread, nFrameId, - CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_NoArguments, - m_miValueTuple)) - return MIstatus::failure; - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdStackInfoFrame::Acknowledge() { - const CMICmnMIValueResult miValueResult("frame", m_miValueTuple); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdStackInfoFrame::CreateSelf() { - return new CMICmdCmdStackInfoFrame(); -} - - -//++ -// Details: CMICmdCmdStackListFrames constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackListFrames::CMICmdCmdStackListFrames() - : m_nThreadFrames(0), m_constStrArgFrameLow("low-frame"), - m_constStrArgFrameHigh("high-frame") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "stack-list-frames"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdStackListFrames::CreateSelf; -} - -//++ -// Details: CMICmdCmdStackListFrames destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackListFrames::~CMICmdCmdStackListFrames() { - m_vecMIValueResult.clear(); -} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListFrames::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgFrameLow, false, true)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgFrameHigh, false, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListFrames::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - CMICMDBASE_GETOPTION(pArgFrameLow, Number, m_constStrArgFrameLow); - CMICMDBASE_GETOPTION(pArgFrameHigh, Number, m_constStrArgFrameHigh); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgThread->GetExpectedOption(nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - - // Frame low and high options are not mandatory - MIuint nFrameHigh = - pArgFrameHigh->GetFound() ? pArgFrameHigh->GetValue() : UINT32_MAX; - const MIuint nFrameLow = - pArgFrameLow->GetFound() ? pArgFrameLow->GetValue() : 0; - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - lldb::SBThread thread = (nThreadId != UINT64_MAX) - ? sbProcess.GetThreadByIndexID(nThreadId) - : sbProcess.GetSelectedThread(); - MIuint nThreadFrames = thread.GetNumFrames(); - - // Adjust nThreadFrames for the nFrameHigh argument as we use nFrameHigh+1 in - // the min calc as the arg - // is not an index, but a frame id value. - if (nFrameHigh < UINT32_MAX) { - nFrameHigh++; - nThreadFrames = (nFrameHigh < nThreadFrames) ? nFrameHigh : nThreadFrames; - } - - m_nThreadFrames = nThreadFrames; - if (nThreadFrames == 0) - return MIstatus::success; - - m_vecMIValueResult.clear(); - for (MIuint nLevel = nFrameLow; nLevel < nThreadFrames; nLevel++) { - CMICmnMIValueTuple miValueTuple; - if (!rSessionInfo.MIResponseFormFrameInfo( - thread, nLevel, - CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_NoArguments, - miValueTuple)) - return MIstatus::failure; - - const CMICmnMIValueResult miValueResult8("frame", miValueTuple); - m_vecMIValueResult.push_back(miValueResult8); - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListFrames::Acknowledge() { - if (m_nThreadFrames == 0) { - // MI print "3^done,stack=[{}]" - const CMICmnMIValueTuple miValueTuple; - const CMICmnMIValueList miValueList(miValueTuple); - const CMICmnMIValueResult miValueResult("stack", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; - } - - // Build up a list of thread information from tuples - VecMIValueResult_t::const_iterator it = m_vecMIValueResult.begin(); - if (it == m_vecMIValueResult.end()) { - // MI print "3^done,stack=[{}]" - const CMICmnMIValueTuple miValueTuple; - const CMICmnMIValueList miValueList(miValueTuple); - const CMICmnMIValueResult miValueResult("stack", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - CMICmnMIValueList miValueList(*it); - ++it; - while (it != m_vecMIValueResult.end()) { - const CMICmnMIValueResult &rTuple(*it); - miValueList.Add(rTuple); - - // Next - ++it; - } - const CMICmnMIValueResult miValueResult("stack", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdStackListFrames::CreateSelf() { - return new CMICmdCmdStackListFrames(); -} - - -//++ -// Details: CMICmdCmdStackListArguments constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackListArguments::CMICmdCmdStackListArguments() - : m_bThreadInvalid(false), m_miValueList(true), - m_constStrArgPrintValues("print-values"), - m_constStrArgFrameLow("low-frame"), m_constStrArgFrameHigh("high-frame") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "stack-list-arguments"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdStackListArguments::CreateSelf; -} - -//++ -// Details: CMICmdCmdStackListArguments destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackListArguments::~CMICmdCmdStackListArguments() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListArguments::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValPrintValues(m_constStrArgPrintValues, true, true)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgFrameLow, false, true)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgFrameHigh, false, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListArguments::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - CMICMDBASE_GETOPTION(pArgPrintValues, PrintValues, m_constStrArgPrintValues); - CMICMDBASE_GETOPTION(pArgFrameLow, Number, m_constStrArgFrameLow); - CMICMDBASE_GETOPTION(pArgFrameHigh, Number, m_constStrArgFrameHigh); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound()) { - if (!pArgThread->GetExpectedOption( - nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - } - - const CMICmnLLDBDebugSessionInfo::VariableInfoFormat_e eVarInfoFormat = - static_cast( - pArgPrintValues->GetValue()); - - MIuint nFrameLow = 0; - MIuint nFrameHigh = UINT32_MAX; - if (pArgFrameLow->GetFound() && pArgFrameHigh->GetFound()) { - nFrameLow = pArgFrameLow->GetValue(); - nFrameHigh = pArgFrameHigh->GetValue() + 1; - } else if (pArgFrameLow->GetFound() || pArgFrameHigh->GetFound()) { - // Only low-frame or high-frame was specified but both are required - SetError( - CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_FRAME_RANGE_INVALID), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - lldb::SBThread thread = (nThreadId != UINT64_MAX) - ? sbProcess.GetThreadByIndexID(nThreadId) - : sbProcess.GetSelectedThread(); - m_bThreadInvalid = !thread.IsValid(); - if (m_bThreadInvalid) - return MIstatus::success; - - const lldb::StopReason eStopReason = thread.GetStopReason(); - if ((eStopReason == lldb::eStopReasonNone) || - (eStopReason == lldb::eStopReasonInvalid)) { - m_bThreadInvalid = true; - return MIstatus::success; - } - - const MIuint nFrames = thread.GetNumFrames(); - if (nFrameLow >= nFrames) { - // The low-frame is larger than the actual number of frames - SetError( - CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_FRAME_RANGE_INVALID), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - nFrameHigh = std::min(nFrameHigh, nFrames); - for (MIuint i = nFrameLow; i < nFrameHigh; i++) { - lldb::SBFrame frame = thread.GetFrameAtIndex(i); - CMICmnMIValueList miValueList(true); - const MIuint maskVarTypes = - CMICmnLLDBDebugSessionInfo::eVariableType_Arguments; - if (!rSessionInfo.MIResponseFormVariableInfo(frame, maskVarTypes, - eVarInfoFormat, miValueList)) - return MIstatus::failure; - const CMICmnMIValueConst miValueConst(CMIUtilString::Format("%d", i)); - const CMICmnMIValueResult miValueResult("level", miValueConst); - CMICmnMIValueTuple miValueTuple(miValueResult); - const CMICmnMIValueResult miValueResult2("args", miValueList); - miValueTuple.Add(miValueResult2); - const CMICmnMIValueResult miValueResult3("frame", miValueTuple); - m_miValueList.Add(miValueResult3); - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListArguments::Acknowledge() { - if (m_bThreadInvalid) { - // MI print "%s^done,stack-args=[]" - const CMICmnMIValueList miValueList(true); - const CMICmnMIValueResult miValueResult("stack-args", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - // MI print - // "%s^done,stack-args=[frame={level=\"0\",args=[%s]},frame={level=\"1\",args=[%s]}]" - const CMICmnMIValueResult miValueResult4("stack-args", m_miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult4); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdStackListArguments::CreateSelf() { - return new CMICmdCmdStackListArguments(); -} - - -//++ -// Details: CMICmdCmdStackListLocals constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackListLocals::CMICmdCmdStackListLocals() - : m_bThreadInvalid(false), m_miValueList(true), - m_constStrArgPrintValues("print-values") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "stack-list-locals"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdStackListLocals::CreateSelf; -} - -//++ -// Details: CMICmdCmdStackListLocals destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackListLocals::~CMICmdCmdStackListLocals() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListLocals::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValPrintValues(m_constStrArgPrintValues, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListLocals::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - CMICMDBASE_GETOPTION(pArgFrame, OptionLong, m_constStrArgFrame); - CMICMDBASE_GETOPTION(pArgPrintValues, PrintValues, m_constStrArgPrintValues); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound()) { - if (!pArgThread->GetExpectedOption( - nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - } - - MIuint64 nFrame = UINT64_MAX; - if (pArgFrame->GetFound()) { - if (!pArgFrame->GetExpectedOption(nFrame)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgFrame.c_str())); - return MIstatus::failure; - } - } - - const CMICmnLLDBDebugSessionInfo::VariableInfoFormat_e eVarInfoFormat = - static_cast( - pArgPrintValues->GetValue()); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - lldb::SBThread thread = (nThreadId != UINT64_MAX) - ? sbProcess.GetThreadByIndexID(nThreadId) - : sbProcess.GetSelectedThread(); - m_bThreadInvalid = !thread.IsValid(); - if (m_bThreadInvalid) - return MIstatus::success; - - const lldb::StopReason eStopReason = thread.GetStopReason(); - if ((eStopReason == lldb::eStopReasonNone) || - (eStopReason == lldb::eStopReasonInvalid)) { - m_bThreadInvalid = true; - return MIstatus::success; - } - - lldb::SBFrame frame = (nFrame != UINT64_MAX) ? thread.GetFrameAtIndex(nFrame) - : thread.GetSelectedFrame(); - - CMICmnMIValueList miValueList(true); - const MIuint maskVarTypes = CMICmnLLDBDebugSessionInfo::eVariableType_Locals | - CMICmnLLDBDebugSessionInfo::eVariableType_InScope; - if (!rSessionInfo.MIResponseFormVariableInfo(frame, maskVarTypes, - eVarInfoFormat, miValueList)) - return MIstatus::failure; - - m_miValueList = miValueList; - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListLocals::Acknowledge() { - if (m_bThreadInvalid) { - // MI print "%s^done,locals=[]" - const CMICmnMIValueList miValueList(true); - const CMICmnMIValueResult miValueResult("locals", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - // MI print "%s^done,locals=[%s]" - const CMICmnMIValueResult miValueResult("locals", m_miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdStackListLocals::CreateSelf() { - return new CMICmdCmdStackListLocals(); -} - - -//++ -// Details: CMICmdCmdStackListVariables constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackListVariables::CMICmdCmdStackListVariables() - : m_bThreadInvalid(false), m_miValueList(true), - m_constStrArgPrintValues("print-values") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "stack-list-variables"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdStackListVariables::CreateSelf; -} - -//++ -// Details: CMICmdCmdStackListVariables destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackListVariables::~CMICmdCmdStackListVariables() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListVariables::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValPrintValues(m_constStrArgPrintValues, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListVariables::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - CMICMDBASE_GETOPTION(pArgFrame, OptionLong, m_constStrArgFrame); - CMICMDBASE_GETOPTION(pArgPrintValues, PrintValues, m_constStrArgPrintValues); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound()) { - if (!pArgThread->GetExpectedOption( - nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - } - - MIuint64 nFrame = UINT64_MAX; - if (pArgFrame->GetFound()) { - if (!pArgFrame->GetExpectedOption(nFrame)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgFrame.c_str())); - return MIstatus::failure; - } - } - - const CMICmnLLDBDebugSessionInfo::VariableInfoFormat_e eVarInfoFormat = - static_cast( - pArgPrintValues->GetValue()); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - lldb::SBThread thread = (nThreadId != UINT64_MAX) - ? sbProcess.GetThreadByIndexID(nThreadId) - : sbProcess.GetSelectedThread(); - m_bThreadInvalid = !thread.IsValid(); - if (m_bThreadInvalid) - return MIstatus::success; - - const lldb::StopReason eStopReason = thread.GetStopReason(); - if ((eStopReason == lldb::eStopReasonNone) || - (eStopReason == lldb::eStopReasonInvalid)) { - m_bThreadInvalid = true; - return MIstatus::success; - } - - lldb::SBFrame frame = (nFrame != UINT64_MAX) ? thread.GetFrameAtIndex(nFrame) - : thread.GetSelectedFrame(); - - CMICmnMIValueList miValueList(true); - const MIuint maskVarTypes = - CMICmnLLDBDebugSessionInfo::eVariableType_Arguments | - CMICmnLLDBDebugSessionInfo::eVariableType_Locals | - CMICmnLLDBDebugSessionInfo::eVariableType_InScope; - if (!rSessionInfo.MIResponseFormVariableInfo( - frame, maskVarTypes, eVarInfoFormat, miValueList, 10, true)) - return MIstatus::failure; - m_miValueList = miValueList; - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdStackListVariables::Acknowledge() { - if (m_bThreadInvalid) { - // MI print "%s^done,variables=[]" - const CMICmnMIValueList miValueList(true); - const CMICmnMIValueResult miValueResult("variables", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - // MI print "%s^done,variables=[%s]" - const CMICmnMIValueResult miValueResult("variables", m_miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdStackListVariables::CreateSelf() { - return new CMICmdCmdStackListVariables(); -} - - -//++ -// Details: CMICmdCmdStackSelectFrame constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackSelectFrame::CMICmdCmdStackSelectFrame() - : m_bFrameInvalid(false), m_constStrArgFrameId("frame_id") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "stack-select-frame"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdStackSelectFrame::CreateSelf; -} - -//++ -// Details: CMICmdCmdStackSelectFrame destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdStackSelectFrame::~CMICmdCmdStackSelectFrame() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdStackSelectFrame::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgFrameId, true, false)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdStackSelectFrame::Execute() { - CMICMDBASE_GETOPTION(pArgFrame, Number, m_constStrArgFrameId); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBThread sbThread = rSessionInfo.GetProcess().GetSelectedThread(); - - const MIuint nFrameId = pArgFrame->GetValue(); - m_bFrameInvalid = (nFrameId >= sbThread.GetNumFrames()); - if (m_bFrameInvalid) - return MIstatus::success; - - lldb::SBFrame sbFrame = sbThread.SetSelectedFrame(nFrameId); - m_bFrameInvalid = !sbFrame.IsValid(); - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmdCmdStackSelectFrame::Acknowledge() { - if (m_bFrameInvalid) { - // MI print "%s^error,msg=\"Command '-stack-select-frame'. Frame ID - // invalid\"" - const CMICmnMIValueConst miValueConst(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_FRAME_INVALID), m_cmdData.strMiCmd.c_str())); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; - } - - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdStackSelectFrame::CreateSelf() { - return new CMICmdCmdStackSelectFrame(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdSupportInfo.h b/lldb/tools/lldb-mi/MICmdCmdSupportInfo.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdSupportInfo.h +++ /dev/null @@ -1,58 +0,0 @@ -//===-- MICmdCmdSupportInfo.h -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdSupportInfoMiCmdQuery interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "info-gdb-mi-command". -// This command does not follow the MI documentation exactly. -//-- -class CMICmdCmdSupportInfoMiCmdQuery : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdSupportInfoMiCmdQuery(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdSupportInfoMiCmdQuery() override; - - // Attributes: -private: - bool m_bCmdFound; // True = query for the command in command factory found, - // false = not found not recognised - const CMIUtilString m_constStrArgCmdName; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdSupportInfo.cpp b/lldb/tools/lldb-mi/MICmdCmdSupportInfo.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdSupportInfo.cpp +++ /dev/null @@ -1,117 +0,0 @@ -//===-- MICmdCmdSupportInfo.cpp ---------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdSupportInfoMiCmdQuery implementation. - -// In-house headers: -#include "MICmdCmdSupportInfo.h" -#include "MICmdArgValString.h" -#include "MICmdFactory.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "MICmnMIValueTuple.h" - -//++ -// Details: CMICmdCmdSupportInfoMiCmdQuery constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdSupportInfoMiCmdQuery::CMICmdCmdSupportInfoMiCmdQuery() - : m_bCmdFound(false), m_constStrArgCmdName("cmd_name") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "info-gdb-mi-command"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdSupportInfoMiCmdQuery::CreateSelf; -} - -//++ -// Details: CMICmdCmdSupportInfoMiCmdQuery destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdSupportInfoMiCmdQuery::~CMICmdCmdSupportInfoMiCmdQuery() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdSupportInfoMiCmdQuery::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgCmdName, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdSupportInfoMiCmdQuery::Execute() { - CMICMDBASE_GETOPTION(pArgNamedCmdName, String, m_constStrArgCmdName); - const CMIUtilString &rCmdToQuery(pArgNamedCmdName->GetValue()); - const MIuint nLen = rCmdToQuery.length(); - const CMICmdFactory &rCmdFactory = CMICmdFactory::Instance(); - if ((nLen > 1) && (rCmdToQuery[0] == '-')) - m_bCmdFound = rCmdFactory.CmdExist(rCmdToQuery.substr(1, nLen - 1).c_str()); - else - m_bCmdFound = rCmdFactory.CmdExist(rCmdToQuery); - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdSupportInfoMiCmdQuery::Acknowledge() { - const CMICmnMIValueConst miValueConst(m_bCmdFound ? "true" : "false"); - const CMICmnMIValueResult miValueResult("exists", miValueConst); - const CMICmnMIValueTuple miValueTuple(miValueResult); - const CMICmnMIValueResult miValueResult2("command", miValueTuple); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult2); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdSupportInfoMiCmdQuery::CreateSelf() { - return new CMICmdCmdSupportInfoMiCmdQuery(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdSupportList.h b/lldb/tools/lldb-mi/MICmdCmdSupportList.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdSupportList.h +++ /dev/null @@ -1,51 +0,0 @@ -//===-- MICmdCmdSupportList.h -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdSupportListFeatures interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "list-features". -// This command does not follow the MI documentation exactly. -//-- -class CMICmdCmdSupportListFeatures : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdSupportListFeatures(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdSupportListFeatures() override; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdSupportList.cpp b/lldb/tools/lldb-mi/MICmdCmdSupportList.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdSupportList.cpp +++ /dev/null @@ -1,96 +0,0 @@ -//===-- MICmdCmdSupportList.cpp ---------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdSupportListFeatures implementation. - -// In-house headers: -#include "MICmdCmdSupportList.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "MICmnMIValueList.h" - -//++ -// Details: CMICmdCmdSupportListFeatures constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdSupportListFeatures::CMICmdCmdSupportListFeatures() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "list-features"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdSupportListFeatures::CreateSelf; -} - -//++ -// Details: CMICmdCmdSupportListFeatures destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdSupportListFeatures::~CMICmdCmdSupportListFeatures() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdSupportListFeatures::Execute() { - // Do nothing - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdSupportListFeatures::Acknowledge() { - // Declare supported features here - const CMICmnMIValueConst miValueConst1("data-read-memory-bytes"); - const CMICmnMIValueConst miValueConst2("exec-run-start-option"); - // Some features may depend on host and/or target, decide what to add below - CMICmnMIValueList miValueList(true); - miValueList.Add(miValueConst1); - miValueList.Add(miValueConst2); - const CMICmnMIValueResult miValueResult("features", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdSupportListFeatures::CreateSelf() { - return new CMICmdCmdSupportListFeatures(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdSymbol.h b/lldb/tools/lldb-mi/MICmdCmdSymbol.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdSymbol.h +++ /dev/null @@ -1,59 +0,0 @@ -//===-- MICmdCmdSymbol.h ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdSymbolListLines interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// Third party headers: - -// In-house headers: -#include "MICmdBase.h" -#include "MICmnMIValueList.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "symbol-list-lines". -//-- -class CMICmdCmdSymbolListLines : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdSymbolListLines(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdSymbolListLines() override; - - // Attributes: -private: - CMICmnMIValueList m_resultList; - const CMIUtilString m_constStrArgNameFile; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdSymbol.cpp b/lldb/tools/lldb-mi/MICmdCmdSymbol.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdSymbol.cpp +++ /dev/null @@ -1,177 +0,0 @@ -//===-- MICmdCmdSymbol.cpp --------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdSymbolListLines implementation. - -// Third Party Headers: -#include "llvm/ADT/Twine.h" -#include "lldb/API/SBAddress.h" -#include "lldb/API/SBLineEntry.h" -#include "lldb/API/SBFileSpec.h" -#include "lldb/API/SBCompileUnit.h" -#include "lldb/API/SBSymbolContext.h" -#include "lldb/API/SBSymbolContextList.h" - -// In-house headers: -#include "MICmdArgValFile.h" -#include "MICmdCmdSymbol.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueTuple.h" -#include "MICmnMIValueResult.h" - -namespace { -const CMICmnMIValueTuple -CreateMITuplePCLine(const uint32_t addr, const uint32_t line_number) { - const CMICmnMIValueConst miValueConstAddr("0x" + llvm::Twine::utohexstr(addr).str()); - const CMICmnMIValueConst miValueConstLine(llvm::Twine(line_number).str()); - const CMICmnMIValueResult miValueResultAddr("pc", miValueConstAddr); - const CMICmnMIValueResult miValueResultLine("line", miValueConstLine); - CMICmnMIValueTuple miValueTuple(miValueResultAddr); - miValueTuple.Add(miValueResultLine); - return miValueTuple; -} -} // namespace - -using namespace lldb; // For operator==(const SBAddress &, const SBAddress &). - -//++ -// Details: CMICmdCmdSymbolListLines constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdSymbolListLines::CMICmdCmdSymbolListLines() - : m_resultList(false), m_constStrArgNameFile("file") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "symbol-list-lines"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdSymbolListLines::CreateSelf; -} - -//++ -// Details: CMICmdCmdSymbolListLines destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdSymbolListLines::~CMICmdCmdSymbolListLines() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdSymbolListLines::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValFile(m_constStrArgNameFile, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Synopsis: -symbol-list-lines file -// Ref: -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Symbol-Query.html#GDB_002fMI-Symbol-Query -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdSymbolListLines::Execute() { - CMICMDBASE_GETOPTION(pArgFile, File, m_constStrArgNameFile); - - const auto &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); - if (rSessionInfo.GetTarget() == rSessionInfo.GetDebugger().GetDummyTarget()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET_CURRENT), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - const lldb::SBFileSpec source_file_spec(pArgFile->GetValue().c_str(), true); - const char *source_file_name = source_file_spec.GetFilename(); - const char *source_file_directory = source_file_spec.GetDirectory(); - const bool has_path = source_file_directory; - - lldb::SBSymbolContextList sc_cu_list = - CMICmnLLDBDebugSessionInfo::Instance().GetTarget().FindCompileUnits( - source_file_spec); - - bool found_something = false; - for (uint32_t i = 0, e = sc_cu_list.GetSize(); i < e; ++i) { - const lldb::SBCompileUnit cu = - sc_cu_list.GetContextAtIndex(i).GetCompileUnit(); - for (uint32_t j = 0, e = cu.GetNumLineEntries(); j < e; ++j) { - const lldb::SBLineEntry line = cu.GetLineEntryAtIndex(j); - const lldb::SBFileSpec line_spec = line.GetFileSpec(); - if (line_spec.GetFilename() == source_file_name) { - if (has_path && (line_spec.GetDirectory() != source_file_directory)) - continue; - // We don't need a line with start address equals to end one, - // so just skip it. - const lldb::SBAddress line_start_address = line.GetStartAddress(); - const lldb::SBAddress line_end_address = line.GetEndAddress(); - if (line_start_address == line_end_address) - continue; - // We have a matching line. - found_something = true; - m_resultList.Add(CreateMITuplePCLine( - line_start_address.GetFileAddress(), - line.GetLine())); - } - } - } - if (!found_something) { - SetError(MIRSRC(IDS_UTIL_FILE_ERR_INVALID_PATHNAME)); - return MIstatus::failure; - } - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdSymbolListLines::Acknowledge() { - // MI print "%s^done,lines=[{pc=\"%d\",line=\"%d\"}...]" - const CMICmnMIValueResult miValueResult("lines", m_resultList); - m_miResultRecord = CMICmnMIResultRecord( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdSymbolListLines::CreateSelf() { - return new CMICmdCmdSymbolListLines(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdTarget.h b/lldb/tools/lldb-mi/MICmdCmdTarget.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdTarget.h +++ /dev/null @@ -1,117 +0,0 @@ -//===-- MICmdCmdTarget.h ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdTargetSelect interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "target-select". -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation -//-- -class CMICmdCmdTargetSelect : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdTargetSelect(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdTargetSelect() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgNamedType; - const CMIUtilString m_constStrArgNamedParameters; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "target-attach". -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation -//-- -class CMICmdCmdTargetAttach : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdTargetAttach(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdTargetAttach() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgPid; - const CMIUtilString m_constStrArgNamedFile; - const CMIUtilString m_constStrArgWaitFor; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "target-attach". -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation -//-- -class CMICmdCmdTargetDetach : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdTargetDetach(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdTargetDetach() override; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdTarget.cpp b/lldb/tools/lldb-mi/MICmdCmdTarget.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdTarget.cpp +++ /dev/null @@ -1,447 +0,0 @@ -//===-- MICmdCmdTarget.cpp --------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdTargetSelect implementation. - -// Third Party Headers: -#include "lldb/API/SBStream.h" -#include "lldb/API/SBError.h" - -// In-house headers: -#include "MICmdArgValNumber.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValString.h" -#include "MICmdCmdTarget.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnMIOutOfBandRecord.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" - -//++ -// Details: CMICmdCmdTargetSelect constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdTargetSelect::CMICmdCmdTargetSelect() - : m_constStrArgNamedType("type"), - m_constStrArgNamedParameters("parameters") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "target-select"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdTargetSelect::CreateSelf; -} - -//++ -// Details: CMICmdCmdTargetSelect destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdTargetSelect::~CMICmdCmdTargetSelect() = default; - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTargetSelect::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgNamedType, true, true)); - m_setCmdArgs.Add( - new CMICmdArgValString(m_constStrArgNamedParameters, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Synopsis: -target-select type parameters ... -// Ref: -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTargetSelect::Execute() { - CMICMDBASE_GETOPTION(pArgType, String, m_constStrArgNamedType); - CMICMDBASE_GETOPTION(pArgParameters, String, m_constStrArgNamedParameters); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBTarget target = rSessionInfo.GetTarget(); - - // Check we have a valid target. - // Note: target created via 'file-exec-and-symbols' command. - if (!target.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET_CURRENT), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - // Verify that we are executing remotely. - const CMIUtilString &rRemoteType(pArgType->GetValue()); - if (rRemoteType != "remote") { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET_TYPE), - m_cmdData.strMiCmd.c_str(), - rRemoteType.c_str())); - return MIstatus::failure; - } - - // Create a URL pointing to the remote gdb stub. - const CMIUtilString strUrl = - CMIUtilString::Format("connect://%s", pArgParameters->GetValue().c_str()); - - lldb::SBError error; - // Ask LLDB to connect to the target port. - const char *pPlugin("gdb-remote"); - lldb::SBProcess process = target.ConnectRemote( - rSessionInfo.GetListener(), strUrl.c_str(), pPlugin, error); - - // Verify that we have managed to connect successfully. - if (!process.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET_PLUGIN), - m_cmdData.strMiCmd.c_str(), - error.GetCString())); - return MIstatus::failure; - } - - // Set the environment path if we were given one. - CMIUtilString strWkDir; - if (rSessionInfo.SharedDataRetrieve( - rSessionInfo.m_constStrSharedDataKeyWkDir, strWkDir)) { - lldb::SBDebugger &rDbgr = rSessionInfo.GetDebugger(); - if (!rDbgr.SetCurrentPlatformSDKRoot(strWkDir.c_str())) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_FNFAILED), - m_cmdData.strMiCmd.c_str(), - "target-select")); - return MIstatus::failure; - } - } - - // Set the shared object path if we were given one. - CMIUtilString strSolibPath; - if (rSessionInfo.SharedDataRetrieve( - rSessionInfo.m_constStrSharedDataSolibPath, strSolibPath)) - target.AppendImageSearchPath(".", strSolibPath.c_str(), error); - - return HandleSBError(error); -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTargetSelect::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Connected); - m_miResultRecord = miRecordResult; - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID(); - // Prod the client i.e. Eclipse with out-of-band results to help it 'continue' - // because it is using LLDB debugger - // Give the client '=thread-group-started,id="i1"' - m_bHasResultRecordExtra = true; - const CMICmnMIValueConst miValueConst2("i1"); - const CMICmnMIValueResult miValueResult2("id", miValueConst2); - const CMIUtilString strPid(CMIUtilString::Format("%lld", pid)); - const CMICmnMIValueConst miValueConst(strPid); - const CMICmnMIValueResult miValueResult("pid", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBand( - CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupStarted, miValueResult2); - miOutOfBand.Add(miValueResult); - m_miResultRecordExtra = miOutOfBand.GetString(); - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdTargetSelect::CreateSelf() { - return new CMICmdCmdTargetSelect(); -} - -//++ -// Details: CMICmdCmdTargetAttach constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdTargetAttach::CMICmdCmdTargetAttach() - : m_constStrArgPid("pid"), m_constStrArgNamedFile("n"), - m_constStrArgWaitFor("waitfor") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "target-attach"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdTargetAttach::CreateSelf; -} - -//++ -// Details: CMICmdCmdTargetAttach destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdTargetAttach::~CMICmdCmdTargetAttach() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTargetAttach::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgPid, false, true)); - m_setCmdArgs.Add( - new CMICmdArgValOptionShort(m_constStrArgNamedFile, false, true, - CMICmdArgValListBase::eArgValType_String, 1)); - m_setCmdArgs.Add( - new CMICmdArgValOptionLong(m_constStrArgWaitFor, false, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Synopsis: -target-attach file -// Ref: -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTargetAttach::Execute() { - CMICMDBASE_GETOPTION(pArgPid, Number, m_constStrArgPid); - CMICMDBASE_GETOPTION(pArgFile, OptionShort, m_constStrArgNamedFile); - CMICMDBASE_GETOPTION(pArgWaitFor, OptionLong, m_constStrArgWaitFor); - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - - // If the current target is invalid, create one - lldb::SBTarget target = rSessionInfo.GetTarget(); - if (!target.IsValid()) { - target = rSessionInfo.GetDebugger().CreateTarget(nullptr); - if (!target.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET_CURRENT), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - } - - lldb::SBError error; - lldb::SBListener listener; - if (pArgPid->GetFound() && pArgPid->GetValid()) { - lldb::pid_t pid; - pid = pArgPid->GetValue(); - target.AttachToProcessWithID(listener, pid, error); - } else if (pArgFile->GetFound() && pArgFile->GetValid()) { - bool bWaitFor = (pArgWaitFor->GetFound()); - CMIUtilString file; - pArgFile->GetExpectedOption(file); - target.AttachToProcessWithName(listener, file.c_str(), bWaitFor, error); - } else { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_ATTACH_BAD_ARGS), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - lldb::SBStream errMsg; - if (error.Fail()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_ATTACH_FAILED), - m_cmdData.strMiCmd.c_str(), - errMsg.GetData())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTargetAttach::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID(); - // Prod the client i.e. Eclipse with out-of-band results to help it 'continue' - // because it is using LLDB debugger - // Give the client '=thread-group-started,id="i1"' - m_bHasResultRecordExtra = true; - const CMICmnMIValueConst miValueConst2("i1"); - const CMICmnMIValueResult miValueResult2("id", miValueConst2); - const CMIUtilString strPid(CMIUtilString::Format("%lld", pid)); - const CMICmnMIValueConst miValueConst(strPid); - const CMICmnMIValueResult miValueResult("pid", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBand( - CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupStarted, miValueResult2); - miOutOfBand.Add(miValueResult); - m_miResultRecordExtra = miOutOfBand.GetString(); - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdTargetAttach::CreateSelf() { - return new CMICmdCmdTargetAttach(); -} - -//++ -// Details: CMICmdCmdTargetDetach constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdTargetDetach::CMICmdCmdTargetDetach() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "target-detach"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdTargetDetach::CreateSelf; -} - -//++ -// Details: CMICmdCmdTargetDetach destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdTargetDetach::~CMICmdCmdTargetDetach() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTargetDetach::ParseArgs() { return MIstatus::success; } - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Synopsis: -target-attach file -// Ref: -// http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTargetDetach::Execute() { - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - - lldb::SBProcess process = rSessionInfo.GetProcess(); - - if (!process.IsValid()) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - process.Detach(); - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTargetDetach::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdTargetDetach::CreateSelf() { - return new CMICmdCmdTargetDetach(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdThread.h b/lldb/tools/lldb-mi/MICmdCmdThread.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdThread.h +++ /dev/null @@ -1,69 +0,0 @@ -//===-- MICmdCmdThread.h ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdThreadInfo interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "thread-info". -//-- -class CMICmdCmdThreadInfo : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdThreadInfo(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdThreadInfo() override; - - // Typedefs: -private: - typedef std::vector VecMIValueTuple_t; - - // Attributes: -private: - CMICmnMIValueTuple m_miValueTupleThread; - bool m_bSingleThread; // True = yes single thread, false = multiple threads - bool m_bThreadInvalid; // True = invalid, false = ok - VecMIValueTuple_t m_vecMIValueTuple; - const CMIUtilString m_constStrArgNamedThreadId; - - // mi value of current-thread-id if multiple threads are requested - bool m_bHasCurrentThread; - CMICmnMIValue m_miValueCurrThreadId; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdThread.cpp b/lldb/tools/lldb-mi/MICmdCmdThread.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdThread.cpp +++ /dev/null @@ -1,211 +0,0 @@ -//===-- MICmdCmdThread.cpp --------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdThreadInfo implementation. - -// Third Party Headers: -#include "lldb/API/SBBreakpointLocation.h" -#include "lldb/API/SBThread.h" - -// In-house headers: -#include "MICmdArgValNumber.h" -#include "MICmdCmdThread.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" - -//++ -// Details: CMICmdCmdThreadInfo constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdThreadInfo::CMICmdCmdThreadInfo() - : m_bSingleThread(false), m_bThreadInvalid(true), - m_constStrArgNamedThreadId("thread-id"), m_bHasCurrentThread(false) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "thread-info"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdThreadInfo::CreateSelf; -} - -//++ -// Details: CMICmdCmdThreadInfo destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdThreadInfo::~CMICmdCmdThreadInfo() { m_vecMIValueTuple.clear(); } - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdThreadInfo::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValNumber(m_constStrArgNamedThreadId, false, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdThreadInfo::Execute() { - CMICMDBASE_GETOPTION(pArgThreadId, Number, m_constStrArgNamedThreadId); - MIuint nThreadId = 0; - if (pArgThreadId->GetFound() && pArgThreadId->GetValid()) { - m_bSingleThread = true; - nThreadId = static_cast(pArgThreadId->GetValue()); - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - lldb::SBThread thread = sbProcess.GetSelectedThread(); - - if (m_bSingleThread) { - thread = sbProcess.GetThreadByIndexID(nThreadId); - m_bThreadInvalid = !thread.IsValid(); - if (m_bThreadInvalid) - return MIstatus::success; - - CMICmnMIValueTuple miTuple; - if (!rSessionInfo.MIResponseFormThreadInfo( - m_cmdData, thread, - CMICmnLLDBDebugSessionInfo::eThreadInfoFormat_AllFrames, miTuple)) - return MIstatus::failure; - - m_miValueTupleThread = miTuple; - - return MIstatus::success; - } - - // Multiple threads - m_vecMIValueTuple.clear(); - const MIuint nThreads = sbProcess.GetNumThreads(); - for (MIuint i = 0; i < nThreads; i++) { - lldb::SBThread thread = sbProcess.GetThreadAtIndex(i); - if (thread.IsValid()) { - CMICmnMIValueTuple miTuple; - if (!rSessionInfo.MIResponseFormThreadInfo( - m_cmdData, thread, - CMICmnLLDBDebugSessionInfo::eThreadInfoFormat_AllFrames, miTuple)) - return MIstatus::failure; - - m_vecMIValueTuple.push_back(miTuple); - } - } - - // -thread-info with multiple threads ends with the current thread id if any - if (thread.IsValid()) { - const CMIUtilString strId(CMIUtilString::Format("%d", thread.GetIndexID())); - CMICmnMIValueConst miValueCurrThreadId(strId); - m_miValueCurrThreadId = miValueCurrThreadId; - m_bHasCurrentThread = true; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdThreadInfo::Acknowledge() { - if (m_bSingleThread) { - if (m_bThreadInvalid) { - const CMICmnMIValueConst miValueConst("invalid thread id"); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - // MI print - // "%s^done,threads=[{id=\"%d\",target-id=\"%s\",frame={},state=\"%s\"}] - const CMICmnMIValueList miValueList(m_miValueTupleThread); - const CMICmnMIValueResult miValueResult("threads", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - // Build up a list of thread information from tuples - VecMIValueTuple_t::const_iterator it = m_vecMIValueTuple.begin(); - if (it == m_vecMIValueTuple.end()) { - const CMICmnMIValueConst miValueConst("[]"); - const CMICmnMIValueResult miValueResult("threads", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - CMICmnMIValueList miValueList(*it); - ++it; - while (it != m_vecMIValueTuple.end()) { - const CMICmnMIValueTuple &rTuple(*it); - miValueList.Add(rTuple); - - // Next - ++it; - } - - CMICmnMIValueResult miValueResult("threads", miValueList); - if (m_bHasCurrentThread) { - CMIUtilString strCurrThreadId = "current-thread-id"; - miValueResult.Add(strCurrThreadId, m_miValueCurrThreadId); - } - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdThreadInfo::CreateSelf() { - return new CMICmdCmdThreadInfo(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdTrace.h b/lldb/tools/lldb-mi/MICmdCmdTrace.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdTrace.h +++ /dev/null @@ -1,50 +0,0 @@ -//===-- MICmdCmdTrace.h -----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdTraceStatus interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "trace-status". -//-- -class CMICmdCmdTraceStatus : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdTraceStatus(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdTraceStatus() override; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdTrace.cpp b/lldb/tools/lldb-mi/MICmdCmdTrace.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdTrace.cpp +++ /dev/null @@ -1,88 +0,0 @@ -//===-- MICmdCmdTrace.cpp ---------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdTraceStatus implementation. - -// In-house headers: -#include "MICmdCmdTrace.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" - -//++ -// Details: CMICmdCmdTraceStatus constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdTraceStatus::CMICmdCmdTraceStatus() { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "trace-status"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdTraceStatus::CreateSelf; -} - -//++ -// Details: CMICmdCmdTraceStatus destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdTraceStatus::~CMICmdCmdTraceStatus() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTraceStatus::Execute() { - // Do nothing - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdTraceStatus::Acknowledge() { - const CMICmnMIValueConst miValueConst(MIRSRC(IDS_CMD_ERR_NOT_IMPLEMENTED)); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdTraceStatus::CreateSelf() { - return new CMICmdCmdTraceStatus(); -} diff --git a/lldb/tools/lldb-mi/MICmdCmdVar.h b/lldb/tools/lldb-mi/MICmdCmdVar.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdVar.h +++ /dev/null @@ -1,348 +0,0 @@ -//===-- MICmdCmdVar.h -------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdVarCreate interface. -// CMICmdCmdVarUpdate interface. -// CMICmdCmdVarDelete interface. -// CMICmdCmdVarAssign interface. -// CMICmdCmdVarSetFormat interface. -// CMICmdCmdVarListChildren interface. -// CMICmdCmdVarEvaluateExpression interface. -// CMICmdCmdVarInfoPathExpression interface. -// CMICmdCmdVarShowAttributes interface. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp -// For an introduction to adding a new command see -// CMICmdCmdSupportInfoMiCmdQuery -// command class as an example. - -#pragma once - -// In-house headers: -#include "MICmdBase.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugSessionInfoVarObj.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" - -// Declarations: -class CMICmnLLDBDebugSessionInfoVarObj; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "var-create". -//-- -class CMICmdCmdVarCreate : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdVarCreate(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmdCmdVarCreate() override; - - // Methods: -private: - void CompleteSBValue(lldb::SBValue &vrwValue); - - // Attribute: -private: - CMIUtilString m_strVarName; - MIuint m_nChildren; - MIuint64 m_nThreadId; - CMIUtilString m_strType; - bool m_bValid; // True = Variable is valid, false = not valid - CMIUtilString m_strExpression; - CMIUtilString m_strValue; - const CMIUtilString m_constStrArgName; - const CMIUtilString m_constStrArgFrameAddr; - const CMIUtilString m_constStrArgExpression; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "var-update". -//-- -class CMICmdCmdVarUpdate : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdVarUpdate(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmdCmdVarUpdate() override; - - // Methods: -private: - bool ExamineSBValueForChange(lldb::SBValue &vrwValue, bool &vrwbChanged); - void MIFormResponse(const CMIUtilString &vrStrVarName, - const char *const vpValue, - const CMIUtilString &vrStrScope); - - // Attribute: -private: - const CMIUtilString m_constStrArgPrintValues; - const CMIUtilString m_constStrArgName; - bool m_bValueChanged; // True = yes value changed, false = no change - CMICmnMIValueList m_miValueList; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "var-delete". -//-- -class CMICmdCmdVarDelete : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdVarDelete(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdVarDelete() override; - - // Attribute: -private: - const CMIUtilString m_constStrArgName; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "var-assign". -//-- -class CMICmdCmdVarAssign : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdVarAssign(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdVarAssign() override; - - // Attributes: -private: - bool m_bOk; // True = success, false = failure - CMIUtilString m_varObjName; - const CMIUtilString m_constStrArgName; - const CMIUtilString m_constStrArgExpression; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "var-set-format". -//-- -class CMICmdCmdVarSetFormat : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdVarSetFormat(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdVarSetFormat() override; - - // Attributes: -private: - CMIUtilString m_varObjName; - const CMIUtilString m_constStrArgName; - const CMIUtilString m_constStrArgFormatSpec; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "var-list-children". -//-- -class CMICmdCmdVarListChildren : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdVarListChildren(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdVarListChildren() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgPrintValues; - const CMIUtilString m_constStrArgName; - const CMIUtilString m_constStrArgFrom; - const CMIUtilString m_constStrArgTo; - bool m_bValueValid; // True = yes SBValue object is valid, false = not valid - MIuint m_nChildren; - CMICmnMIValueList m_miValueList; - bool m_bHasMore; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "var-evaluate-expression". -//-- -class CMICmdCmdVarEvaluateExpression : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdVarEvaluateExpression(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdVarEvaluateExpression() override; - - // Attributes: -private: - bool m_bValueValid; // True = yes SBValue object is valid, false = not valid - CMIUtilString m_varObjName; - const CMIUtilString m_constStrArgFormatSpec; // Not handled by *this command - const CMIUtilString m_constStrArgName; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "var-info-path-expression". -//-- -class CMICmdCmdVarInfoPathExpression : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdVarInfoPathExpression(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdVarInfoPathExpression() override; - - // Attributes: -private: - bool m_bValueValid; // True = yes SBValue object is valid, false = not valid - CMIUtilString m_strPathExpression; - const CMIUtilString m_constStrArgName; -}; - -//++ -//============================================================================ -// Details: MI command class. MI commands derived from the command base class. -// *this class implements MI command "var-show-attributes". -//-- -class CMICmdCmdVarShowAttributes : public CMICmdBase { - // Statics: -public: - // Required by the CMICmdFactory when registering *this command - static CMICmdBase *CreateSelf(); - - // Methods: -public: - /* ctor */ CMICmdCmdVarShowAttributes(); - - // Overridden: -public: - // From CMICmdInvoker::ICmd - bool Execute() override; - bool Acknowledge() override; - bool ParseArgs() override; - // From CMICmnBase - /* dtor */ ~CMICmdCmdVarShowAttributes() override; - - // Attributes: -private: - const CMIUtilString m_constStrArgName; -}; diff --git a/lldb/tools/lldb-mi/MICmdCmdVar.cpp b/lldb/tools/lldb-mi/MICmdCmdVar.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCmdVar.cpp +++ /dev/null @@ -1,1460 +0,0 @@ -//===-- MICmdCmdVar.cpp -----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: CMICmdCmdVarCreate implementation. -// CMICmdCmdVarUpdate implementation. -// CMICmdCmdVarDelete implementation. -// CMICmdCmdVarAssign implementation. -// CMICmdCmdVarSetFormat implementation. -// CMICmdCmdVarListChildren implementation. -// CMICmdCmdVarEvaluateExpression implementation. -// CMICmdCmdVarInfoPathExpression implementation. -// CMICmdCmdVarShowAttributes implementation. - -// Third Party Headers: -#include "lldb/API/SBStream.h" -#include "lldb/API/SBThread.h" -#include "lldb/API/SBType.h" - -// In-house headers: -#include "MICmdArgValListOfN.h" -#include "MICmdArgValNumber.h" -#include "MICmdArgValOptionLong.h" -#include "MICmdArgValOptionShort.h" -#include "MICmdArgValPrintValues.h" -#include "MICmdArgValString.h" -#include "MICmdArgValThreadGrp.h" -#include "MICmdCmdVar.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnLLDBProxySBValue.h" -#include "MICmnLLDBUtilSBValue.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" - -#include - -//++ -// Details: CMICmdCmdVarCreate constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarCreate::CMICmdCmdVarCreate() - : m_nChildren(0), m_nThreadId(0), m_strType("??"), m_bValid(false), - m_strValue("??"), m_constStrArgName("name"), - m_constStrArgFrameAddr("frame-addr"), - m_constStrArgExpression("expression") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "var-create"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdVarCreate::CreateSelf; -} - -//++ -// Details: CMICmdCmdVarCreate destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarCreate::~CMICmdCmdVarCreate() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarCreate::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgName, false, true)); - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgFrameAddr, false, true)); - m_setCmdArgs.Add( - new CMICmdArgValString(m_constStrArgExpression, true, true, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarCreate::Execute() { - CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread); - CMICMDBASE_GETOPTION(pArgFrame, OptionLong, m_constStrArgFrame); - CMICMDBASE_GETOPTION(pArgName, String, m_constStrArgName); - CMICMDBASE_GETOPTION(pArgFrameAddr, String, m_constStrArgFrameAddr); - CMICMDBASE_GETOPTION(pArgExpression, String, m_constStrArgExpression); - - // Retrieve the --thread option's thread ID (only 1) - MIuint64 nThreadId = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgThread->GetExpectedOption(nThreadId)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgThread.c_str())); - return MIstatus::failure; - } - - // Retrieve the --frame option's number - MIuint64 nFrame = UINT64_MAX; - if (pArgThread->GetFound() && - !pArgFrame->GetExpectedOption(nFrame)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgFrame.c_str())); - return MIstatus::failure; - } - - const CMICmdArgValOptionLong::VecArgObjPtr_t &rVecFrameId( - pArgFrame->GetExpectedOptions()); - CMICmdArgValOptionLong::VecArgObjPtr_t::const_iterator it2 = - rVecFrameId.begin(); - if (it2 != rVecFrameId.end()) { - const CMICmdArgValNumber *pOption = static_cast(*it2); - nFrame = pOption->GetValue(); - } - - m_strVarName = ""; - if (pArgName->GetFound()) { - const CMIUtilString &rArg = pArgName->GetValue(); - const bool bAutoName = (rArg == "-"); - if (bAutoName) { - m_strVarName = CMIUtilString::Format( - "var%u", CMICmnLLDBDebugSessionInfoVarObj::VarObjIdGet()); - CMICmnLLDBDebugSessionInfoVarObj::VarObjIdInc(); - } else - m_strVarName = rArg; - } - - bool bCurrentFrame = false; - if (pArgFrameAddr->GetFound()) { - const CMIUtilString &rStrFrameAddr(pArgFrameAddr->GetValue()); - bCurrentFrame = CMIUtilString::Compare(rStrFrameAddr, "*"); - if (!bCurrentFrame && (nFrame == UINT64_MAX)) { - // FIXME: *addr isn't implemented. Exit with error if --thread isn't - // specified. - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), - m_cmdData.strMiCmd.c_str(), - m_constStrArgFrame.c_str())); - return MIstatus::failure; - } - } - - const CMIUtilString &rStrExpression(pArgExpression->GetValue()); - m_strExpression = rStrExpression; - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - lldb::SBThread thread = (nThreadId != UINT64_MAX) - ? sbProcess.GetThreadByIndexID(nThreadId) - : sbProcess.GetSelectedThread(); - m_nThreadId = thread.GetIndexID(); - lldb::SBFrame frame = bCurrentFrame ? thread.GetSelectedFrame() - : thread.GetFrameAtIndex(nFrame); - lldb::SBValue value; - - if (rStrExpression[0] == '$') { - const CMIUtilString rStrRegister(rStrExpression.substr(1)); - value = frame.FindRegister(rStrRegister.c_str()); - } else { - const bool bArgs = true; - const bool bLocals = true; - const bool bStatics = true; - const bool bInScopeOnly = true; - const lldb::SBValueList valueList = - frame.GetVariables(bArgs, bLocals, bStatics, bInScopeOnly); - value = valueList.GetFirstValueByName(rStrExpression.c_str()); - } - - if (!value.IsValid()) - value = frame.EvaluateExpression(rStrExpression.c_str()); - - if (value.IsValid() && value.GetError().Success()) { - CompleteSBValue(value); - m_bValid = true; - m_nChildren = value.GetNumChildren(); - m_strType = CMICmnLLDBUtilSBValue(value).GetTypeNameDisplay(); - - // This gets added to CMICmnLLDBDebugSessionInfoVarObj static container of - // varObjs - CMICmnLLDBDebugSessionInfoVarObj varObj(rStrExpression, m_strVarName, - value); - m_strValue = varObj.GetValueFormatted(); - } else { - m_strValue = value.GetError().GetCString(); - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarCreate::Acknowledge() { - if (m_bValid) { - // MI print - // "%s^done,name=\"%s\",numchild=\"%d\",value=\"%s\",type=\"%s\",thread-id=\"%llu\",has_more=\"%u\"" - const CMICmnMIValueConst miValueConst(m_strVarName); - CMICmnMIValueResult miValueResultAll("name", miValueConst); - const CMIUtilString strNumChild(CMIUtilString::Format("%d", m_nChildren)); - const CMICmnMIValueConst miValueConst2(strNumChild); - miValueResultAll.Add("numchild", miValueConst2); - const CMICmnMIValueConst miValueConst3(m_strValue); - miValueResultAll.Add("value", miValueConst3); - const CMICmnMIValueConst miValueConst4(m_strType); - miValueResultAll.Add("type", miValueConst4); - const CMIUtilString strThreadId(CMIUtilString::Format("%llu", m_nThreadId)); - const CMICmnMIValueConst miValueConst5(strThreadId); - miValueResultAll.Add("thread-id", miValueConst5); - const CMICmnMIValueConst miValueConst6("0"); - miValueResultAll.Add("has_more", miValueConst6); - - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResultAll); - m_miResultRecord = miRecordResult; - - return MIstatus::success; - } - - CMIUtilString strErrMsg(m_strValue); - if (m_strValue.empty()) - strErrMsg = CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_VARIABLE_CREATION_FAILED), m_strExpression.c_str()); - const CMICmnMIValueConst miValueConst( - strErrMsg.Escape(true /* vbEscapeQuotes */)); - CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdVarCreate::CreateSelf() { - return new CMICmdCmdVarCreate(); -} - -//++ -// Details: Complete SBValue object and its children to get -// SBValue::GetValueDidChange -// work. -// Type: Method. -// Args: vrwValue - (R) Value to update. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -void CMICmdCmdVarCreate::CompleteSBValue(lldb::SBValue &vrwValue) { - // Force a value to update - vrwValue.GetValueDidChange(); - - // And update its children - lldb::SBType valueType = vrwValue.GetType(); - if (!valueType.IsPointerType() && !valueType.IsReferenceType()) { - const MIuint nChildren = vrwValue.GetNumChildren(); - for (MIuint i = 0; i < nChildren; ++i) { - lldb::SBValue member = vrwValue.GetChildAtIndex(i); - if (member.IsValid()) - CompleteSBValue(member); - } - } -} - - -//++ -// Details: CMICmdCmdVarUpdate constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarUpdate::CMICmdCmdVarUpdate() - : m_constStrArgPrintValues("print-values"), m_constStrArgName("name"), - m_bValueChanged(false), m_miValueList(true) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "var-update"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdVarUpdate::CreateSelf; -} - -//++ -// Details: CMICmdCmdVarUpdate destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarUpdate::~CMICmdCmdVarUpdate() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarUpdate::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValPrintValues(m_constStrArgPrintValues, false, true)); - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgName, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarUpdate::Execute() { - CMICMDBASE_GETOPTION(pArgPrintValues, PrintValues, m_constStrArgPrintValues); - CMICMDBASE_GETOPTION(pArgName, String, m_constStrArgName); - - CMICmnLLDBDebugSessionInfo::VariableInfoFormat_e eVarInfoFormat = - CMICmnLLDBDebugSessionInfo::eVariableInfoFormat_NoValues; - if (pArgPrintValues->GetFound()) - eVarInfoFormat = - static_cast( - pArgPrintValues->GetValue()); - - const CMIUtilString &rVarObjName(pArgName->GetValue()); - CMICmnLLDBDebugSessionInfoVarObj varObj; - if (!CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(rVarObjName, varObj)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_DOESNOTEXIST), - m_cmdData.strMiCmd.c_str(), - rVarObjName.c_str())); - return MIstatus::failure; - } - - lldb::SBValue &rValue = varObj.GetValue(); - if (!ExamineSBValueForChange(rValue, m_bValueChanged)) - return MIstatus::failure; - - if (m_bValueChanged) { - varObj.UpdateValue(); - const bool bPrintValue( - (eVarInfoFormat == - CMICmnLLDBDebugSessionInfo::eVariableInfoFormat_AllValues) || - (eVarInfoFormat == - CMICmnLLDBDebugSessionInfo::eVariableInfoFormat_SimpleValues && - rValue.GetNumChildren() == 0)); - const CMIUtilString strValue(bPrintValue ? varObj.GetValueFormatted() : ""); - const CMIUtilString strInScope(rValue.IsInScope() ? "true" : "false"); - MIFormResponse(rVarObjName, bPrintValue ? strValue.c_str() : nullptr, - strInScope); - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarUpdate::Acknowledge() { - if (m_bValueChanged) { - // MI print - // "%s^done,changelist=[{name=\"%s\",value=\"%s\",in_scope=\"%s\",type_changed=\"false\",has_more=\"0\"}]" - CMICmnMIValueResult miValueResult("changelist", m_miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - } else { - // MI print "%s^done,changelist=[]" - const CMICmnMIValueList miValueList(true); - CMICmnMIValueResult miValueResult6("changelist", miValueList); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult6); - m_miResultRecord = miRecordResult; - } - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdVarUpdate::CreateSelf() { - return new CMICmdCmdVarUpdate(); -} - -//++ -// Details: Form the MI response for multiple variables. -// Type: Method. -// Args: vrStrVarName - (R) Session var object's name. -// vpValue - (R) Text version of the value held in the -// variable. -// vrStrScope - (R) In scope "yes" or "no". -// Return: None. -// Throws: None. -//-- -void CMICmdCmdVarUpdate::MIFormResponse(const CMIUtilString &vrStrVarName, - const char *const vpValue, - const CMIUtilString &vrStrScope) { - // MI print - // "[{name=\"%s\",value=\"%s\",in_scope=\"%s\",type_changed=\"false\",has_more=\"0\"}]" - const CMICmnMIValueConst miValueConst(vrStrVarName); - const CMICmnMIValueResult miValueResult("name", miValueConst); - CMICmnMIValueTuple miValueTuple(miValueResult); - if (vpValue != nullptr) { - const CMICmnMIValueConst miValueConst2(vpValue); - const CMICmnMIValueResult miValueResult2("value", miValueConst2); - miValueTuple.Add(miValueResult2); - } - const CMICmnMIValueConst miValueConst3(vrStrScope); - const CMICmnMIValueResult miValueResult3("in_scope", miValueConst3); - miValueTuple.Add(miValueResult3); - const CMICmnMIValueConst miValueConst4("false"); - const CMICmnMIValueResult miValueResult4("type_changed", miValueConst4); - miValueTuple.Add(miValueResult4); - const CMICmnMIValueConst miValueConst5("0"); - const CMICmnMIValueResult miValueResult5("has_more", miValueConst5); - miValueTuple.Add(miValueResult5); - m_miValueList.Add(miValueTuple); -} - -//++ -// Details: Determine if the var object was changed. -// Type: Method. -// Args: vrVarObj - (R) Session var object to examine. -// vrwbChanged - (W) True = The var object was changed, -// False = It was not changed. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarUpdate::ExamineSBValueForChange(lldb::SBValue &vrwValue, - bool &vrwbChanged) { - if (vrwValue.GetValueDidChange()) { - vrwbChanged = true; - return MIstatus::success; - } - - const MIuint nChildren = vrwValue.GetNumChildren(); - for (MIuint i = 0; i < nChildren; ++i) { - lldb::SBValue member = vrwValue.GetChildAtIndex(i); - if (!member.IsValid()) - continue; - - // skip pointers and references to avoid infinite loop - if (member.GetType().GetTypeFlags() & - (lldb::eTypeIsPointer | lldb::eTypeIsReference)) - continue; - - // Handle composite types (i.e. struct or arrays) - if (ExamineSBValueForChange(member, vrwbChanged) && vrwbChanged) - return MIstatus::success; - } - vrwbChanged = false; - return MIstatus::success; -} - - -//++ -// Details: CMICmdCmdVarDelete constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarDelete::CMICmdCmdVarDelete() : m_constStrArgName("name") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "var-delete"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdVarDelete::CreateSelf; -} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarDelete::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgName, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: CMICmdCmdVarDelete destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarDelete::~CMICmdCmdVarDelete() {} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarDelete::Execute() { - CMICMDBASE_GETOPTION(pArgName, String, m_constStrArgName); - - const CMIUtilString &rVarObjName(pArgName->GetValue()); - CMICmnLLDBDebugSessionInfoVarObj::VarObjDelete(rVarObjName); - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarDelete::Acknowledge() { - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdVarDelete::CreateSelf() { - return new CMICmdCmdVarDelete(); -} - - -//++ -// Details: CMICmdCmdVarAssign constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarAssign::CMICmdCmdVarAssign() - : m_bOk(true), m_constStrArgName("name"), - m_constStrArgExpression("expression") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "var-assign"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdVarAssign::CreateSelf; -} - -//++ -// Details: CMICmdCmdVarAssign destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarAssign::~CMICmdCmdVarAssign() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarAssign::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgName, true, true)); - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgExpression, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarAssign::Execute() { - CMICMDBASE_GETOPTION(pArgName, String, m_constStrArgName); - CMICMDBASE_GETOPTION(pArgExpression, String, m_constStrArgExpression); - - const CMIUtilString &rVarObjName(pArgName->GetValue()); - const CMIUtilString &rExpression(pArgExpression->GetValue()); - - CMICmnLLDBDebugSessionInfoVarObj varObj; - if (!CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(rVarObjName, varObj)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_DOESNOTEXIST), - m_cmdData.strMiCmd.c_str(), - rVarObjName.c_str())); - return MIstatus::failure; - } - m_varObjName = rVarObjName; - - CMIUtilString strExpression(rExpression.Trim()); - strExpression = strExpression.Trim('"'); - lldb::SBValue &rValue(const_cast(varObj.GetValue())); - m_bOk = rValue.SetValueFromCString(strExpression.c_str()); - if (m_bOk) - varObj.UpdateValue(); - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarAssign::Acknowledge() { - if (m_bOk) { - // MI print "%s^done,value=\"%s\"" - CMICmnLLDBDebugSessionInfoVarObj varObj; - CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(m_varObjName, varObj); - const CMICmnMIValueConst miValueConst(varObj.GetValueFormatted()); - const CMICmnMIValueResult miValueResult("value", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; - } - - const CMICmnMIValueConst miValueConst("expression could not be evaluated"); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdVarAssign::CreateSelf() { - return new CMICmdCmdVarAssign(); -} - - -//++ -// Details: CMICmdCmdVarSetFormat constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarSetFormat::CMICmdCmdVarSetFormat() - : m_constStrArgName("name"), m_constStrArgFormatSpec("format-spec") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "var-set-format"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdVarSetFormat::CreateSelf; -} - -//++ -// Details: CMICmdCmdVarSetFormat destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarSetFormat::~CMICmdCmdVarSetFormat() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarSetFormat::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgName, true, true)); - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgFormatSpec, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarSetFormat::Execute() { - CMICMDBASE_GETOPTION(pArgName, String, m_constStrArgName); - CMICMDBASE_GETOPTION(pArgFormatSpec, String, m_constStrArgFormatSpec); - - const CMIUtilString &rVarObjName(pArgName->GetValue()); - const CMIUtilString &rExpression(pArgFormatSpec->GetValue()); - - CMICmnLLDBDebugSessionInfoVarObj varObj; - if (!CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(rVarObjName, varObj)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_DOESNOTEXIST), - m_cmdData.strMiCmd.c_str(), - rVarObjName.c_str())); - return MIstatus::failure; - } - if (!varObj.SetVarFormat( - CMICmnLLDBDebugSessionInfoVarObj::GetVarFormatForString( - rExpression))) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_ENUM_INVALID), - m_cmdData.strMiCmd.c_str(), - rVarObjName.c_str(), rExpression.c_str())); - return MIstatus::failure; - } - varObj.UpdateValue(); - - m_varObjName = rVarObjName; - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarSetFormat::Acknowledge() { - // MI print - // "%s^done,changelist=[{name=\"%s\",value=\"%s\",in_scope=\"%s\",type_changed=\"false\",has_more=\"0\"}]" - CMICmnLLDBDebugSessionInfoVarObj varObj; - CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(m_varObjName, varObj); - const CMICmnMIValueConst miValueConst(m_varObjName); - const CMICmnMIValueResult miValueResult("name", miValueConst); - CMICmnMIValueTuple miValueTuple(miValueResult); - const CMICmnMIValueConst miValueConst2(varObj.GetValueFormatted()); - const CMICmnMIValueResult miValueResult2("value", miValueConst2); - miValueTuple.Add(miValueResult2); - lldb::SBValue &rValue = const_cast(varObj.GetValue()); - const CMICmnMIValueConst miValueConst3(rValue.IsInScope() ? "true" : "false"); - const CMICmnMIValueResult miValueResult3("in_scope", miValueConst3); - miValueTuple.Add(miValueResult3); - const CMICmnMIValueConst miValueConst4("false"); - const CMICmnMIValueResult miValueResult4("type_changed", miValueConst4); - miValueTuple.Add(miValueResult4); - const CMICmnMIValueConst miValueConst5("0"); - const CMICmnMIValueResult miValueResult5("type_changed", miValueConst5); - miValueTuple.Add(miValueResult5); - const CMICmnMIValueList miValueList(miValueTuple); - const CMICmnMIValueResult miValueResult6("changelist", miValueList); - - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult6); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdVarSetFormat::CreateSelf() { - return new CMICmdCmdVarSetFormat(); -} - - -//++ -// Details: CMICmdCmdVarListChildren constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarListChildren::CMICmdCmdVarListChildren() - : m_constStrArgPrintValues("print-values"), m_constStrArgName("name"), - m_constStrArgFrom("from"), m_constStrArgTo("to"), m_bValueValid(false), - m_nChildren(0), m_miValueList(true), m_bHasMore(false) { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "var-list-children"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdVarListChildren::CreateSelf; -} - -//++ -// Details: CMICmdCmdVarListChildren destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarListChildren::~CMICmdCmdVarListChildren() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarListChildren::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValPrintValues(m_constStrArgPrintValues, false, true)); - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgName, true, true, true)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgFrom, false, true)); - m_setCmdArgs.Add(new CMICmdArgValNumber(m_constStrArgTo, false, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarListChildren::Execute() { - CMICMDBASE_GETOPTION(pArgPrintValues, PrintValues, m_constStrArgPrintValues); - CMICMDBASE_GETOPTION(pArgName, String, m_constStrArgName); - CMICMDBASE_GETOPTION(pArgFrom, Number, m_constStrArgFrom); - CMICMDBASE_GETOPTION(pArgTo, Number, m_constStrArgTo); - - CMICmnLLDBDebugSessionInfo::VariableInfoFormat_e eVarInfoFormat = - CMICmnLLDBDebugSessionInfo::eVariableInfoFormat_NoValues; - if (pArgPrintValues->GetFound()) - eVarInfoFormat = - static_cast( - pArgPrintValues->GetValue()); - - const CMIUtilString &rVarObjName(pArgName->GetValue()); - CMICmnLLDBDebugSessionInfoVarObj varObj; - if (!CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(rVarObjName, varObj)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_DOESNOTEXIST), - m_cmdData.strMiCmd.c_str(), - rVarObjName.c_str())); - return MIstatus::failure; - } - - MIuint nFrom = 0; - MIuint nTo = UINT32_MAX; - if (pArgFrom->GetFound() && pArgTo->GetFound()) { - nFrom = pArgFrom->GetValue(); - nTo = pArgTo->GetValue(); - } else if (pArgFrom->GetFound() || pArgTo->GetFound()) { - // Only from or to was specified but both are required - SetError( - CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_CHILD_RANGE_INVALID), - m_cmdData.strMiCmd.c_str())); - return MIstatus::failure; - } - - lldb::SBValue &rValue = const_cast(varObj.GetValue()); - m_bValueValid = rValue.IsValid(); - if (!m_bValueValid) - return MIstatus::success; - - const MIuint nChildren = rValue.GetNumChildren(); - m_bHasMore = nTo < nChildren; - nTo = std::min(nTo, nChildren); - m_nChildren = nFrom < nTo ? nTo - nFrom : 0; - for (MIuint i = nFrom; i < nTo; i++) { - lldb::SBValue member = rValue.GetChildAtIndex(i); - const CMICmnLLDBUtilSBValue utilValue(member); - const CMIUtilString strExp = utilValue.GetName(); - const CMIUtilString name( - strExp.empty() ? CMIUtilString::Format("%s.$%u", rVarObjName.c_str(), i) - : CMIUtilString::Format("%s.%s", rVarObjName.c_str(), - strExp.c_str())); - const MIuint nChildren = member.GetNumChildren(); - const CMIUtilString strThreadId( - CMIUtilString::Format("%u", member.GetThread().GetIndexID())); - - // Varobj gets added to CMICmnLLDBDebugSessionInfoVarObj static container of - // varObjs - CMICmnLLDBDebugSessionInfoVarObj var(strExp, name, member, rVarObjName); - - // MI print - // "child={name=\"%s\",exp=\"%s\",numchild=\"%d\",value=\"%s\",type=\"%s\",thread-id=\"%u\",has_more=\"%u\"}" - const CMICmnMIValueConst miValueConst(name); - const CMICmnMIValueResult miValueResult("name", miValueConst); - CMICmnMIValueTuple miValueTuple(miValueResult); - const CMICmnMIValueConst miValueConst2(strExp); - const CMICmnMIValueResult miValueResult2("exp", miValueConst2); - miValueTuple.Add(miValueResult2); - const CMIUtilString strNumChild(CMIUtilString::Format("%u", nChildren)); - const CMICmnMIValueConst miValueConst3(strNumChild); - const CMICmnMIValueResult miValueResult3("numchild", miValueConst3); - miValueTuple.Add(miValueResult3); - const CMICmnMIValueConst miValueConst5(utilValue.GetTypeNameDisplay()); - const CMICmnMIValueResult miValueResult5("type", miValueConst5); - miValueTuple.Add(miValueResult5); - const CMICmnMIValueConst miValueConst6(strThreadId); - const CMICmnMIValueResult miValueResult6("thread-id", miValueConst6); - miValueTuple.Add(miValueResult6); - // nChildren == 0 is used to check for simple values - if (eVarInfoFormat == - CMICmnLLDBDebugSessionInfo::eVariableInfoFormat_AllValues || - (eVarInfoFormat == - CMICmnLLDBDebugSessionInfo::eVariableInfoFormat_SimpleValues && - nChildren == 0)) { - const CMIUtilString strValue( - CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted( - member, CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Natural)); - const CMICmnMIValueConst miValueConst7(strValue); - const CMICmnMIValueResult miValueResult7("value", miValueConst7); - miValueTuple.Add(miValueResult7); - } - const CMICmnMIValueConst miValueConst8("0"); - const CMICmnMIValueResult miValueResult8("has_more", miValueConst8); - miValueTuple.Add(miValueResult8); - const CMICmnMIValueResult miValueResult9("child", miValueTuple); - m_miValueList.Add(miValueResult9); - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarListChildren::Acknowledge() { - if (m_bValueValid) { - // MI print "%s^done,numchild=\"%u\",children=[%s],has_more=\"%d\"" - const CMIUtilString strNumChild(CMIUtilString::Format("%u", m_nChildren)); - const CMICmnMIValueConst miValueConst(strNumChild); - CMICmnMIValueResult miValueResult("numchild", miValueConst); - if (m_nChildren != 0) - miValueResult.Add("children", m_miValueList); - const CMIUtilString strHasMore(m_bHasMore ? "1" : "0"); - const CMICmnMIValueConst miValueConst2(strHasMore); - miValueResult.Add("has_more", miValueConst2); - - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; - } - - // MI print "%s^error,msg=\"variable invalid\"" - const CMICmnMIValueConst miValueConst("variable invalid"); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdVarListChildren::CreateSelf() { - return new CMICmdCmdVarListChildren(); -} - - -//++ -// Details: CMICmdCmdVarEvaluateExpression constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarEvaluateExpression::CMICmdCmdVarEvaluateExpression() - : m_bValueValid(true), m_constStrArgFormatSpec("-f"), - m_constStrArgName("name") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "var-evaluate-expression"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdVarEvaluateExpression::CreateSelf; -} - -//++ -// Details: CMICmdCmdVarEvaluateExpression destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarEvaluateExpression::~CMICmdCmdVarEvaluateExpression() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarEvaluateExpression::ParseArgs() { - m_setCmdArgs.Add( - new CMICmdArgValOptionShort(m_constStrArgFormatSpec, false, false, - CMICmdArgValListBase::eArgValType_String, 1)); - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgName, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarEvaluateExpression::Execute() { - CMICMDBASE_GETOPTION(pArgName, String, m_constStrArgName); - - const CMIUtilString &rVarObjName(pArgName->GetValue()); - CMICmnLLDBDebugSessionInfoVarObj varObj; - if (!CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(rVarObjName, varObj)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_DOESNOTEXIST), - m_cmdData.strMiCmd.c_str(), - rVarObjName.c_str())); - return MIstatus::failure; - } - - lldb::SBValue &rValue = const_cast(varObj.GetValue()); - m_bValueValid = rValue.IsValid(); - if (!m_bValueValid) - return MIstatus::success; - - m_varObjName = rVarObjName; - varObj.UpdateValue(); - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarEvaluateExpression::Acknowledge() { - if (m_bValueValid) { - CMICmnLLDBDebugSessionInfoVarObj varObj; - CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(m_varObjName, varObj); - const CMICmnMIValueConst miValueConst(varObj.GetValueFormatted()); - const CMICmnMIValueResult miValueResult("value", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - const CMICmnMIValueConst miValueConst("variable invalid"); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdVarEvaluateExpression::CreateSelf() { - return new CMICmdCmdVarEvaluateExpression(); -} - - -//++ -// Details: CMICmdCmdVarInfoPathExpression constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarInfoPathExpression::CMICmdCmdVarInfoPathExpression() - : m_bValueValid(true), m_constStrArgName("name") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "var-info-path-expression"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdVarInfoPathExpression::CreateSelf; -} - -//++ -// Details: CMICmdCmdVarInfoPathExpression destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarInfoPathExpression::~CMICmdCmdVarInfoPathExpression() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarInfoPathExpression::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgName, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarInfoPathExpression::Execute() { - CMICMDBASE_GETOPTION(pArgName, String, m_constStrArgName); - - const CMIUtilString &rVarObjName(pArgName->GetValue()); - CMICmnLLDBDebugSessionInfoVarObj varObj; - if (!CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(rVarObjName, varObj)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_DOESNOTEXIST), - m_cmdData.strMiCmd.c_str(), - rVarObjName.c_str())); - return MIstatus::failure; - } - - lldb::SBValue &rValue = const_cast(varObj.GetValue()); - m_bValueValid = rValue.IsValid(); - if (!m_bValueValid) - return MIstatus::success; - - lldb::SBStream stream; - if (!rValue.GetExpressionPath(stream, true)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_EXPRESSIONPATH), - m_cmdData.strMiCmd.c_str(), - rVarObjName.c_str())); - return MIstatus::failure; - } - - const char *pPathExpression = stream.GetData(); - if (pPathExpression == nullptr) { - // Build expression from what we do know - m_strPathExpression = varObj.GetNameReal(); - return MIstatus::success; - } - - // Has LLDB returned a var signature of it's own - if (pPathExpression[0] != '$') { - m_strPathExpression = pPathExpression; - return MIstatus::success; - } - - // Build expression from what we do know - const CMIUtilString &rVarParentName(varObj.GetVarParentName()); - if (rVarParentName.empty()) { - m_strPathExpression = varObj.GetNameReal(); - } else { - CMICmnLLDBDebugSessionInfoVarObj varObjParent; - if (!CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(rVarParentName, - varObjParent)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_DOESNOTEXIST), - m_cmdData.strMiCmd.c_str(), - rVarParentName.c_str())); - return MIstatus::failure; - } - m_strPathExpression = - CMIUtilString::Format("%s.%s", varObjParent.GetNameReal().c_str(), - varObj.GetNameReal().c_str()); - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarInfoPathExpression::Acknowledge() { - if (m_bValueValid) { - const CMICmnMIValueConst miValueConst(m_strPathExpression); - const CMICmnMIValueResult miValueResult("path_expr", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - - const CMICmnMIValueConst miValueConst("variable invalid"); - const CMICmnMIValueResult miValueResult("msg", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdVarInfoPathExpression::CreateSelf() { - return new CMICmdCmdVarInfoPathExpression(); -} - - -//++ -// Details: CMICmdCmdVarShowAttributes constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarShowAttributes::CMICmdCmdVarShowAttributes() - : m_constStrArgName("name") { - // Command factory matches this name with that received from the stdin stream - m_strMiCmd = "var-show-attributes"; - - // Required by the CMICmdFactory when registering *this command - m_pSelfCreatorFn = &CMICmdCmdVarShowAttributes::CreateSelf; -} - -//++ -// Details: CMICmdCmdVarShowAttributes destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdCmdVarShowAttributes::~CMICmdCmdVarShowAttributes() {} - -//++ -// Details: The invoker requires this function. The parses the command line -// options -// arguments to extract values for each of those arguments. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarShowAttributes::ParseArgs() { - m_setCmdArgs.Add(new CMICmdArgValString(m_constStrArgName, true, true)); - return ParseValidateCmdOptions(); -} - -//++ -// Details: The invoker requires this function. The command does work in this -// function. -// The command is likely to communicate with the LLDB SBDebugger in -// here. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarShowAttributes::Execute() { - CMICMDBASE_GETOPTION(pArgName, String, m_constStrArgName); - - const CMIUtilString &rVarObjName(pArgName->GetValue()); - CMICmnLLDBDebugSessionInfoVarObj varObj; - if (!CMICmnLLDBDebugSessionInfoVarObj::VarObjGet(rVarObjName, varObj)) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_DOESNOTEXIST), - m_cmdData.strMiCmd.c_str(), - rVarObjName.c_str())); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: The invoker requires this function. The command prepares a MI Record -// Result -// for the work carried out in the Execute(). -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdCmdVarShowAttributes::Acknowledge() { - // MI output: "%s^done,status=\"editable\"]" - const CMICmnMIValueConst miValueConst("editable"); - const CMICmnMIValueResult miValueResult("status", miValueConst); - const CMICmnMIResultRecord miRecordResult( - m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, - miValueResult); - m_miResultRecord = miRecordResult; - - return MIstatus::success; -} - -//++ -// Details: Required by the CMICmdFactory when registering *this command. The -// factory -// calls this function to create an instance of *this command. -// Type: Static method. -// Args: None. -// Return: CMICmdBase * - Pointer to a new command. -// Throws: None. -//-- -CMICmdBase *CMICmdCmdVarShowAttributes::CreateSelf() { - return new CMICmdCmdVarShowAttributes(); -} diff --git a/lldb/tools/lldb-mi/MICmdCommands.h b/lldb/tools/lldb-mi/MICmdCommands.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCommands.h +++ /dev/null @@ -1,19 +0,0 @@ -//===-- MICmdCommands.h -----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -namespace MICmnCommands { - -//++ -//============================================================================ -// Details: MI Command are instantiated and registered automatically with the -// Command Factory -//-- -bool RegisterAll(); -} diff --git a/lldb/tools/lldb-mi/MICmdCommands.cpp b/lldb/tools/lldb-mi/MICmdCommands.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdCommands.cpp +++ /dev/null @@ -1,134 +0,0 @@ -//===-- MICmdCommands.cpp ---------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: MI command are registered with the MI command factory. -// -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp - -// In-house headers: -#include "MICmdCommands.h" -#include "MICmdCmd.h" -#include "MICmdCmdBreak.h" -#include "MICmdCmdData.h" -#include "MICmdCmdEnviro.h" -#include "MICmdCmdExec.h" -#include "MICmdCmdFile.h" -#include "MICmdCmdGdbInfo.h" -#include "MICmdCmdGdbSet.h" -#include "MICmdCmdGdbShow.h" -#include "MICmdCmdGdbThread.h" -#include "MICmdCmdMiscellanous.h" -#include "MICmdCmdStack.h" -#include "MICmdCmdSupportInfo.h" -#include "MICmdCmdSupportList.h" -#include "MICmdCmdSymbol.h" -#include "MICmdCmdTarget.h" -#include "MICmdCmdThread.h" -#include "MICmdCmdTrace.h" -#include "MICmdCmdVar.h" -#include "MICmdFactory.h" - -namespace MICmnCommands { -template static bool Register(); -} - -//++ -// Details: Command to command factory registration function. -// Type: Template function. -// Args: typename T - A command type class. -// Return: bool - True = yes command is registered, false = command failed to -// register. -// Throws: None. -//-- -template static bool MICmnCommands::Register() { - static CMICmdFactory &rCmdFactory = CMICmdFactory::Instance(); - const CMIUtilString strMiCmd = T().GetMiCmd(); - CMICmdFactory::CmdCreatorFnPtr fn = T().GetCmdCreatorFn(); - return rCmdFactory.CmdRegister(strMiCmd, fn); -} - -//++ -// Details: Register commands with MI command factory -// Type: Function. -// Args: None. -// Return: bool - True = yes all commands are registered, -// false = one or more commands failed to register. -// Throws: None. -//-- -bool MICmnCommands::RegisterAll() { - bool bOk = MIstatus::success; - - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - bOk &= Register(); - - return bOk; -} diff --git a/lldb/tools/lldb-mi/MICmdData.h b/lldb/tools/lldb-mi/MICmdData.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdData.h +++ /dev/null @@ -1,58 +0,0 @@ -//===-- MICmdData.h ---------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnResources.h" - -//++ -//============================================================================ -// Details: MI command metadata. Holds the command's name, MI number and options -// as found on stdin. Holds the command's MI output (written to -// stdout). -//-- -struct SMICmdData { - SMICmdData() - : id(0), bCmdValid(false), bCmdExecutedSuccessfully(false), - bMIOldStyle(false), bHasResultRecordExtra(false) {} - - MIuint id; // A command's unique ID i.e. GUID - CMIUtilString strMiCmdToken; // The command's MI token (a number) - CMIUtilString strMiCmd; // The command's name - CMIUtilString strMiCmdOption; // The command's arguments or options - CMIUtilString strMiCmdAll; // The text as received from the client - CMIUtilString - strMiCmdResultRecord; // Each command forms 1 response to its input - CMIUtilString strMiCmdResultRecordExtra; // Hack command produce more response - // text to help the client because of - // using LLDB - bool bCmdValid; // True = Valid MI format command, false = invalid - bool bCmdExecutedSuccessfully; // True = Command finished successfully, false - // = Did not start/did not complete - CMIUtilString strErrorDescription; // Command failed this is why - bool bMIOldStyle; // True = format "3thread", false = format "3-thread" - bool bHasResultRecordExtra; // True = Yes command produced additional MI - // output to its 1 line response, false = no extra - // MI output formed - - void Clear() { - id = 0; - strMiCmdToken.clear(); - strMiCmd = MIRSRC(IDS_CMD_ERR_CMD_RUN_BUT_NO_ACTION); - strMiCmdOption.clear(); - strMiCmdAll.clear(); - strMiCmdResultRecord.clear(); - strMiCmdResultRecordExtra.clear(); - bCmdValid = false; - bCmdExecutedSuccessfully = false; - strErrorDescription.clear(); - bMIOldStyle = false; - bHasResultRecordExtra = false; - } -}; diff --git a/lldb/tools/lldb-mi/MICmdData.cpp b/lldb/tools/lldb-mi/MICmdData.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdData.cpp +++ /dev/null @@ -1,10 +0,0 @@ -//===-- MICmdData.cpp -------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdData.h" diff --git a/lldb/tools/lldb-mi/MICmdFactory.h b/lldb/tools/lldb-mi/MICmdFactory.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdFactory.h +++ /dev/null @@ -1,84 +0,0 @@ -//===-- MICmdFactory.h ------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers -#include - -// In-house headers: -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" - -// Declarations: -class CMICmdBase; -struct SMICmdData; - -//++ -//============================================================================ -// Details: MI Command Factory. Holds a list of registered MI commands that -// MI application understands to interpret. Creates commands objects. -// The Command Factory is carried out in the main thread. -// A singleton class. -//-- -class CMICmdFactory : public CMICmnBase, public MI::ISingleton { - friend class MI::ISingleton; - - // Typedefs: -public: - typedef CMICmdBase *(*CmdCreatorFnPtr)(); - - // Class: -public: - //++ - // Description: Command's factory's interface for commands to implement. - //-- - class ICmd { - public: - virtual const CMIUtilString &GetMiCmd() const = 0; - virtual CmdCreatorFnPtr GetCmdCreatorFn() const = 0; - // virtual CMICmdBase * CreateSelf( void ) = 0; // Not - // possible as require a static creator - // function in the command class, here for awareness - - /* dtor */ virtual ~ICmd() {} - }; - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - bool CmdRegister(const CMIUtilString &vMiCmd, CmdCreatorFnPtr vCmdCreateFn); - bool CmdCreate(const CMIUtilString &vMiCmd, const SMICmdData &vCmdData, - CMICmdBase *&vpNewCmd); - bool CmdExist(const CMIUtilString &vMiCmd) const; - - // Methods: -private: - /* ctor */ CMICmdFactory(); - /* ctor */ CMICmdFactory(const CMICmdFactory &); - void operator=(const CMICmdFactory &); - - bool HaveAlready(const CMIUtilString &vMiCmd) const; - bool IsValid(const CMIUtilString &vMiCmd) const; - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmdFactory() override; - - // Typedefs: -private: - typedef std::map MapMiCmdToCmdCreatorFn_t; - typedef std::pair - MapPairMiCmdToCmdCreatorFn_t; - - // Attributes: -private: - MapMiCmdToCmdCreatorFn_t m_mapMiCmdToCmdCreatorFn; -}; diff --git a/lldb/tools/lldb-mi/MICmdFactory.cpp b/lldb/tools/lldb-mi/MICmdFactory.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdFactory.cpp +++ /dev/null @@ -1,206 +0,0 @@ -//===-- MICmdFactory.cpp ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdFactory.h" -#include "MICmdBase.h" -#include "MICmdCommands.h" -#include "MICmdData.h" -#include "MICmnResources.h" - -//++ -// Details: CMICmdFactory constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdFactory::CMICmdFactory() {} - -//++ -// Details: CMICmdFactory destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdFactory::~CMICmdFactory() { Shutdown(); } - -//++ -// Details: Initialize resources for *this Command factory. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmdFactory::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - m_bInitialized = true; - - MICmnCommands::RegisterAll(); - - return MIstatus::success; -} - -//++ -// Details: Release resources for *this Command Factory. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmdFactory::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - m_mapMiCmdToCmdCreatorFn.clear(); - - m_bInitialized = false; - - return MIstatus::success; -} - -//++ -// Details: Register a command's creator function with the command identifier -// the MI -// command name i.e. 'file-exec-and-symbols'. -// Type: Method. -// Args: vMiCmd - (R) Command's name, the MI command. -// vCmdCreateFn - (R) Command's creator function pointer. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmdFactory::CmdRegister(const CMIUtilString &vMiCmd, - CmdCreatorFnPtr vCmdCreateFn) { - if (!IsValid(vMiCmd)) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_CMDFACTORY_ERR_INVALID_CMD_NAME), vMiCmd.c_str())); - return MIstatus::failure; - } - if (vCmdCreateFn == nullptr) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_CMDFACTORY_ERR_INVALID_CMD_CR8FN), vMiCmd.c_str())); - return MIstatus::failure; - } - - if (HaveAlready(vMiCmd)) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_CMDFACTORY_ERR_CMD_ALREADY_REGED), vMiCmd.c_str())); - return MIstatus::failure; - } - - MapPairMiCmdToCmdCreatorFn_t pr(vMiCmd, vCmdCreateFn); - m_mapMiCmdToCmdCreatorFn.insert(pr); - - return MIstatus::success; -} - -//++ -// Details: Check a command is already registered. -// Type: Method. -// Args: vMiCmd - (R) Command's name, the MI command. -// Return: True - registered. -// False - not found. -// Throws: None. -//-- -bool CMICmdFactory::HaveAlready(const CMIUtilString &vMiCmd) const { - const MapMiCmdToCmdCreatorFn_t::const_iterator it = - m_mapMiCmdToCmdCreatorFn.find(vMiCmd); - return it != m_mapMiCmdToCmdCreatorFn.end(); -} - -//++ -// Details: Check a command's name is valid: -// - name is not empty -// - name does not have spaces -// Type: Method. -// Args: vMiCmd - (R) Command's name, the MI command. -// Return: True - valid. -// False - not valid. -// Throws: None. -//-- -bool CMICmdFactory::IsValid(const CMIUtilString &vMiCmd) const { - bool bValid = true; - - if (vMiCmd.empty()) { - bValid = false; - return false; - } - - const size_t nPos = vMiCmd.find(' '); - if (nPos != std::string::npos) - bValid = false; - - return bValid; -} - -//++ -// Details: Check a command is already registered. -// Type: Method. -// Args: vMiCmd - (R) Command's name, the MI command. -// Return: True - registered. -// False - not found. -// Throws: None. -//-- -bool CMICmdFactory::CmdExist(const CMIUtilString &vMiCmd) const { - return HaveAlready(vMiCmd); -} - -//++ -// Details: Create a command given the specified MI command name. The command -// data object -// contains the options for the command. -// Type: Method. -// Args: vMiCmd - (R) Command's name, the MI command. -// vCmdData - (RW) Command's metadata status/information/result -// object. -// vpNewCmd - (W) New command instance. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmdFactory::CmdCreate(const CMIUtilString &vMiCmd, - const SMICmdData &vCmdData, - CMICmdBase *&vpNewCmd) { - vpNewCmd = nullptr; - - if (!IsValid(vMiCmd)) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_CMDFACTORY_ERR_INVALID_CMD_NAME), vMiCmd.c_str())); - return MIstatus::failure; - } - if (!HaveAlready(vMiCmd)) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_CMDFACTORY_ERR_CMD_NOT_REGISTERED), vMiCmd.c_str())); - return MIstatus::failure; - } - - const MapMiCmdToCmdCreatorFn_t::const_iterator it = - m_mapMiCmdToCmdCreatorFn.find(vMiCmd); - const CMIUtilString &rMiCmd((*it).first); - MIunused(rMiCmd); - CmdCreatorFnPtr pFn = (*it).second; - CMICmdBase *pCmd = (*pFn)(); - - SMICmdData cmdData(vCmdData); - cmdData.id = pCmd->GetGUID(); - pCmd->SetCmdData(cmdData); - vpNewCmd = pCmd; - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MICmdInterpreter.h b/lldb/tools/lldb-mi/MICmdInterpreter.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdInterpreter.h +++ /dev/null @@ -1,62 +0,0 @@ -//===-- MICmdInterpreter.h --------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmdData.h" -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" - -// Declarations: -class CMICmdFactory; - -//++ -//============================================================================ -// Details: MI command interpreter. It takes text data from the MI driver -// (which got it from Stdin singleton) and validate the text to see if -// matches Machine Interface (MI) format and commands defined in the -// MI application. -// A singleton class. -//-- -class CMICmdInterpreter : public CMICmnBase, - public MI::ISingleton { - friend MI::ISingleton; - - // Methods: -public: - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - bool ValidateIsMi(const CMIUtilString &vTextLine, bool &vwbYesValid, - bool &vwbCmdNotInCmdFactor, SMICmdData &rwCmdData); - - // Methods: -private: - /* ctor */ CMICmdInterpreter(); - /* ctor */ CMICmdInterpreter(const CMICmdInterpreter &); - void operator=(const CMICmdInterpreter &); - - bool HasCmdFactoryGotMiCmd(const SMICmdData &vCmdData) const; - bool MiHasCmdTokenEndingHyphen(const CMIUtilString &vTextLine); - bool MiHasCmdTokenEndingAlpha(const CMIUtilString &vTextLine); - bool MiHasCmd(const CMIUtilString &vTextLine); - bool MiHasCmdTokenPresent(const CMIUtilString &vTextLine); - const SMICmdData &MiGetCmdData() const; - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmdInterpreter() override; - - // Attributes: -private: - SMICmdData m_miCmdData; // Filled in on each new line being interpreted - CMICmdFactory &m_rCmdFactory; -}; diff --git a/lldb/tools/lldb-mi/MICmdInterpreter.cpp b/lldb/tools/lldb-mi/MICmdInterpreter.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdInterpreter.cpp +++ /dev/null @@ -1,290 +0,0 @@ -//===-- MICmdInterpreter.cpp ------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdInterpreter.h" -#include "MICmdFactory.h" - -//++ -// Details: CMICmdInterpreter constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdInterpreter::CMICmdInterpreter() - : m_rCmdFactory(CMICmdFactory::Instance()) {} - -//++ -// Details: CMICmdInterpreter destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdInterpreter::~CMICmdInterpreter() { Shutdown(); } - -//++ -// Details: Initialize resources for *this Command Interpreter. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdInterpreter::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - m_bInitialized = true; - - return MIstatus::success; -} - -//++ -// Details: Release resources for *this Command Interpreter. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdInterpreter::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - m_bInitialized = false; - - return MIstatus::success; -} - -//++ -// Details: Establish whether the text data is an MI format type command. -// Type: Method. -// Args: vTextLine - (R) Text data to interpret. -// vwbYesValid - (W) True = MI type command, false = not -// recognised. -// vwbCmdNotInCmdFactor - (W) True = MI command not found in the -// command factory, false = recognised. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdInterpreter::ValidateIsMi(const CMIUtilString &vTextLine, - bool &vwbYesValid, - bool &vwbCmdNotInCmdFactor, - SMICmdData &rwCmdData) { - vwbYesValid = false; - vwbCmdNotInCmdFactor = false; - rwCmdData.Clear(); - - if (vTextLine.empty()) - return MIstatus::success; - - // MI format is [cmd #]-[command name][command arg(s)] - // i.e. 1-file-exec-and-symbols --thread-group i1 DEVICE_EXECUTABLE - // 5-data-evaluate-expression --thread 1 --frame 0 *(argv) - - m_miCmdData.Clear(); - m_miCmdData.strMiCmd = vTextLine; - - // The following change m_miCmdData as valid parts are identified - vwbYesValid = (MiHasCmdTokenEndingHyphen(vTextLine) || - MiHasCmdTokenEndingAlpha(vTextLine)); - vwbYesValid = vwbYesValid && MiHasCmd(vTextLine); - if (vwbYesValid) { - vwbCmdNotInCmdFactor = !HasCmdFactoryGotMiCmd(MiGetCmdData()); - vwbYesValid = !vwbCmdNotInCmdFactor; - } - - // Update command's meta data valid state - m_miCmdData.bCmdValid = vwbYesValid; - - // Ok to return new updated command information - rwCmdData = MiGetCmdData(); - - return MIstatus::success; -} - -//++ -// Details: Establish whether the command name entered on the stdin stream is -// recognised by -// the MI driver. -// Type: Method. -// Args: vCmd - (R) Command information structure. -// Return: bool - True = yes command is recognised, false = command not -// recognised. -// Throws: None. -//-- -bool CMICmdInterpreter::HasCmdFactoryGotMiCmd(const SMICmdData &vCmd) const { - return m_rCmdFactory.CmdExist(vCmd.strMiCmd); -} - -//++ -// Details: Does the command entered match the criteria for a MI command format. -// The format to validate against is 'nn-' where there can be 1 to n -// digits. -// I.e. '2-gdb-exit'. -// Is the execution token present? The command token is entered into -// the -// command meta data structure whether correct or not for reporting or -// later -// command execution purposes. -// Type: Method. -// Args: vTextLine - (R) Text data to interpret. -// Return: bool - True = yes command token present, false = command not -// recognised. -// Throws: None. -//-- -bool CMICmdInterpreter::MiHasCmdTokenEndingHyphen( - const CMIUtilString &vTextLine) { - // The hyphen is mandatory - const size_t nPos = vTextLine.find('-', 0); - if ((nPos == std::string::npos)) - return false; - - if (MiHasCmdTokenPresent(vTextLine)) { - const std::string strNum = vTextLine.substr(0, nPos); - if (!CMIUtilString(strNum).IsNumber()) - return false; - - m_miCmdData.strMiCmdToken = strNum; - } - - m_miCmdData.bMIOldStyle = false; - - return true; -} - -//++ -// Details: Does the command entered match the criteria for a MI command format. -// The format to validate against is 'nnA' where there can be 1 to n -// digits. -// 'A' represents any non numeric token. I.e. '1source .gdbinit'. -// Is the execution token present? The command token is entered into -// the -// command meta data structure whether correct or not for reporting or -// later -// command execution purposes. -// Type: Method. -// Args: vTextLine - (R) Text data to interpret. -// Return: bool - True = yes command token present, false = command not -// recognised. -// Throws: None. -//-- -bool CMICmdInterpreter::MiHasCmdTokenEndingAlpha( - const CMIUtilString &vTextLine) { - char cChar = vTextLine[0]; - MIuint i = 0; - while (::isdigit(cChar) != 0) { - cChar = vTextLine[++i]; - } - if (::isalpha(cChar) == 0) - return false; - if (i == 0) - return false; - - const std::string strNum = vTextLine.substr(0, i); - m_miCmdData.strMiCmdToken = strNum.c_str(); - m_miCmdData.bMIOldStyle = true; - - return true; -} - -//++ -// Details: Does the command entered match the criteria for a MI command format. -// Is the command token present before the hyphen? -// Type: Method. -// Args: vTextLine - (R) Text data to interpret. -// Return: bool - True = yes command token present, false = token not present. -// Throws: None. -//-- -bool CMICmdInterpreter::MiHasCmdTokenPresent(const CMIUtilString &vTextLine) { - const size_t nPos = vTextLine.find('-', 0); - return (nPos > 0); -} - -//++ -// Details: Does the command name entered match the criteria for a MI command -// format. -// Is a recognised command present? The command name is entered into -// the -// command meta data structure whether correct or not for reporting or -// later -// command execution purposes. Command options is present are also put -// into the -// command meta data structure. -// Type: Method. -// Args: vTextLine - (R) Command information structure. -// Return: bool - True = yes command name present, false = command not -// recognised. -// Throws: None. -//-- -bool CMICmdInterpreter::MiHasCmd(const CMIUtilString &vTextLine) { - size_t nPos = 0; - if (m_miCmdData.bMIOldStyle) { - char cChar = vTextLine[0]; - size_t i = 0; - while (::isdigit(cChar) != 0) { - cChar = vTextLine[++i]; - } - nPos = --i; - } else { - nPos = vTextLine.find('-', 0); - } - - bool bFoundCmd = false; - const size_t nLen = vTextLine.length(); - const size_t nPos2 = vTextLine.find(' ', nPos); - if (nPos2 != std::string::npos) { - if (nPos2 == nLen) - return false; - const CMIUtilString cmd = - CMIUtilString(vTextLine.substr(nPos + 1, nPos2 - nPos - 1)); - if (cmd.empty()) - return false; - - m_miCmdData.strMiCmd = cmd; - - if (nPos2 < nLen) - m_miCmdData.strMiCmdOption = - CMIUtilString(vTextLine.substr(nPos2 + 1, nLen - nPos2 - 1)); - - bFoundCmd = true; - } else { - const CMIUtilString cmd = - CMIUtilString(vTextLine.substr(nPos + 1, nLen - nPos - 1)); - if (cmd.empty()) - return false; - m_miCmdData.strMiCmd = cmd; - bFoundCmd = true; - } - - if (bFoundCmd) - m_miCmdData.strMiCmdAll = vTextLine; - - return bFoundCmd; -} - -//++ -// Details: Retrieve the just entered new command from stdin. It contains the -// command -// name, number and any options. -// Type: Method. -// Args: vTextLine - (R) Command information structure. -// Return: SMICmdData & - Command meta data information/result/status. -// Throws: None. -//-- -const SMICmdData &CMICmdInterpreter::MiGetCmdData() const { - return m_miCmdData; -} diff --git a/lldb/tools/lldb-mi/MICmdInvoker.h b/lldb/tools/lldb-mi/MICmdInvoker.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdInvoker.h +++ /dev/null @@ -1,103 +0,0 @@ -//===-- MICmdInvoker.h ------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers -#include - -// In-house headers: -#include "MICmdData.h" -#include "MICmdMgrSetCmdDeleteCallback.h" -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" - -// Declarations: -class CMICmdBase; -class CMICmnStreamStdout; - -//++ -//============================================================================ -// Details: MI Command Invoker. The Invoker works on the command pattern design. -// There two main jobs; action command Execute() function, followed by -// the command's Acknowledge() function. When a command has finished -// its -// execute function it returns to the invoker. The invoker then calls -// the -// command's Acknowledge() function to do more work, form and give -// back a MI result. In the meantime the Command Monitor is monitoring -// the each command doing their Execute() function work so they do not -// exceed a time limit which if it exceeds informs the command(s) to -// stop work. -// The work by the Invoker is carried out in the main thread. -// The Invoker takes ownership of any commands created which means it -// is the only object to delete them when a command is finished -// working. -// A singleton class. -//-- -class CMICmdInvoker : public CMICmnBase, - public CMICmdMgrSetCmdDeleteCallback::ICallback, - public MI::ISingleton { - friend class MI::ISingleton; - - // Class: -public: - //++ - // Description: Invoker's interface for commands to implement. - //-- - class ICmd { - public: - virtual bool Acknowledge() = 0; - virtual bool Execute() = 0; - virtual bool ParseArgs() = 0; - virtual void SetCmdData(const SMICmdData &vCmdData) = 0; - virtual const SMICmdData &GetCmdData() const = 0; - virtual const CMIUtilString &GetErrorDescription() const = 0; - virtual void CmdFinishedTellInvoker() const = 0; - virtual const CMIUtilString &GetMIResultRecord() const = 0; - virtual const CMIUtilString &GetMIResultRecordExtra() const = 0; - virtual bool HasMIResultRecordExtra() const = 0; - - /* dtor */ virtual ~ICmd() {} - }; - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - bool CmdExecute(CMICmdBase &vCmd); - bool CmdExecuteFinished(CMICmdBase &vCmd); - - // Typedefs: -private: - typedef std::map MapCmdIdToCmd_t; - typedef std::pair MapPairCmdIdToCmd_t; - - // Methods: -private: - /* ctor */ CMICmdInvoker(); - /* ctor */ CMICmdInvoker(const CMICmdInvoker &); - void operator=(const CMICmdInvoker &); - void CmdDeleteAll(); - bool CmdDelete(const MIuint vCmdId, const bool vbYesDeleteCmd = false); - bool CmdAdd(const CMICmdBase &vCmd); - bool CmdStdout(const SMICmdData &vCmdData) const; - void CmdCauseAppExit(const CMICmdBase &vCmd) const; - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmdInvoker() override; - // From CMICmdMgrSetCmdDeleteCallback::ICallback - void Delete(SMICmdData &vCmd) override; - - // Attributes: -private: - MapCmdIdToCmd_t m_mapCmdIdToCmd; - CMICmnStreamStdout &m_rStreamOut; -}; diff --git a/lldb/tools/lldb-mi/MICmdInvoker.cpp b/lldb/tools/lldb-mi/MICmdInvoker.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdInvoker.cpp +++ /dev/null @@ -1,321 +0,0 @@ -//===-- MICmdInvoker.cpp ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdInvoker.h" -#include "MICmdBase.h" -#include "MICmdMgr.h" -#include "MICmnLog.h" -#include "MICmnStreamStdout.h" -#include "MIDriver.h" - -//++ -// Details: CMICmdInvoker constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdInvoker::CMICmdInvoker() : m_rStreamOut(CMICmnStreamStdout::Instance()) {} - -//++ -// Details: CMICmdInvoker destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdInvoker::~CMICmdInvoker() { Shutdown(); } - -//++ -// Details: Initialize resources for *this Command Invoker. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdInvoker::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - m_bInitialized = true; - - return MIstatus::success; -} - -//++ -// Details: Release resources for *this Stdin stream. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdInvoker::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - CmdDeleteAll(); - - m_bInitialized = false; - - return MIstatus::success; -} - -//++ -// Details: Empty the map of invoked commands doing work. Command objects are -// deleted too. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmdInvoker::CmdDeleteAll() { - CMICmdMgr &rMgr = CMICmdMgr::Instance(); - MapCmdIdToCmd_t::const_iterator it = m_mapCmdIdToCmd.begin(); - while (it != m_mapCmdIdToCmd.end()) { - const MIuint cmdId((*it).first); - MIunused(cmdId); - CMICmdBase *pCmd = (*it).second; - const CMIUtilString &rCmdName(pCmd->GetCmdData().strMiCmd); - MIunused(rCmdName); - rMgr.CmdDelete(pCmd->GetCmdData()); - - // Next - ++it; - } - m_mapCmdIdToCmd.clear(); -} - -//++ -// Details: Remove from the map of invoked commands doing work a command that -// has finished -// its work. The command object is deleted too. -// Type: Method. -// Args: vId - (R) Command object's unique ID. -// vbYesDeleteCmd - (R) True = Delete command object, false = delete -// via the Command Manager. -// Return: None. -// Throws: None. -//-- -bool CMICmdInvoker::CmdDelete(const MIuint vId, - const bool vbYesDeleteCmd /*= false*/) { - CMICmdMgr &rMgr = CMICmdMgr::Instance(); - MapCmdIdToCmd_t::const_iterator it = m_mapCmdIdToCmd.find(vId); - if (it != m_mapCmdIdToCmd.end()) { - CMICmdBase *pCmd = (*it).second; - if (vbYesDeleteCmd) { - // Via registered interest command manager callback *this object to delete - // the command - m_mapCmdIdToCmd.erase(it); - delete pCmd; - } else - // Notify other interested object of this command's pending deletion - rMgr.CmdDelete(pCmd->GetCmdData()); - } - - if (m_mapCmdIdToCmd.empty()) - rMgr.CmdUnregisterForDeleteNotification(*this); - - return MIstatus::success; -} - -//++ -// Details: Add to the map of invoked commands doing work a command that is -// about to -// start to do work. -// Type: Method. -// Args: vCmd - (R) Command object. -// Return: None. -// Throws: None. -//-- -bool CMICmdInvoker::CmdAdd(const CMICmdBase &vCmd) { - if (m_mapCmdIdToCmd.empty()) { - CMICmdMgr &rMgr = CMICmdMgr::Instance(); - rMgr.CmdRegisterForDeleteNotification(*this); - } - - const MIuint &cmdId(vCmd.GetCmdData().id); - MapCmdIdToCmd_t::const_iterator it = m_mapCmdIdToCmd.find(cmdId); - if (it != m_mapCmdIdToCmd.end()) - return MIstatus::success; - - MapPairCmdIdToCmd_t pr(cmdId, const_cast(&vCmd)); - m_mapCmdIdToCmd.insert(pr); - - return MIstatus::success; -} - -//++ -// Details: Having previously had the potential command validated and found -// valid now -// get the command executed. -// If the Functionality returns MIstatus::failure call -// GetErrorDescription(). -// This function is used by the application's main thread. -// Type: Method. -// Args: vCmd - (RW) Command object. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmdInvoker::CmdExecute(CMICmdBase &vCmd) { - bool bOk = CmdAdd(vCmd); - - if (bOk) { - vCmd.AddCommonArgs(); - if (!vCmd.ParseArgs()) { - // Report command execution failed - const SMICmdData cmdData(vCmd.GetCmdData()); - CmdStdout(cmdData); - CmdCauseAppExit(vCmd); - CmdDelete(cmdData.id); - - // Proceed to wait or execute next command - return MIstatus::success; - } - } - - if (bOk && !vCmd.Execute()) { - // Report command execution failed - const SMICmdData cmdData(vCmd.GetCmdData()); - CmdStdout(cmdData); - CmdCauseAppExit(vCmd); - CmdDelete(cmdData.id); - - // Proceed to wait or execute next command - return MIstatus::success; - } - - bOk = CmdExecuteFinished(vCmd); - - return bOk; -} - -//++ -// Details: Called when a command has finished its Execution() work either -// synchronously -// because the command executed was the type a non event type or -// asynchronously -// via the command's callback (because of an SB Listener event). Needs -// to be called -// so that *this invoker call do some house keeping and then proceed to -// call -// the command's Acknowledge() function. -// Type: Method. -// Args: vCmd - (R) Command object. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmdInvoker::CmdExecuteFinished(CMICmdBase &vCmd) { - // Command finished now get the command to gather it's information and form - // the MI - // Result record - if (!vCmd.Acknowledge()) { - // Report command acknowledge functionality failed - const SMICmdData cmdData(vCmd.GetCmdData()); - CmdStdout(cmdData); - CmdCauseAppExit(vCmd); - CmdDelete(cmdData.id); - - // Proceed to wait or execute next command - return MIstatus::success; - } - - // Retrieve the command's latest data/information. Needed for commands of the - // event type so have - // a record of commands pending finishing execution. - const CMIUtilString &rMIResultRecord(vCmd.GetMIResultRecord()); - SMICmdData cmdData( - vCmd.GetCmdData()); // Make a copy as the command will be deleted soon - cmdData.strMiCmdResultRecord = rMIResultRecord; // Precautionary copy as the - // command might forget to do - // this - if (vCmd.HasMIResultRecordExtra()) { - cmdData.bHasResultRecordExtra = true; - const CMIUtilString &rMIExtra(vCmd.GetMIResultRecordExtra()); - cmdData.strMiCmdResultRecordExtra = - rMIExtra; // Precautionary copy as the command might forget to do this - } - - // Send command's MI response to the client - bool bOk = CmdStdout(cmdData); - - // Delete the command object as do not require anymore - bOk = bOk && CmdDelete(vCmd.GetCmdData().id); - - return bOk; -} - -//++ -// Details: If the MI Driver is not operating via a client i.e. Eclipse check -// the command -// on failure suggests the application exits. A command can be such -// that a -// failure cannot the allow the application to continue operating. -// Args: vCmd - (R) Command object. -// Return: None. -// Return: None. -// Throws: None. -//-- -void CMICmdInvoker::CmdCauseAppExit(const CMICmdBase &vCmd) const { - if (vCmd.GetExitAppOnCommandFailure()) { - CMIDriver &rDriver(CMIDriver::Instance()); - if (rDriver.IsDriverDebuggingArgExecutable()) { - rDriver.SetExitApplicationFlag(true); - } - } -} - -//++ -// Details: Write to stdout and the Log file the command's MI formatted result. -// Type: vCmdData - (R) A command's information. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Return: None. -// Throws: None. -//-- -bool CMICmdInvoker::CmdStdout(const SMICmdData &vCmdData) const { - bool bOk = m_pLog->WriteLog(vCmdData.strMiCmdAll); - const bool bLock = bOk && m_rStreamOut.Lock(); - bOk = bOk && bLock && - m_rStreamOut.WriteMIResponse(vCmdData.strMiCmdResultRecord); - if (bOk && vCmdData.bHasResultRecordExtra) { - bOk = m_rStreamOut.WriteMIResponse(vCmdData.strMiCmdResultRecordExtra); - } - bOk = bLock && m_rStreamOut.Unlock(); - - return bOk; -} - -//++ -// Details: Required by the CMICmdMgr::ICmdDeleteCallback. *this object is -// registered -// with the Command Manager to receive callbacks when a command is -// being deleted. -// An object, *this invoker, does not delete a command object itself -// but calls -// the Command Manager to delete a command object. This function is the -// Invoker's -// called. -// The Invoker owns the command objects and so can delete them but must -// do it -// via the manager so other objects can be notified of the deletion. -// Type: Method. -// Args: vCmd - (RW) Command. -// Return: None. -// Throws: None. -//-- -void CMICmdInvoker::Delete(SMICmdData &vCmd) { CmdDelete(vCmd.id, true); } diff --git a/lldb/tools/lldb-mi/MICmdMgr.h b/lldb/tools/lldb-mi/MICmdMgr.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdMgr.h +++ /dev/null @@ -1,69 +0,0 @@ -//===-- MICmdMgr.h ----------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers -#include - -// In-house headers: -#include "MICmdBase.h" -#include "MICmdMgrSetCmdDeleteCallback.h" -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" - -// Declarations: -class CMICmdInterpreter; -class CMICmdFactory; -class CMICmdInvoker; -class CMICmdBase; - -//++ -//============================================================================ -// Details: MI command manager. Oversees command operations, controls command -// production and the running of commands. -// Command Invoker, Command Factory and Command Monitor while -// independent -// units are overseen/managed by *this manager. -// A singleton class. -//-- -class CMICmdMgr : public CMICmnBase, public MI::ISingleton { - friend class MI::ISingleton; - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - - bool CmdInterpret(const CMIUtilString &vTextLine, bool &vwbYesValid, - bool &vwbCmdNotInCmdFactor, SMICmdData &rwCmdData); - bool CmdExecute(const SMICmdData &vCmdData); - bool CmdDelete(SMICmdData vCmdData); - bool CmdRegisterForDeleteNotification( - CMICmdMgrSetCmdDeleteCallback::ICallback &vObject); - bool CmdUnregisterForDeleteNotification( - CMICmdMgrSetCmdDeleteCallback::ICallback &vObject); - - // Methods: -private: - /* ctor */ CMICmdMgr(); - /* ctor */ CMICmdMgr(const CMICmdMgr &); - void operator=(const CMICmdMgr &); - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmdMgr() override; - - // Attributes: -private: - CMICmdInterpreter &m_interpretor; - CMICmdFactory &m_factory; - CMICmdInvoker &m_invoker; - CMICmdMgrSetCmdDeleteCallback::CSetClients m_setCmdDeleteCallback; -}; diff --git a/lldb/tools/lldb-mi/MICmdMgr.cpp b/lldb/tools/lldb-mi/MICmdMgr.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdMgr.cpp +++ /dev/null @@ -1,248 +0,0 @@ -//===-- MICmdMgr.cpp --------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdMgr.h" -#include "MICmdBase.h" -#include "MICmdFactory.h" -#include "MICmdInterpreter.h" -#include "MICmdInvoker.h" -#include "MICmnLog.h" -#include "MICmnResources.h" -#include "MIUtilSingletonBase.h" -#include "MIUtilSingletonHelper.h" - -//++ -// Details: CMICmdMgr constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdMgr::CMICmdMgr() - : m_interpretor(CMICmdInterpreter::Instance()), - m_factory(CMICmdFactory::Instance()), - m_invoker(CMICmdInvoker::Instance()) {} - -//++ -// Details: CMICmdMgr destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmdMgr::~CMICmdMgr() { Shutdown(); } - -//++ -// Details: Initialize resources for *this Command Manager. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmdMgr::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - - // Note initialization order is important here as some resources depend on - // previous - MI::ModuleInit(IDS_MI_INIT_ERR_LOG, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); - if (bOk && !m_interpretor.Initialize()) { - bOk = false; - errMsg = CMIUtilString::Format(MIRSRC(IDS_MI_INIT_ERR_CMDINTERPRETER), - m_interpretor.GetErrorDescription().c_str()); - } - if (bOk && !m_factory.Initialize()) { - bOk = false; - errMsg = CMIUtilString::Format(MIRSRC(IDS_MI_INIT_ERR_CMDFACTORY), - m_factory.GetErrorDescription().c_str()); - } - if (bOk && !m_invoker.Initialize()) { - bOk = false; - errMsg = CMIUtilString::Format(MIRSRC(IDS_MI_INIT_ERR_CMDINVOKER), - m_invoker.GetErrorDescription().c_str()); - } - m_bInitialized = bOk; - - if (!bOk) { - CMIUtilString strInitError( - CMIUtilString::Format(MIRSRC(IDS_MI_INIT_ERR_CMDMGR), errMsg.c_str())); - SetErrorDescription(strInitError); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: Release resources for *this Command Manager. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmdMgr::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - m_bInitialized = false; - - ClrErrorDescription(); - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - - // Tidy up - m_setCmdDeleteCallback.clear(); - - // Note shutdown order is important here - if (!m_invoker.Shutdown()) { - bOk = false; - errMsg += CMIUtilString::Format(MIRSRC(IDS_MI_SHTDWN_ERR_CMDINVOKER), - m_invoker.GetErrorDescription().c_str()); - } - if (!m_factory.Shutdown()) { - bOk = false; - if (!errMsg.empty()) - errMsg += ", "; - errMsg += CMIUtilString::Format(MIRSRC(IDS_MI_SHTDWN_ERR_CMDFACTORY), - m_factory.GetErrorDescription().c_str()); - } - if (!m_interpretor.Shutdown()) { - bOk = false; - if (!errMsg.empty()) - errMsg += ", "; - errMsg += - CMIUtilString::Format(MIRSRC(IDS_MI_SHTDWN_ERR_CMDINTERPRETER), - m_interpretor.GetErrorDescription().c_str()); - } - MI::ModuleShutdown(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_LOG, bOk, errMsg); - - if (!bOk) { - SetErrorDescriptionn(MIRSRC(IDS_MI_SHUTDOWN_ERR), errMsg.c_str()); - } - - return MIstatus::success; -} - -//++ -// Details: Establish whether the text data is an MI format type command. -// Type: Method. -// Args: vTextLine - (R) Text data to interpret. -// vwbYesValid - (W) True = MI type command, false = not -// recognised. -// vwbCmdNotInCmdFactor - (W) True = MI command not found in the -// command factor, false = recognised. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmdMgr::CmdInterpret(const CMIUtilString &vTextLine, bool &vwbYesValid, - bool &vwbCmdNotInCmdFactor, - SMICmdData &rwCmdData) { - return m_interpretor.ValidateIsMi(vTextLine, vwbYesValid, - vwbCmdNotInCmdFactor, rwCmdData); -} - -//++ -// Details: Having previously had the potential command validated and found -// valid now -// get the command executed. -// If the Functionality returns MIstatus::failure call -// GetErrorDescription(). -// This function is used by the application's main thread. -// Type: Method. -// Args: vCmdData - (RW) Command meta data. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmdMgr::CmdExecute(const SMICmdData &vCmdData) { - bool bOk = MIstatus::success; - - // Pass the command's meta data structure to the command - // so it can update it if required. (Need to copy it out of the - // command before the command is deleted) - CMICmdBase *pCmd = nullptr; - bOk = m_factory.CmdCreate(vCmdData.strMiCmd, vCmdData, pCmd); - if (!bOk) { - const CMIUtilString errMsg( - CMIUtilString::Format(MIRSRC(IDS_CMDMGR_ERR_CMD_FAILED_CREATE), - m_factory.GetErrorDescription().c_str())); - SetErrorDescription(errMsg); - return MIstatus::failure; - } - - bOk = m_invoker.CmdExecute(*pCmd); - if (!bOk) { - const CMIUtilString errMsg( - CMIUtilString::Format(MIRSRC(IDS_CMDMGR_ERR_CMD_INVOKER), - m_invoker.GetErrorDescription().c_str())); - SetErrorDescription(errMsg); - return MIstatus::failure; - } - - return bOk; -} - -//++ -// Details: Iterate all interested clients and tell them a command is being -// deleted. -// Type: Method. -// Args: vCmdData - (RW) The command to be deleted. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdMgr::CmdDelete(SMICmdData vCmdData) { - // Note vCmdData is a copy! The command holding its copy will be deleted soon - // we still need to iterate callback clients after a command object is deleted - - m_setCmdDeleteCallback.Delete(vCmdData); - - return MIstatus::success; -} - -//++ -// Details: Register an object to be called when a command object is deleted. -// Type: Method. -// Args: vObject - (R) A new interested client. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdMgr::CmdRegisterForDeleteNotification( - CMICmdMgrSetCmdDeleteCallback::ICallback &vObject) { - return m_setCmdDeleteCallback.Register(vObject); -} - -//++ -// Details: Unregister an object from being called when a command object is -// deleted. -// Type: Method. -// Args: vObject - (R) The was interested client. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmdMgr::CmdUnregisterForDeleteNotification( - CMICmdMgrSetCmdDeleteCallback::ICallback &vObject) { - return m_setCmdDeleteCallback.Unregister(vObject); -} diff --git a/lldb/tools/lldb-mi/MICmdMgrSetCmdDeleteCallback.h b/lldb/tools/lldb-mi/MICmdMgrSetCmdDeleteCallback.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdMgrSetCmdDeleteCallback.h +++ /dev/null @@ -1,72 +0,0 @@ -//===-- MICmdMgrSetCmdDeleteCallback.h --------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -//-- - -#pragma once - -// Third party headers: -#include - -// In-house headers: -#include "MICmnBase.h" - -// Declarations: -struct SMICmdData; - -namespace CMICmdMgrSetCmdDeleteCallback { - -//++ -//============================================================================ -// Details: MI Command Manager interface for client call back. -// Objects that want to be notified of a command being deleted -// inherit this interface and register interest in command object -// deletion. An object deleting a command must not do it itself but -// call -// the Command Manager CmdDelete() function to delete a command object. -//-- -class ICallback { -public: - virtual void Delete(SMICmdData &vCmd) = 0; - - /* dtor */ virtual ~ICallback() {} -}; - -//++ -//============================================================================ -// Details: MI Command Manager container for clients registered interest in -// command -// objects being deleted. Objects register an interest so when a -// command -// is to be deleted that object wanting the delete calls the Command -// Manager to delete the command object. In so do all other registered -// objects get called to about the deletion including the object -// wanting -// to do the delete in the first place. -//-- -class CSetClients : public std::set, public CMICmnBase { - // Methods: -public: - /* ctor */ CSetClients(); - - bool Register(class ICallback &vObject); - bool Unregister(class ICallback &vObject); - void Delete(SMICmdData &vCmdData); - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CSetClients() override; - - // Attributes: -private: - bool m_bClientUnregistered; // True = yes while deleting a client - // unregistered, false = no client unregistered - // during deletion -}; - -} // namespace CMICmdMgrSetCmdDeleteCallback diff --git a/lldb/tools/lldb-mi/MICmdMgrSetCmdDeleteCallback.cpp b/lldb/tools/lldb-mi/MICmdMgrSetCmdDeleteCallback.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmdMgrSetCmdDeleteCallback.cpp +++ /dev/null @@ -1,87 +0,0 @@ -//===-- MICmdMgrSetCmdDeleteCallback.cpp ------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmdMgrSetCmdDeleteCallback.h" - -namespace CMICmdMgrSetCmdDeleteCallback { - -//++ -// Details: CSetClients constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CSetClients::CSetClients() : m_bClientUnregistered(false) {} - -//++ -// Details: CSetClients destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CSetClients::~CSetClients() {} - -//++ -// Details: Register an object to be called when a command object is deleted. -// Type: Method. -// Args: vObject - (R) A new interested client. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CSetClients::Register(ICallback &vObject) { - insert(&vObject); - - return MIstatus::success; -} - -//++ -// Details: Unregister an object from being called when a command object is -// deleted. -// Type: Method. -// Args: vObject - (R) The was interested client. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CSetClients::Unregister(ICallback &vObject) { - m_bClientUnregistered = true; - erase(&vObject); - - return MIstatus::success; -} - -//++ -// Details: Iterate all interested clients and tell them a command is being -// deleted. -// Type: Method. -// Args: vCmd - (RW) The command to be deleted. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -void CSetClients::Delete(SMICmdData &vCmd) { - m_bClientUnregistered = false; // Reset - iterator it = begin(); - while (it != end()) { - ICallback *pObj = *it; - pObj->Delete(vCmd); - - if (m_bClientUnregistered) { - m_bClientUnregistered = false; // Reset - it = begin(); - } else - // Next - ++it; - } -} - -} // namespace CMICmdMgrSetCmdDeleteCallback diff --git a/lldb/tools/lldb-mi/MICmnBase.h b/lldb/tools/lldb-mi/MICmnBase.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnBase.h +++ /dev/null @@ -1,46 +0,0 @@ -//===-- MICmnBase.h ---------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MIDataTypes.h" -#include "MIUtilString.h" - -// Declarations: -class CMICmnLog; - -//++ -//============================================================================ -// Details: MI common code implementation base class. -//-- -class CMICmnBase { - // Methods: -public: - /* ctor */ CMICmnBase(); - - bool HaveErrorDescription() const; - const CMIUtilString &GetErrorDescription() const; - void SetErrorDescription(const CMIUtilString &vrTxt) const; - void SetErrorDescriptionn(const char *vFormat, ...) const; - void SetErrorDescriptionNoLog(const CMIUtilString &vrTxt) const; - void ClrErrorDescription() const; - - // Overrideable: -public: - /* dtor */ virtual ~CMICmnBase(); - - // Attributes: -protected: - mutable CMIUtilString m_strMILastErrorDescription; - bool m_bInitialized; // True = yes successfully initialized, false = no yet or - // failed - CMICmnLog *m_pLog; // Allow all derived classes to use the logger - MIint m_clientUsageRefCnt; // Count of client using *this object so not - // shutdown() object to early -}; diff --git a/lldb/tools/lldb-mi/MICmnBase.cpp b/lldb/tools/lldb-mi/MICmnBase.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnBase.cpp +++ /dev/null @@ -1,123 +0,0 @@ -//===-- MICmnBase.cpp -------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers -#include - -// In-house headers: -#include "MICmnBase.h" -#include "MICmnLog.h" -#include "MICmnStreamStderr.h" - -//++ -// Details: CMICmnBase constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnBase::CMICmnBase() - : m_strMILastErrorDescription(CMIUtilString()), m_bInitialized(false), - m_pLog(&CMICmnLog::Instance()), m_clientUsageRefCnt(0) {} - -//++ -// Details: CMICmnBase destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnBase::~CMICmnBase() { m_pLog = nullptr; } - -//++ -// Details: Retrieve whether *this object has an error description set. -// Type: Method. -// Args: None. -// Return: bool - True = Yes already defined, false = empty description. -// Throws: None. -//-- -bool CMICmnBase::HaveErrorDescription() const { - return m_strMILastErrorDescription.empty(); -} - -//++ -// Details: Retrieve MI's last error condition. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - Text description. -// Throws: None. -//-- -const CMIUtilString &CMICmnBase::GetErrorDescription() const { - return m_strMILastErrorDescription; -} - -//++ -// Details: Set MI's error condition description. This may be accessed by -// clients and -// seen by users. Message is available to the client using the server -// and sent -// to the Logger. -// Type: Method. -// Args: vrTxt - (R) Text description. -// Return: None. -// Throws: None. -//-- -void CMICmnBase::SetErrorDescription(const CMIUtilString &vrTxt) const { - m_strMILastErrorDescription = vrTxt; - if (!vrTxt.empty()) { - const CMIUtilString txt(CMIUtilString::Format("Error: %s", vrTxt.c_str())); - CMICmnStreamStderr::Instance().Write(txt); - } -} - -//++ -// Details: Set MI's error condition description. This may be accessed by -// clients and -// seen by users. Message is available to the client using the server -// and sent -// to the Logger. -// Type: Method. -// Args: vrTxt - (R) Text description. -// Return: None. -// Throws: None. -//-- -void CMICmnBase::SetErrorDescriptionNoLog(const CMIUtilString &vrTxt) const { - m_strMILastErrorDescription = vrTxt; -} - -//++ -// Details: Clear MI's error condition description. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmnBase::ClrErrorDescription() const { - m_strMILastErrorDescription.clear(); -} - -//++ -// Details: Set MI's error condition description. This may be accessed by -// clients and -// seen by users. Message is available to the client using the server -// and sent -// to the Logger. -// Type: Method. -// Args: vFormat - (R) Format string. -// ... - (R) Variable number of CMIUtilString type objects. -// Return: None. -// Throws: None. -//-- -void CMICmnBase::SetErrorDescriptionn(const char *vFormat, ...) const { - va_list args; - va_start(args, vFormat); - CMIUtilString strResult = CMIUtilString::FormatValist(vFormat, args); - va_end(args); - - SetErrorDescription(strResult); -} diff --git a/lldb/tools/lldb-mi/MICmnConfig.h b/lldb/tools/lldb-mi/MICmnConfig.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnConfig.h +++ /dev/null @@ -1,19 +0,0 @@ -//===-- MICmnConfig.h -------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -//-- -#pragma once - -// 1 = Show debug process attach modal dialog, 0 = do not show -// For windows only ATM, other OS's code is an infinite loop which a debugger -// must change a value to continue -#define MICONFIG_DEBUG_SHOW_ATTACH_DBG_DLG 0 - -// 1 = Write to MI's Log file warnings about commands that did not handle -// arguments or -// options present to them by the driver's client, 0 = no warnings given -#define MICONFIG_GIVE_WARNING_CMD_ARGS_NOT_HANDLED 1 diff --git a/lldb/tools/lldb-mi/MICmnLLDBBroadcaster.h b/lldb/tools/lldb-mi/MICmnLLDBBroadcaster.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBBroadcaster.h +++ /dev/null @@ -1,44 +0,0 @@ -//===-- MICmnLLDBBroadcaster.h ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" -#include "lldb/API/SBBroadcaster.h" - -//++ -//============================================================================ -// Details: MI derived class from LLDB SBBroadcaster API. -// -// *** This class (files) is a place holder until we know we need it or -// *** not -// -// A singleton class. -//-- -class CMICmnLLDBBroadcaster : public CMICmnBase, - public lldb::SBBroadcaster, - public MI::ISingleton { - friend MI::ISingleton; - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - // Methods: -private: - /* ctor */ CMICmnLLDBBroadcaster(); - /* ctor */ CMICmnLLDBBroadcaster(const CMICmnLLDBBroadcaster &); - void operator=(const CMICmnLLDBBroadcaster &); - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmnLLDBBroadcaster() override; -}; diff --git a/lldb/tools/lldb-mi/MICmnLLDBBroadcaster.cpp b/lldb/tools/lldb-mi/MICmnLLDBBroadcaster.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBBroadcaster.cpp +++ /dev/null @@ -1,68 +0,0 @@ -//===-- MICmnLLDBBroadcaster.cpp --------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnLLDBBroadcaster.h" - -//++ -// Details: CMICmnLLDBBroadcaster constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBBroadcaster::CMICmnLLDBBroadcaster() - : lldb::SBBroadcaster("MI driver") {} - -//++ -// Details: CMICmnLLDBBroadcaster destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBBroadcaster::~CMICmnLLDBBroadcaster() { Shutdown(); } - -//++ -// Details: Initialize resources for *this broadcaster object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBBroadcaster::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - m_bInitialized = MIstatus::success; - - return m_bInitialized; -} - -//++ -// Details: Release resources for *this broadcaster object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBBroadcaster::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - m_bInitialized = false; - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfo.h b/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfo.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfo.h +++ /dev/null @@ -1,292 +0,0 @@ -//===-- MICmnLLDBDebugSessionInfo.h -----------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers: -#include "lldb/API/SBDebugger.h" -#include "lldb/API/SBListener.h" -#include "lldb/API/SBProcess.h" -#include "lldb/API/SBTarget.h" -#include -#include - -// In-house headers: -#include "MICmnBase.h" -#include "MICmnLLDBDebugSessionInfoVarObj.h" -#include "MICmnMIValueTuple.h" -#include "MIUtilMapIdToVariant.h" -#include "MIUtilSingletonBase.h" -#include "MIUtilThreadBaseStd.h" - -// Declarations: -class CMICmnLLDBDebugger; -struct SMICmdData; -class CMICmnMIValueTuple; -class CMICmnMIValueList; - -//++ -//============================================================================ -// Details: MI debug session object that holds debugging information between -// instances of MI commands executing their work and producing MI -// result records. Information/data is set by one or many commands then -// retrieved by the same or other subsequent commands. -// It primarily holds LLDB type objects. -// A singleton class. -//-- -class CMICmnLLDBDebugSessionInfo - : public CMICmnBase, - public MI::ISingleton { - friend class MI::ISingleton; - - // Structs: -public: - //++ - //============================================================================ - // Details: Break point information object. Used to easily pass information - // about - // a break around and record break point information to be recalled - // by - // other commands or LLDB event handling functions. - //-- - struct SBrkPtInfo { - SBrkPtInfo() - : m_id(0), m_bDisp(false), m_bEnabled(false), m_pc(0), m_nLine(0), - m_bHaveArgOptionThreadGrp(false), m_nTimes(0), m_bPending(false), - m_nIgnore(0), m_bCondition(false), m_bBrkPtThreadId(false), - m_nBrkPtThreadId(0) {} - - MIuint m_id; // LLDB break point ID. - CMIUtilString m_strType; // Break point type. - bool m_bDisp; // True = "del", false = "keep". - bool m_bEnabled; // True = enabled, false = disabled break point. - lldb::addr_t m_pc; // Address number. - CMIUtilString m_fnName; // Function name. - CMIUtilString m_fileName; // File name text. - CMIUtilString m_path; // Full file name and path text. - MIuint m_nLine; // File line number. - bool m_bHaveArgOptionThreadGrp; // True = include MI field, false = do not - // include "thread-groups". - CMIUtilString m_strOptThrdGrp; // Thread group number. - MIuint m_nTimes; // The count of the breakpoint existence. - CMIUtilString m_strOrigLoc; // The name of the break point. - bool m_bPending; // True = the breakpoint has not been established yet, - // false = location found - MIuint m_nIgnore; // The number of time the breakpoint is run over before it - // is stopped on a hit - bool m_bCondition; // True = break point is conditional, use condition - // expression, false = no condition - CMIUtilString m_strCondition; // Break point condition expression - bool m_bBrkPtThreadId; // True = break point is specified to work with a - // specific thread, false = no specified thread given - MIuint - m_nBrkPtThreadId; // Restrict the breakpoint to the specified thread-id - }; - - // Enumerations: -public: - //++ =================================================================== - // Details: The type of variable used by MIResponseFormVariableInfo family - // functions. - //-- - enum VariableType_e { - eVariableType_InScope = (1u << 0), // In scope only. - eVariableType_Statics = (1u << 1), // Statics. - eVariableType_Locals = (1u << 2), // Locals. - eVariableType_Arguments = (1u << 3) // Arguments. - }; - - //++ =================================================================== - // Details: Determine the information that should be shown by using - // MIResponseFormVariableInfo family functions. - //-- - enum VariableInfoFormat_e { - eVariableInfoFormat_NoValues = 0, - eVariableInfoFormat_AllValues = 1, - eVariableInfoFormat_SimpleValues = 2 - }; - - //++ =================================================================== - // Details: Determine the information that should be shown by using - // MIResponseFormThreadInfo family functions. - //-- - enum ThreadInfoFormat_e { - eThreadInfoFormat_NoFrames, - eThreadInfoFormat_AllFrames - }; - - //++ =================================================================== - // Details: Determine the information that should be shown by using - // MIResponseFormFrameInfo family functions. - //-- - enum FrameInfoFormat_e { - eFrameInfoFormat_NoArguments, - eFrameInfoFormat_AllArguments, - eFrameInfoFormat_AllArgumentsInSimpleForm - }; - - // Typedefs: -public: - typedef std::vector VecActiveThreadId_t; - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - - // Variant type data which can be assigned and retrieved across all command - // instances - template - bool SharedDataAdd(const CMIUtilString &vKey, const T &vData); - template - bool SharedDataRetrieve(const CMIUtilString &vKey, T &vwData); - void SharedDataDestroy(); - - // Common command required functionality - bool AccessPath(const CMIUtilString &vPath, bool &vwbYesAccessible); - bool ResolvePath(const SMICmdData &vCmdData, const CMIUtilString &vPath, - CMIUtilString &vwrResolvedPath); - bool ResolvePath(const CMIUtilString &vstrUnknown, - CMIUtilString &vwrResolvedPath); - bool MIResponseFormFrameInfo(const lldb::SBThread &vrThread, - const MIuint vnLevel, - const FrameInfoFormat_e veFrameInfoFormat, - CMICmnMIValueTuple &vwrMiValueTuple); - bool MIResponseFormThreadInfo(const SMICmdData &vCmdData, - const lldb::SBThread &vrThread, - const ThreadInfoFormat_e veThreadInfoFormat, - CMICmnMIValueTuple &vwrMIValueTuple); - bool MIResponseFormVariableInfo(const lldb::SBFrame &vrFrame, - const MIuint vMaskVarTypes, - const VariableInfoFormat_e veVarInfoFormat, - CMICmnMIValueList &vwrMiValueList, - const MIuint vnMaxDepth = 10, - const bool vbMarkArgs = false); - void MIResponseFormBrkPtFrameInfo(const SBrkPtInfo &vrBrkPtInfo, - CMICmnMIValueTuple &vwrMiValueTuple); - bool MIResponseFormBrkPtInfo(const SBrkPtInfo &vrBrkPtInfo, - CMICmnMIValueTuple &vwrMiValueTuple); - bool GetBrkPtInfo(const lldb::SBBreakpoint &vBrkPt, - SBrkPtInfo &vrwBrkPtInfo) const; - bool RecordBrkPtInfo(const MIuint vnBrkPtId, const SBrkPtInfo &vrBrkPtInfo); - bool RecordBrkPtInfoGet(const MIuint vnBrkPtId, - SBrkPtInfo &vrwBrkPtInfo) const; - bool RecordBrkPtInfoDelete(const MIuint vnBrkPtId); - CMIUtilThreadMutex &GetSessionMutex() { return m_sessionMutex; } - lldb::SBDebugger &GetDebugger() const; - lldb::SBListener &GetListener() const; - lldb::SBTarget GetTarget() const; - lldb::SBProcess GetProcess() const; - - // Attributes: -public: - // The following are available to all command instances - const MIuint m_nBrkPointCntMax; - VecActiveThreadId_t m_vecActiveThreadId; - lldb::tid_t m_currentSelectedThread; - - // These are keys that can be used to access the shared data map - // Note: This list is expected to grow and will be moved and abstracted in the - // future. - const CMIUtilString m_constStrSharedDataKeyWkDir; - const CMIUtilString m_constStrSharedDataSolibPath; - const CMIUtilString m_constStrPrintCharArrayAsString; - const CMIUtilString m_constStrPrintExpandAggregates; - const CMIUtilString m_constStrPrintAggregateFieldNames; - - // Typedefs: -private: - typedef std::vector VecVarObj_t; - typedef std::map MapBrkPtIdToBrkPtInfo_t; - typedef std::pair MapPairBrkPtIdToBrkPtInfo_t; - - // Methods: -private: - /* ctor */ CMICmnLLDBDebugSessionInfo(); - /* ctor */ CMICmnLLDBDebugSessionInfo(const CMICmnLLDBDebugSessionInfo &); - void operator=(const CMICmnLLDBDebugSessionInfo &); - // - bool GetVariableInfo(const lldb::SBValue &vrValue, const bool vbInSimpleForm, - CMIUtilString &vwrStrValue); - bool GetFrameInfo(const lldb::SBFrame &vrFrame, lldb::addr_t &vwPc, - CMIUtilString &vwFnName, CMIUtilString &vwFileName, - CMIUtilString &vwPath, MIuint &vwnLine); - bool GetThreadFrames(const SMICmdData &vCmdData, const MIuint vThreadIdx, - const FrameInfoFormat_e veFrameInfoFormat, - CMIUtilString &vwrThreadFrames); - bool - MIResponseForVariableInfoInternal(const VariableInfoFormat_e veVarInfoFormat, - CMICmnMIValueList &vwrMiValueList, - const lldb::SBValueList &vwrSBValueList, - const MIuint vnMaxDepth, - const bool vbIsArgs, const bool vbMarkArgs); - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmnLLDBDebugSessionInfo() override; - - // Attributes: -private: - CMIUtilMapIdToVariant m_mapIdToSessionData; // Hold and retrieve key to value - // data available across all - // commands - VecVarObj_t m_vecVarObj; // Vector of session variable objects - MapBrkPtIdToBrkPtInfo_t m_mapBrkPtIdToBrkPtInfo; - CMIUtilThreadMutex m_sessionMutex; -}; - -//++ -// Details: Command instances can create and share data between other instances -// of commands. -// This function adds new data to the shared data. Using the same ID -// more than -// once replaces any previous matching data keys. -// Type: Template method. -// Args: T - The type of the object to be stored. -// vKey - (R) A non empty unique data key to retrieve the data by. -// vData - (R) Data to be added to the share. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -template -bool CMICmnLLDBDebugSessionInfo::SharedDataAdd(const CMIUtilString &vKey, - const T &vData) { - if (!m_mapIdToSessionData.Add(vKey, vData)) { - SetErrorDescription(m_mapIdToSessionData.GetErrorDescription()); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: Command instances can create and share data between other instances -// of commands. -// This function retrieves data from the shared data container. -// Type: Method. -// Args: T - The type of the object being retrieved. -// vKey - (R) A non empty unique data key to retrieve the data by. -// vData - (W) The data. -// Return: bool - True = data found, false = data not found or an error -// occurred trying to fetch. -// Throws: None. -//-- -template -bool CMICmnLLDBDebugSessionInfo::SharedDataRetrieve(const CMIUtilString &vKey, - T &vwData) { - bool bDataFound = false; - - if (!m_mapIdToSessionData.Get(vKey, vwData, bDataFound)) { - SetErrorDescription(m_mapIdToSessionData.GetErrorDescription()); - return MIstatus::failure; - } - - return bDataFound; -} diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp b/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp +++ /dev/null @@ -1,863 +0,0 @@ -//===-- MICmnLLDBDebugSessionInfo.cpp ---------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers: -#include "lldb/API/SBThread.h" -#include -#ifdef _WIN32 -#include -#else -#include -#endif // _WIN32 -#include "lldb/API/SBBreakpointLocation.h" - -// In-house headers: -#include "MICmdData.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnLLDBUtilSBValue.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" -#include "MICmnResources.h" -#include "Platform.h" - -//++ -// Details: CMICmnLLDBDebugSessionInfo constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfo::CMICmnLLDBDebugSessionInfo() - : m_nBrkPointCntMax(INT32_MAX), - m_currentSelectedThread(LLDB_INVALID_THREAD_ID), - m_constStrSharedDataKeyWkDir("Working Directory"), - m_constStrSharedDataSolibPath("Solib Path"), - m_constStrPrintCharArrayAsString("Print CharArrayAsString"), - m_constStrPrintExpandAggregates("Print ExpandAggregates"), - m_constStrPrintAggregateFieldNames("Print AggregateFieldNames") {} - -//++ -// Details: CMICmnLLDBDebugSessionInfo destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfo::~CMICmnLLDBDebugSessionInfo() { Shutdown(); } - -//++ -// Details: Initialize resources for *this object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - m_currentSelectedThread = LLDB_INVALID_THREAD_ID; - CMICmnLLDBDebugSessionInfoVarObj::VarObjIdResetToZero(); - - m_bInitialized = MIstatus::success; - - return m_bInitialized; -} - -//++ -// Details: Release resources for *this object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - // Tidy up - SharedDataDestroy(); - - m_vecActiveThreadId.clear(); - CMICmnLLDBDebugSessionInfoVarObj::VarObjClear(); - - m_bInitialized = false; - - return MIstatus::success; -} - -//++ -// Details: Command instances can create and share data between other instances -// of commands. -// Data can also be assigned by a command and retrieved by LLDB event -// handler. -// This function takes down those resources build up over the use of -// the commands. -// This function should be called when the creation and running of -// command has -// stopped i.e. application shutdown. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmnLLDBDebugSessionInfo::SharedDataDestroy() { - m_mapIdToSessionData.Clear(); - m_vecVarObj.clear(); - m_mapBrkPtIdToBrkPtInfo.clear(); -} - -//++ -// Details: Record information about a LLDB break point so that is can be -// recalled in other -// commands or LLDB event handling functions. -// Type: Method. -// Args: vBrkPtId - (R) LLDB break point ID. -// vrBrkPtInfo - (R) Break point information object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::RecordBrkPtInfo( - const MIuint vnBrkPtId, const SBrkPtInfo &vrBrkPtInfo) { - MapPairBrkPtIdToBrkPtInfo_t pr(vnBrkPtId, vrBrkPtInfo); - m_mapBrkPtIdToBrkPtInfo.insert(pr); - - return MIstatus::success; -} - -//++ -// Details: Retrieve information about a LLDB break point previous recorded -// either by -// commands or LLDB event handling functions. -// Type: Method. -// Args: vBrkPtId - (R) LLDB break point ID. -// vrwBrkPtInfo - (W) Break point information object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::RecordBrkPtInfoGet( - const MIuint vnBrkPtId, SBrkPtInfo &vrwBrkPtInfo) const { - const MapBrkPtIdToBrkPtInfo_t::const_iterator it = - m_mapBrkPtIdToBrkPtInfo.find(vnBrkPtId); - if (it != m_mapBrkPtIdToBrkPtInfo.end()) { - vrwBrkPtInfo = (*it).second; - return MIstatus::success; - } - - return MIstatus::failure; -} - -//++ -// Details: Delete information about a specific LLDB break point object. This -// function -// should be called when a LLDB break point is deleted. -// Type: Method. -// Args: vBrkPtId - (R) LLDB break point ID. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::RecordBrkPtInfoDelete(const MIuint vnBrkPtId) { - const MapBrkPtIdToBrkPtInfo_t::const_iterator it = - m_mapBrkPtIdToBrkPtInfo.find(vnBrkPtId); - if (it != m_mapBrkPtIdToBrkPtInfo.end()) { - m_mapBrkPtIdToBrkPtInfo.erase(it); - return MIstatus::success; - } - - return MIstatus::failure; -} - -//++ -// Details: Retrieve the specified thread's frame information. -// Type: Method. -// Args: vCmdData - (R) A command's information. -// vThreadIdx - (R) Thread index. -// vwrThreadFrames - (W) Frame data. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::GetThreadFrames( - const SMICmdData &vCmdData, const MIuint vThreadIdx, - const FrameInfoFormat_e veFrameInfoFormat, CMIUtilString &vwrThreadFrames) { - lldb::SBThread thread = GetProcess().GetThreadByIndexID(vThreadIdx); - const uint32_t nFrames = thread.GetNumFrames(); - if (nFrames == 0) { - // MI print "frame={}" - CMICmnMIValueTuple miValueTuple; - CMICmnMIValueResult miValueResult("frame", miValueTuple); - vwrThreadFrames = miValueResult.GetString(); - return MIstatus::success; - } - - // MI print - // "frame={level=\"%d\",addr=\"0x%016" PRIx64 - // "\",func=\"%s\",args=[%s],file=\"%s\",fullname=\"%s\",line=\"%d\"},frame={level=\"%d\",addr=\"0x%016" - // PRIx64 "\",func=\"%s\",args=[%s],file=\"%s\",fullname=\"%s\",line=\"%d\"}, - // ..." - CMIUtilString strListCommaSeparated; - for (MIuint nLevel = 0; nLevel < nFrames; nLevel++) { - CMICmnMIValueTuple miValueTuple; - if (!MIResponseFormFrameInfo(thread, nLevel, veFrameInfoFormat, - miValueTuple)) - return MIstatus::failure; - - const CMICmnMIValueResult miValueResult2("frame", miValueTuple); - if (nLevel != 0) - strListCommaSeparated += ","; - strListCommaSeparated += miValueResult2.GetString(); - } - - vwrThreadFrames = strListCommaSeparated; - - return MIstatus::success; -} - -//++ -// Details: Return the resolved file's path for the given file. -// Type: Method. -// Args: vCmdData - (R) A command's information. -// vPath - (R) Original path. -// vwrResolvedPath - (W) Resolved path. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::ResolvePath(const SMICmdData &vCmdData, - const CMIUtilString &vPath, - CMIUtilString &vwrResolvedPath) { - // ToDo: Verify this code as it does not work as vPath is always empty - - CMIUtilString strResolvedPath; - if (!SharedDataRetrieve(m_constStrSharedDataKeyWkDir, - strResolvedPath)) { - vwrResolvedPath = ""; - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_SHARED_DATA_NOT_FOUND), vCmdData.strMiCmd.c_str(), - m_constStrSharedDataKeyWkDir.c_str())); - return MIstatus::failure; - } - - vwrResolvedPath = vPath; - - return ResolvePath(strResolvedPath, vwrResolvedPath); -} - -//++ -// Details: Return the resolved file's path for the given file. -// Type: Method. -// Args: vstrUnknown - (R) String assigned to path when resolved path -// is empty. -// vwrResolvedPath - (RW) The original path overwritten with resolved -// path. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::ResolvePath(const CMIUtilString &vstrUnknown, - CMIUtilString &vwrResolvedPath) { - if (vwrResolvedPath.size() < 1) { - vwrResolvedPath = vstrUnknown; - return MIstatus::success; - } - - bool bOk = MIstatus::success; - - CMIUtilString::VecString_t vecPathFolders; - const MIuint nSplits = vwrResolvedPath.Split("/", vecPathFolders); - MIunused(nSplits); - MIuint nFoldersBack = 1; // 1 is just the file (last element of vector) - while (bOk && (vecPathFolders.size() >= nFoldersBack)) { - CMIUtilString strTestPath; - MIuint nFoldersToAdd = nFoldersBack; - while (nFoldersToAdd > 0) { - strTestPath += "/"; - strTestPath += vecPathFolders[vecPathFolders.size() - nFoldersToAdd]; - nFoldersToAdd--; - } - bool bYesAccessible = false; - bOk = AccessPath(strTestPath, bYesAccessible); - if (bYesAccessible) { - vwrResolvedPath = strTestPath; - return MIstatus::success; - } else - nFoldersBack++; - } - - // No files exist in the union of working directory and debuginfo path - // Simply use the debuginfo path and let the IDE handle it. - - return bOk; -} - -//++ -// Details: Determine the given file path exists or not. -// Type: Method. -// Args: vPath - (R) File name path. -// vwbYesAccessible - (W) True - file exists, false = does not -// exist. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::AccessPath(const CMIUtilString &vPath, - bool &vwbYesAccessible) { -#ifdef _WIN32 - vwbYesAccessible = (::_access(vPath.c_str(), 0) == 0); -#else - vwbYesAccessible = (::access(vPath.c_str(), 0) == 0); -#endif // _WIN32 - - return MIstatus::success; -} - -//++ -// Details: Form MI partial response by appending more MI value type objects to -// the -// tuple type object past in. -// Type: Method. -// Args: vCmdData - (R) A command's information. -// vrThread - (R) LLDB thread object. -// vwrMIValueTuple - (W) MI value tuple object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::MIResponseFormThreadInfo( - const SMICmdData &vCmdData, const lldb::SBThread &vrThread, - const ThreadInfoFormat_e veThreadInfoFormat, - CMICmnMIValueTuple &vwrMIValueTuple) { - lldb::SBThread &rThread = const_cast(vrThread); - - const bool bSuspended = rThread.IsSuspended(); - const lldb::StopReason eReason = rThread.GetStopReason(); - const bool bValidReason = !((eReason == lldb::eStopReasonNone) || - (eReason == lldb::eStopReasonInvalid)); - const CMIUtilString strState((bSuspended || bValidReason) ? "stopped" - : "running"); - - // Add "id" - const CMIUtilString strId(CMIUtilString::Format("%d", rThread.GetIndexID())); - const CMICmnMIValueConst miValueConst1(strId); - const CMICmnMIValueResult miValueResult1("id", miValueConst1); - vwrMIValueTuple.Add(miValueResult1); - - // Add "target-id" - const char *pThreadName = rThread.GetName(); - const MIuint len = CMIUtilString(pThreadName).length(); - const bool bHaveName = (len > 0) && (len < 32) && // 32 is arbitrary number - CMIUtilString::IsAllValidAlphaAndNumeric(pThreadName); - const char *pThrdFmt = bHaveName ? "%s" : "Thread %d"; - CMIUtilString strThread; - if (bHaveName) - strThread = CMIUtilString::Format(pThrdFmt, pThreadName); - else - strThread = CMIUtilString::Format(pThrdFmt, rThread.GetIndexID()); - const CMICmnMIValueConst miValueConst2(strThread); - const CMICmnMIValueResult miValueResult2("target-id", miValueConst2); - vwrMIValueTuple.Add(miValueResult2); - - // Add "frame" - if (veThreadInfoFormat != eThreadInfoFormat_NoFrames) { - CMIUtilString strFrames; - if (!GetThreadFrames(vCmdData, rThread.GetIndexID(), - eFrameInfoFormat_AllArgumentsInSimpleForm, strFrames)) - return MIstatus::failure; - - const CMICmnMIValueConst miValueConst3(strFrames, true); - vwrMIValueTuple.Add(miValueConst3, false); - } - - // Add "state" - const CMICmnMIValueConst miValueConst4(strState); - const CMICmnMIValueResult miValueResult4("state", miValueConst4); - vwrMIValueTuple.Add(miValueResult4); - - return MIstatus::success; -} - -//++ -// Details: Form MI partial response by appending more MI value type objects to -// the -// tuple type object past in. -// Type: Method. -// Args: vrFrame - (R) LLDB thread object. -// vMaskVarTypes - (R) Construed according to VariableType_e. -// veVarInfoFormat - (R) The type of variable info that should be -// shown. -// vwrMIValueList - (W) MI value list object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::MIResponseFormVariableInfo( - const lldb::SBFrame &vrFrame, const MIuint vMaskVarTypes, - const VariableInfoFormat_e veVarInfoFormat, - CMICmnMIValueList &vwrMiValueList, const MIuint vnMaxDepth, /* = 10 */ - const bool vbMarkArgs /* = false*/) { - bool bOk = MIstatus::success; - lldb::SBFrame &rFrame = const_cast(vrFrame); - - const bool bArg = (vMaskVarTypes & eVariableType_Arguments); - const bool bLocals = (vMaskVarTypes & eVariableType_Locals); - const bool bStatics = (vMaskVarTypes & eVariableType_Statics); - const bool bInScopeOnly = (vMaskVarTypes & eVariableType_InScope); - - // Handle arguments first - lldb::SBValueList listArg = rFrame.GetVariables(bArg, false, false, false); - bOk = bOk && MIResponseForVariableInfoInternal(veVarInfoFormat, - vwrMiValueList, listArg, - vnMaxDepth, true, vbMarkArgs); - - // Handle remaining variables - lldb::SBValueList listVars = - rFrame.GetVariables(false, bLocals, bStatics, bInScopeOnly); - bOk = bOk && MIResponseForVariableInfoInternal(veVarInfoFormat, - vwrMiValueList, listVars, - vnMaxDepth, false, vbMarkArgs); - - return bOk; -} - -bool CMICmnLLDBDebugSessionInfo::MIResponseForVariableInfoInternal( - const VariableInfoFormat_e veVarInfoFormat, - CMICmnMIValueList &vwrMiValueList, const lldb::SBValueList &vwrSBValueList, - const MIuint vnMaxDepth, const bool vbIsArgs, const bool vbMarkArgs) { - const MIuint nArgs = vwrSBValueList.GetSize(); - for (MIuint i = 0; i < nArgs; i++) { - CMICmnMIValueTuple miValueTuple; - lldb::SBValue value = vwrSBValueList.GetValueAtIndex(i); - // If one stops inside try block with, which catch clause type is unnamed - // (e.g std::exception&) then value name will be nullptr as well as value - // pointer - const char *name = value.GetName(); - if (name == nullptr) - continue; - const CMICmnMIValueConst miValueConst(name); - const CMICmnMIValueResult miValueResultName("name", miValueConst); - if (vbMarkArgs && vbIsArgs) { - const CMICmnMIValueConst miValueConstArg("1"); - const CMICmnMIValueResult miValueResultArg("arg", miValueConstArg); - miValueTuple.Add(miValueResultArg); - } - if (veVarInfoFormat != eVariableInfoFormat_NoValues) { - miValueTuple.Add(miValueResultName); // name - if (veVarInfoFormat == eVariableInfoFormat_SimpleValues) { - const CMICmnMIValueConst miValueConst3(value.GetTypeName()); - const CMICmnMIValueResult miValueResult3("type", miValueConst3); - miValueTuple.Add(miValueResult3); - } - const MIuint nChildren = value.GetNumChildren(); - const bool bIsPointerType = value.GetType().IsPointerType(); - if (nChildren == 0 || // no children - (bIsPointerType && nChildren == 1) || // pointers - veVarInfoFormat == eVariableInfoFormat_AllValues) // show all values - { - CMIUtilString strValue; - if (GetVariableInfo(value, vnMaxDepth == 0, strValue)) { - const CMICmnMIValueConst miValueConst2( - strValue.Escape().AddSlashes()); - const CMICmnMIValueResult miValueResult2("value", miValueConst2); - miValueTuple.Add(miValueResult2); - } - } - vwrMiValueList.Add(miValueTuple); - continue; - } - - if (vbMarkArgs) { - // If we are printing names only with vbMarkArgs, we still need to add the - // name to the value tuple - miValueTuple.Add(miValueResultName); // name - vwrMiValueList.Add(miValueTuple); - } else { - // If we are printing name only then no need to put it in the tuple. - vwrMiValueList.Add(miValueResultName); - } - } - return MIstatus::success; -} - -//++ -// Details: Extract the value's name and value or recurse into child value -// object. -// Type: Method. -// Args: vrValue - (R) LLDB value object. -// vbInSimpleForm - (R) True = Get variable info in simple form (i.e. -// don't expand aggregates). -// - False = Get variable info (and expand -// aggregates if any). -// vwrStrValue t - (W) The string representation of this value. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::GetVariableInfo(const lldb::SBValue &vrValue, - const bool vbInSimpleForm, - CMIUtilString &vwrStrValue) { - const CMICmnLLDBUtilSBValue utilValue(vrValue, true, false); - const bool bExpandAggregates = !vbInSimpleForm; - vwrStrValue = utilValue.GetValue(bExpandAggregates); - return MIstatus::success; -} - -//++ -// Details: Form MI partial response by appending more MI value type objects to -// the -// tuple type object past in. -// Type: Method. -// Args: vrThread - (R) LLDB thread object. -// vwrMIValueTuple - (W) MI value tuple object. -// vArgInfo - (R) Args information in MI response form. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::MIResponseFormFrameInfo( - const lldb::SBThread &vrThread, const MIuint vnLevel, - const FrameInfoFormat_e veFrameInfoFormat, - CMICmnMIValueTuple &vwrMiValueTuple) { - lldb::SBThread &rThread = const_cast(vrThread); - - lldb::SBFrame frame = rThread.GetFrameAtIndex(vnLevel); - lldb::addr_t pc = 0; - CMIUtilString fnName; - CMIUtilString fileName; - CMIUtilString path; - MIuint nLine = 0; - if (!GetFrameInfo(frame, pc, fnName, fileName, path, nLine)) - return MIstatus::failure; - - // MI print "{level=\"0\",addr=\"0x%016" PRIx64 - // "\",func=\"%s\",file=\"%s\",fullname=\"%s\",line=\"%d\"}" - const CMIUtilString strLevel(CMIUtilString::Format("%d", vnLevel)); - const CMICmnMIValueConst miValueConst(strLevel); - const CMICmnMIValueResult miValueResult("level", miValueConst); - vwrMiValueTuple.Add(miValueResult); - const CMIUtilString strAddr(CMIUtilString::Format("0x%016" PRIx64, pc)); - const CMICmnMIValueConst miValueConst2(strAddr); - const CMICmnMIValueResult miValueResult2("addr", miValueConst2); - vwrMiValueTuple.Add(miValueResult2); - const CMICmnMIValueConst miValueConst3(fnName); - const CMICmnMIValueResult miValueResult3("func", miValueConst3); - vwrMiValueTuple.Add(miValueResult3); - if (veFrameInfoFormat != eFrameInfoFormat_NoArguments) { - CMICmnMIValueList miValueList(true); - const MIuint maskVarTypes = eVariableType_Arguments; - if (veFrameInfoFormat == eFrameInfoFormat_AllArgumentsInSimpleForm) { - if (!MIResponseFormVariableInfo(frame, maskVarTypes, - eVariableInfoFormat_AllValues, - miValueList, 0)) - return MIstatus::failure; - } else if (!MIResponseFormVariableInfo(frame, maskVarTypes, - eVariableInfoFormat_AllValues, - miValueList)) - return MIstatus::failure; - - const CMICmnMIValueResult miValueResult4("args", miValueList); - vwrMiValueTuple.Add(miValueResult4); - } - const CMICmnMIValueConst miValueConst5(fileName); - const CMICmnMIValueResult miValueResult5("file", miValueConst5); - vwrMiValueTuple.Add(miValueResult5); - const CMICmnMIValueConst miValueConst6(path); - const CMICmnMIValueResult miValueResult6("fullname", miValueConst6); - vwrMiValueTuple.Add(miValueResult6); - const CMIUtilString strLine(CMIUtilString::Format("%d", nLine)); - const CMICmnMIValueConst miValueConst7(strLine); - const CMICmnMIValueResult miValueResult7("line", miValueConst7); - vwrMiValueTuple.Add(miValueResult7); - - return MIstatus::success; -} - -//++ -// Details: Retrieve the frame information from LLDB frame object. -// Type: Method. -// Args: vrFrame - (R) LLDB thread object. -// vPc - (W) Address number. -// vFnName - (W) Function name. -// vFileName - (W) File name text. -// vPath - (W) Full file name and path text. -// vnLine - (W) File line number. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::GetFrameInfo( - const lldb::SBFrame &vrFrame, lldb::addr_t &vwPc, CMIUtilString &vwFnName, - CMIUtilString &vwFileName, CMIUtilString &vwPath, MIuint &vwnLine) { - lldb::SBFrame &rFrame = const_cast(vrFrame); - - static char pBuffer[PATH_MAX]; - const MIuint nBytes = - rFrame.GetLineEntry().GetFileSpec().GetPath(&pBuffer[0], sizeof(pBuffer)); - MIunused(nBytes); - CMIUtilString strResolvedPath(&pBuffer[0]); - const char *pUnkwn = "??"; - if (!ResolvePath(pUnkwn, strResolvedPath)) - return MIstatus::failure; - vwPath = strResolvedPath; - - vwPc = rFrame.GetPC(); - - const char *pFnName = rFrame.GetFunctionName(); - vwFnName = (pFnName != nullptr) ? pFnName : pUnkwn; - - const char *pFileName = rFrame.GetLineEntry().GetFileSpec().GetFilename(); - vwFileName = (pFileName != nullptr) ? pFileName : pUnkwn; - - vwnLine = rFrame.GetLineEntry().GetLine(); - - return MIstatus::success; -} - -//++ -// Details: Form MI partial response by appending more MI value type objects to -// the -// tuple type object past in. -// Type: Method. -// Args: vrBrkPtInfo - (R) Break point information object. -// vwrMIValueTuple - (W) MI value tuple object. -// Return: None. -// Throws: None. -//-- -void CMICmnLLDBDebugSessionInfo::MIResponseFormBrkPtFrameInfo( - const SBrkPtInfo &vrBrkPtInfo, CMICmnMIValueTuple &vwrMiValueTuple) { - const CMIUtilString strAddr( - CMIUtilString::Format("0x%016" PRIx64, vrBrkPtInfo.m_pc)); - const CMICmnMIValueConst miValueConst2(strAddr); - const CMICmnMIValueResult miValueResult2("addr", miValueConst2); - vwrMiValueTuple.Add(miValueResult2); - const CMICmnMIValueConst miValueConst3(vrBrkPtInfo.m_fnName); - const CMICmnMIValueResult miValueResult3("func", miValueConst3); - vwrMiValueTuple.Add(miValueResult3); - const CMICmnMIValueConst miValueConst5(vrBrkPtInfo.m_fileName); - const CMICmnMIValueResult miValueResult5("file", miValueConst5); - vwrMiValueTuple.Add(miValueResult5); - const CMIUtilString strN5 = CMIUtilString::Format( - "%s/%s", vrBrkPtInfo.m_path.c_str(), vrBrkPtInfo.m_fileName.c_str()); - const CMICmnMIValueConst miValueConst6(strN5); - const CMICmnMIValueResult miValueResult6("fullname", miValueConst6); - vwrMiValueTuple.Add(miValueResult6); - const CMIUtilString strLine(CMIUtilString::Format("%d", vrBrkPtInfo.m_nLine)); - const CMICmnMIValueConst miValueConst7(strLine); - const CMICmnMIValueResult miValueResult7("line", miValueConst7); - vwrMiValueTuple.Add(miValueResult7); -} - -//++ -// Details: Form MI partial response by appending more MI value type objects to -// the -// tuple type object past in. -// Type: Method. -// Args: vrBrkPtInfo - (R) Break point information object. -// vwrMIValueTuple - (W) MI value tuple object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::MIResponseFormBrkPtInfo( - const SBrkPtInfo &vrBrkPtInfo, CMICmnMIValueTuple &vwrMiValueTuple) { - // MI print - // "=breakpoint-modified,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016" - // PRIx64 "\", - // func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",times=\"%d\",original-location=\"%s\"}" - - // "number=" - const CMICmnMIValueConst miValueConst( - CMIUtilString::Format("%d", vrBrkPtInfo.m_id)); - const CMICmnMIValueResult miValueResult("number", miValueConst); - CMICmnMIValueTuple miValueTuple(miValueResult); - // "type=" - const CMICmnMIValueConst miValueConst2(vrBrkPtInfo.m_strType); - const CMICmnMIValueResult miValueResult2("type", miValueConst2); - miValueTuple.Add(miValueResult2); - // "disp=" - const CMICmnMIValueConst miValueConst3(vrBrkPtInfo.m_bDisp ? "del" : "keep"); - const CMICmnMIValueResult miValueResult3("disp", miValueConst3); - miValueTuple.Add(miValueResult3); - // "enabled=" - const CMICmnMIValueConst miValueConst4(vrBrkPtInfo.m_bEnabled ? "y" : "n"); - const CMICmnMIValueResult miValueResult4("enabled", miValueConst4); - miValueTuple.Add(miValueResult4); - // "addr=" - // "func=" - // "file=" - // "fullname=" - // "line=" - MIResponseFormBrkPtFrameInfo(vrBrkPtInfo, miValueTuple); - // "pending=" - if (vrBrkPtInfo.m_bPending) { - const CMICmnMIValueConst miValueConst(vrBrkPtInfo.m_strOrigLoc); - const CMICmnMIValueList miValueList(miValueConst); - const CMICmnMIValueResult miValueResult("pending", miValueList); - miValueTuple.Add(miValueResult); - } - if (vrBrkPtInfo.m_bHaveArgOptionThreadGrp) { - const CMICmnMIValueConst miValueConst(vrBrkPtInfo.m_strOptThrdGrp); - const CMICmnMIValueList miValueList(miValueConst); - const CMICmnMIValueResult miValueResult("thread-groups", miValueList); - miValueTuple.Add(miValueResult); - } - // "times=" - const CMICmnMIValueConst miValueConstB( - CMIUtilString::Format("%d", vrBrkPtInfo.m_nTimes)); - const CMICmnMIValueResult miValueResultB("times", miValueConstB); - miValueTuple.Add(miValueResultB); - // "thread=" - if (vrBrkPtInfo.m_bBrkPtThreadId) { - const CMICmnMIValueConst miValueConst( - CMIUtilString::Format("%d", vrBrkPtInfo.m_nBrkPtThreadId)); - const CMICmnMIValueResult miValueResult("thread", miValueConst); - miValueTuple.Add(miValueResult); - } - // "cond=" - if (vrBrkPtInfo.m_bCondition) { - const CMICmnMIValueConst miValueConst(vrBrkPtInfo.m_strCondition); - const CMICmnMIValueResult miValueResult("cond", miValueConst); - miValueTuple.Add(miValueResult); - } - // "ignore=" - if (vrBrkPtInfo.m_nIgnore != 0) { - const CMICmnMIValueConst miValueConst( - CMIUtilString::Format("%d", vrBrkPtInfo.m_nIgnore)); - const CMICmnMIValueResult miValueResult("ignore", miValueConst); - miValueTuple.Add(miValueResult); - } - // "original-location=" - const CMICmnMIValueConst miValueConstC(vrBrkPtInfo.m_strOrigLoc); - const CMICmnMIValueResult miValueResultC("original-location", miValueConstC); - miValueTuple.Add(miValueResultC); - - vwrMiValueTuple = miValueTuple; - - return MIstatus::success; -} - -//++ -// Details: Retrieve breakpoint information and write into the given breakpoint -// information -// object. Note not all possible information is retrieved and so the -// information -// object may need to be filled in with more information after calling -// this -// function. Mainly breakpoint location information of information that -// is -// unlikely to change. -// Type: Method. -// Args: vBrkPt - (R) LLDB break point object. -// vrBrkPtInfo - (W) Break point information object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfo::GetBrkPtInfo(const lldb::SBBreakpoint &vBrkPt, - SBrkPtInfo &vrwBrkPtInfo) const { - lldb::SBBreakpoint &rBrkPt = const_cast(vBrkPt); - lldb::SBBreakpointLocation brkPtLoc = rBrkPt.GetLocationAtIndex(0); - lldb::SBAddress brkPtAddr = brkPtLoc.GetAddress(); - lldb::SBSymbolContext symbolCntxt = - brkPtAddr.GetSymbolContext(lldb::eSymbolContextEverything); - const char *pUnkwn = "??"; - lldb::SBModule rModule = symbolCntxt.GetModule(); - const char *pModule = - rModule.IsValid() ? rModule.GetFileSpec().GetFilename() : pUnkwn; - MIunused(pModule); - const char *pFile = pUnkwn; - const char *pFn = pUnkwn; - const char *pFilePath = pUnkwn; - size_t nLine = 0; - lldb::addr_t nAddr = brkPtAddr.GetLoadAddress(GetTarget()); - if (nAddr == LLDB_INVALID_ADDRESS) - nAddr = brkPtAddr.GetFileAddress(); - - lldb::SBCompileUnit rCmplUnit = symbolCntxt.GetCompileUnit(); - if (rCmplUnit.IsValid()) { - lldb::SBFileSpec rFileSpec = rCmplUnit.GetFileSpec(); - pFile = rFileSpec.GetFilename(); - pFilePath = rFileSpec.GetDirectory(); - lldb::SBFunction rFn = symbolCntxt.GetFunction(); - if (rFn.IsValid()) - pFn = rFn.GetName(); - lldb::SBLineEntry rLnEntry = symbolCntxt.GetLineEntry(); - if (rLnEntry.GetLine() > 0) - nLine = rLnEntry.GetLine(); - } - - vrwBrkPtInfo.m_id = vBrkPt.GetID(); - vrwBrkPtInfo.m_strType = "breakpoint"; - vrwBrkPtInfo.m_pc = nAddr; - vrwBrkPtInfo.m_fnName = pFn; - vrwBrkPtInfo.m_fileName = pFile; - vrwBrkPtInfo.m_path = pFilePath; - vrwBrkPtInfo.m_nLine = nLine; - vrwBrkPtInfo.m_nTimes = vBrkPt.GetHitCount(); - - return MIstatus::success; -} - -//++ -// Details: Get current debugger. -// Type: Method. -// Args: None. -// Return: lldb::SBDebugger - current debugger. -// Throws: None. -//-- -lldb::SBDebugger &CMICmnLLDBDebugSessionInfo::GetDebugger() const { - return CMICmnLLDBDebugger::Instance().GetTheDebugger(); -} - -//++ -// Details: Get current listener. -// Type: Method. -// Args: None. -// Return: lldb::SBListener - current listener. -// Throws: None. -//-- -lldb::SBListener &CMICmnLLDBDebugSessionInfo::GetListener() const { - return CMICmnLLDBDebugger::Instance().GetTheListener(); -} - -//++ -// Details: Get current target. -// Type: Method. -// Args: None. -// Return: lldb::SBTarget - current target. -// Throws: None. -//-- -lldb::SBTarget CMICmnLLDBDebugSessionInfo::GetTarget() const { - auto target = GetDebugger().GetSelectedTarget(); - if (target.IsValid()) - return target; - return GetDebugger().GetDummyTarget(); -} - -//++ -// Details: Get current process. -// Type: Method. -// Args: None. -// Return: lldb::SBProcess - current process. -// Throws: None. -//-- -lldb::SBProcess CMICmnLLDBDebugSessionInfo::GetProcess() const { - return GetTarget().GetProcess(); -} diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.h b/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.h +++ /dev/null @@ -1,139 +0,0 @@ -//===-- MICmnLLDBDebugSessionInfoVarObj.h -----------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third Party Headers: -#include "lldb/API/SBValue.h" -#include - -// In-house headers: -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI debug session variable object. The static functionality in *this -// class manages a map container of *these variable objects. -//-- -class CMICmnLLDBDebugSessionInfoVarObj { - // Enums: -public: - //++ ---------------------------------------------------------------------- - // Details: Enumeration of a variable type that is not a composite type - //-- - enum varFormat_e { - // CODETAG_SESSIONINFO_VARFORMAT_ENUM - // *** Order is import here *** - eVarFormat_Invalid = 0, - eVarFormat_Binary, - eVarFormat_Octal, - eVarFormat_Decimal, - eVarFormat_Hex, - eVarFormat_Natural, - eVarFormat_count // Always last one - }; - - //++ ---------------------------------------------------------------------- - // Details: Enumeration of a variable type by composite or internal type - //-- - enum varType_e { - eVarType_InValid = 0, - eVarType_Composite, // i.e. struct - eVarType_Internal, // i.e. int - eVarType_count // Always last one - }; - - // Statics: -public: - static varFormat_e GetVarFormatForString(const CMIUtilString &vrStrFormat); - static varFormat_e GetVarFormatForChar(char vcFormat); - static CMIUtilString GetValueStringFormatted(const lldb::SBValue &vrValue, - const varFormat_e veVarFormat); - static void VarObjAdd(const CMICmnLLDBDebugSessionInfoVarObj &vrVarObj); - static void VarObjDelete(const CMIUtilString &vrVarName); - static bool VarObjGet(const CMIUtilString &vrVarName, - CMICmnLLDBDebugSessionInfoVarObj &vrwVarObj); - static void VarObjUpdate(const CMICmnLLDBDebugSessionInfoVarObj &vrVarObj); - static void VarObjIdInc(); - static MIuint VarObjIdGet(); - static void VarObjIdResetToZero(); - static void VarObjClear(); - static void VarObjSetFormat(varFormat_e eDefaultFormat); - - // Methods: -public: - /* ctor */ CMICmnLLDBDebugSessionInfoVarObj(); - /* ctor */ CMICmnLLDBDebugSessionInfoVarObj( - const CMIUtilString &vrStrNameReal, const CMIUtilString &vrStrName, - const lldb::SBValue &vrValue); - /* ctor */ CMICmnLLDBDebugSessionInfoVarObj( - const CMIUtilString &vrStrNameReal, const CMIUtilString &vrStrName, - const lldb::SBValue &vrValue, const CMIUtilString &vrStrVarObjParentName); - /* ctor */ CMICmnLLDBDebugSessionInfoVarObj( - const CMICmnLLDBDebugSessionInfoVarObj &vrOther); - /* ctor */ CMICmnLLDBDebugSessionInfoVarObj( - CMICmnLLDBDebugSessionInfoVarObj &vrOther); - /* ctor */ CMICmnLLDBDebugSessionInfoVarObj( - CMICmnLLDBDebugSessionInfoVarObj &&vrOther); - // - CMICmnLLDBDebugSessionInfoVarObj & - operator=(const CMICmnLLDBDebugSessionInfoVarObj &vrOther); - CMICmnLLDBDebugSessionInfoVarObj & - operator=(CMICmnLLDBDebugSessionInfoVarObj &&vrwOther); - // - const CMIUtilString &GetName() const; - const CMIUtilString &GetNameReal() const; - const CMIUtilString &GetValueFormatted() const; - lldb::SBValue &GetValue(); - const lldb::SBValue &GetValue() const; - varType_e GetType() const; - bool SetVarFormat(const varFormat_e veVarFormat); - const CMIUtilString &GetVarParentName() const; - void UpdateValue(); - - // Overridden: -public: - // From CMICmnBase - /* dtor */ virtual ~CMICmnLLDBDebugSessionInfoVarObj(); - - // Typedefs: -private: - typedef std::map - MapKeyToVarObj_t; - typedef std::pair - MapPairKeyToVarObj_t; - - // Statics: -private: - static CMIUtilString GetStringFormatted(const MIuint64 vnValue, - const char *vpStrValueNatural, - varFormat_e veVarFormat); - - // Methods: -private: - bool CopyOther(const CMICmnLLDBDebugSessionInfoVarObj &vrOther); - bool MoveOther(CMICmnLLDBDebugSessionInfoVarObj &vrwOther); - - // Attributes: -private: - static const char *ms_aVarFormatStrings[]; - static const char *ms_aVarFormatChars[]; - static MapKeyToVarObj_t ms_mapVarIdToVarObj; - static MIuint ms_nVarUniqueId; - static varFormat_e ms_eDefaultFormat; // overrides "natural" format - // - // *** Update the copy move constructors and assignment operator *** - varFormat_e m_eVarFormat; - varType_e m_eVarType; - CMIUtilString m_strName; - lldb::SBValue m_SBValue; - CMIUtilString m_strNameReal; - CMIUtilString m_strFormattedValue; - CMIUtilString m_strVarObjParentName; - // *** Update the copy move constructors and assignment operator *** -}; diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp b/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp +++ /dev/null @@ -1,573 +0,0 @@ -//===-- MICmnLLDBDebugSessionInfoVarObj.cpp ---------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnLLDBDebugSessionInfoVarObj.h" -#include "MICmnLLDBProxySBValue.h" -#include "MICmnLLDBUtilSBValue.h" - -// Instantiations: -const char *CMICmnLLDBDebugSessionInfoVarObj::ms_aVarFormatStrings[] = { - // CODETAG_SESSIONINFO_VARFORMAT_ENUM - // *** Order is import here. - "", "binary", "octal", "decimal", - "hexadecimal", "natural"}; -const char *CMICmnLLDBDebugSessionInfoVarObj::ms_aVarFormatChars[] = { - // CODETAG_SESSIONINFO_VARFORMAT_ENUM - // *** Order is import here. - "", "t", "o", "d", "x", "N"}; -CMICmnLLDBDebugSessionInfoVarObj::MapKeyToVarObj_t - CMICmnLLDBDebugSessionInfoVarObj::ms_mapVarIdToVarObj; -MIuint CMICmnLLDBDebugSessionInfoVarObj::ms_nVarUniqueId = 0; // Index from 0 -CMICmnLLDBDebugSessionInfoVarObj::varFormat_e - CMICmnLLDBDebugSessionInfoVarObj::ms_eDefaultFormat = eVarFormat_Natural; - -//++ -// Details: CMICmnLLDBDebugSessionInfoVarObj constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj() - : m_eVarFormat(eVarFormat_Natural), m_eVarType(eVarType_Internal) { - // Do not call UpdateValue() in here as not necessary -} - -//++ -// Details: CMICmnLLDBDebugSessionInfoVarObj constructor. -// Type: Method. -// Args: vrStrNameReal - (R) The actual name of the variable, the -// expression. -// vrStrName - (R) The name given for *this var object. -// vrValue - (R) The LLDB SBValue object represented by *this -// object. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( - const CMIUtilString &vrStrNameReal, const CMIUtilString &vrStrName, - const lldb::SBValue &vrValue) - : m_eVarFormat(eVarFormat_Natural), m_eVarType(eVarType_Internal), - m_strName(vrStrName), m_SBValue(vrValue), m_strNameReal(vrStrNameReal) { - UpdateValue(); -} - -//++ -// Details: CMICmnLLDBDebugSessionInfoVarObj constructor. -// Type: Method. -// Args: vrStrNameReal - (R) The actual name of the variable, the -// expression. -// vrStrName - (R) The name given for *this var object. -// vrValue - (R) The LLDB SBValue object represented by -// *this object. -// vrStrVarObjParentName - (R) The var object parent to *this var -// object (LLDB SBValue equivalent). -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( - const CMIUtilString &vrStrNameReal, const CMIUtilString &vrStrName, - const lldb::SBValue &vrValue, const CMIUtilString &vrStrVarObjParentName) - : m_eVarFormat(eVarFormat_Natural), m_eVarType(eVarType_Internal), - m_strName(vrStrName), m_SBValue(vrValue), m_strNameReal(vrStrNameReal), - m_strVarObjParentName(vrStrVarObjParentName) { - UpdateValue(); -} - -//++ -// Details: CMICmnLLDBDebugSessionInfoVarObj copy constructor. -// Type: Method. -// Args: vrOther - (R) The object to copy from. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( - const CMICmnLLDBDebugSessionInfoVarObj &vrOther) { - CopyOther(vrOther); -} - -//++ -// Details: CMICmnLLDBDebugSessionInfoVarObj copy constructor. -// Type: Method. -// Args: vrOther - (R) The object to copy from. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( - CMICmnLLDBDebugSessionInfoVarObj &vrOther) { - CopyOther(vrOther); -} - -//++ -// Details: CMICmnLLDBDebugSessionInfoVarObj move constructor. -// Type: Method. -// Args: vrwOther - (R) The object to copy from. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj::CMICmnLLDBDebugSessionInfoVarObj( - CMICmnLLDBDebugSessionInfoVarObj &&vrwOther) { - MoveOther(vrwOther); -} - -//++ -// Details: CMICmnLLDBDebugSessionInfoVarObj assignment operator. -// Type: Method. -// Args: vrOther - (R) The object to copy from. -// Return: CMICmnLLDBDebugSessionInfoVarObj & - Updated *this object. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj &CMICmnLLDBDebugSessionInfoVarObj:: -operator=(const CMICmnLLDBDebugSessionInfoVarObj &vrOther) { - CopyOther(vrOther); - - return *this; -} - -//++ -// Details: CMICmnLLDBDebugSessionInfoVarObj assignment operator. -// Type: Method. -// Args: vrwOther - (R) The object to copy from. -// Return: CMICmnLLDBDebugSessionInfoVarObj & - Updated *this object. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj &CMICmnLLDBDebugSessionInfoVarObj:: -operator=(CMICmnLLDBDebugSessionInfoVarObj &&vrwOther) { - MoveOther(vrwOther); - - return *this; -} - -//++ -// Details: Copy the other instance of that object to *this object. -// Type: Method. -// Args: vrOther - (R) The object to copy from. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfoVarObj::CopyOther( - const CMICmnLLDBDebugSessionInfoVarObj &vrOther) { - // Check for self-assignment - if (this == &vrOther) - return MIstatus::success; - - m_eVarFormat = vrOther.m_eVarFormat; - m_eVarType = vrOther.m_eVarType; - m_strName = vrOther.m_strName; - m_SBValue = vrOther.m_SBValue; - m_strNameReal = vrOther.m_strNameReal; - m_strFormattedValue = vrOther.m_strFormattedValue; - m_strVarObjParentName = vrOther.m_strVarObjParentName; - - return MIstatus::success; -} - -//++ -// Details: Move that object to *this object. -// Type: Method. -// Args: vrwOther - (RW) The object to copy from. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfoVarObj::MoveOther( - CMICmnLLDBDebugSessionInfoVarObj &vrwOther) { - // Check for self-assignment - if (this == &vrwOther) - return MIstatus::success; - - CopyOther(vrwOther); - vrwOther.m_eVarFormat = eVarFormat_Natural; - vrwOther.m_eVarType = eVarType_Internal; - vrwOther.m_strName.clear(); - vrwOther.m_SBValue.Clear(); - vrwOther.m_strNameReal.clear(); - vrwOther.m_strFormattedValue.clear(); - vrwOther.m_strVarObjParentName.clear(); - - return MIstatus::success; -} - -//++ -// Details: CMICmnLLDBDebugSessionInfoVarObj destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj::~CMICmnLLDBDebugSessionInfoVarObj() {} - -//++ -// Details: Retrieve the var format enumeration for the specified string. -// Type: Static method. -// Args: vrStrFormat - (R) Text description of the var format. -// Return: varFormat_e - Var format enumeration. -// - No match found return eVarFormat_Invalid. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj::varFormat_e -CMICmnLLDBDebugSessionInfoVarObj::GetVarFormatForString( - const CMIUtilString &vrStrFormat) { - // CODETAG_SESSIONINFO_VARFORMAT_ENUM - for (MIuint i = 0; i < eVarFormat_count; i++) { - const char *pVarFormatString = ms_aVarFormatStrings[i]; - if (vrStrFormat == pVarFormatString) - return static_cast(i); - } - - return eVarFormat_Invalid; -} - -//++ -// Details: Retrieve the var format enumeration for the specified character. -// Type: Static method. -// Args: vcFormat - Character representing the var format. -// Return: varFormat_e - Var format enumeration. -// - No match found return eVarFormat_Invalid. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj::varFormat_e -CMICmnLLDBDebugSessionInfoVarObj::GetVarFormatForChar(char vcFormat) { - if ('r' == vcFormat) - return eVarFormat_Hex; - - // CODETAG_SESSIONINFO_VARFORMAT_ENUM - for (MIuint i = 0; i < eVarFormat_count; i++) { - const char *pVarFormatChar = ms_aVarFormatChars[i]; - if (*pVarFormatChar == vcFormat) - return static_cast(i); - } - - return eVarFormat_Invalid; -} - -//++ -// Details: Return the equivalent var value formatted string for the given value -// type, -// which was prepared for printing (i.e. value was escaped and now it's -// ready -// for wrapping into quotes). -// The SBValue vrValue parameter is checked by LLDB private code for -// valid -// scalar type via MI Driver proxy function as the valued returned can -// also be -// an error condition. The proxy function determines if the check was -// valid -// otherwise return an error condition state by other means saying so. -// Type: Static method. -// Args: vrValue - (R) The var value object. -// veVarFormat - (R) Var format enumeration. -// Returns: CMIUtilString - Value formatted string. -// Throws: None. -//-- -CMIUtilString CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted( - const lldb::SBValue &vrValue, - const CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veVarFormat) { - const CMICmnLLDBUtilSBValue utilValue(vrValue, true); - if (utilValue.IsIntegerType()) { - MIuint64 nValue = 0; - if (CMICmnLLDBProxySBValue::GetValueAsUnsigned(vrValue, nValue)) { - lldb::SBValue &rValue = const_cast(vrValue); - return GetStringFormatted(nValue, rValue.GetValue(), veVarFormat); - } - } - - return utilValue.GetValue().AddSlashes(); -} - -//++ -// Details: Return number formatted string according to the given value type. -// Type: Static method. -// Args: vnValue - (R) The number value to get formatted. -// vpStrValueNatural - (R) The natural representation of the number -// value. -// veVarFormat - (R) Var format enumeration. -// Returns: CMIUtilString - Numerical formatted string. -// Throws: None. -//-- -CMIUtilString CMICmnLLDBDebugSessionInfoVarObj::GetStringFormatted( - const MIuint64 vnValue, const char *vpStrValueNatural, - const CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veVarFormat) { - CMIUtilString strFormattedValue; - CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veFormat = veVarFormat; - if (ms_eDefaultFormat != eVarFormat_Invalid && - veVarFormat == eVarFormat_Natural) { - veFormat = ms_eDefaultFormat; - } - - switch (veFormat) { - case eVarFormat_Binary: - strFormattedValue = CMIUtilString::FormatBinary(vnValue); - break; - case eVarFormat_Octal: - strFormattedValue = CMIUtilString::Format("0%llo", vnValue); - break; - case eVarFormat_Decimal: - strFormattedValue = CMIUtilString::Format("%lld", vnValue); - break; - case eVarFormat_Hex: - strFormattedValue = CMIUtilString::Format("0x%llx", vnValue); - break; - case eVarFormat_Natural: - default: { - strFormattedValue = (vpStrValueNatural != nullptr) ? vpStrValueNatural : ""; - } - } - - return strFormattedValue; -} - -//++ -// Details: Delete internal container contents. -// Type: Static method. -// Args: None. -// Returns: None. -// Throws: None. -//-- -void CMICmnLLDBDebugSessionInfoVarObj::VarObjClear() { - ms_mapVarIdToVarObj.clear(); -} - -//++ -// Details: Add a var object to the internal container. -// Type: Static method. -// Args: vrVarObj - (R) The var value object. -// Returns: None. -// Throws: None. -//-- -void CMICmnLLDBDebugSessionInfoVarObj::VarObjAdd( - const CMICmnLLDBDebugSessionInfoVarObj &vrVarObj) { - VarObjDelete(vrVarObj.GetName()); - MapPairKeyToVarObj_t pr(vrVarObj.GetName(), vrVarObj); - ms_mapVarIdToVarObj.insert(pr); -} - -//++ -// Details: Delete the var object from the internal container matching the -// specified name. -// Type: Static method. -// Args: vrVarName - (R) The var value name. -// Returns: None. -// Throws: None. -//-- -void CMICmnLLDBDebugSessionInfoVarObj::VarObjDelete( - const CMIUtilString &vrVarName) { - const MapKeyToVarObj_t::const_iterator it = - ms_mapVarIdToVarObj.find(vrVarName); - if (it != ms_mapVarIdToVarObj.end()) { - ms_mapVarIdToVarObj.erase(it); - } -} - -//++ -// Details: Update an existing var object in the internal container. -// Type: Static method. -// Args: vrVarObj - (R) The var value object. -// Returns: None. -// Throws: None. -//-- -void CMICmnLLDBDebugSessionInfoVarObj::VarObjUpdate( - const CMICmnLLDBDebugSessionInfoVarObj &vrVarObj) { - VarObjAdd(vrVarObj); -} - -//++ -// Details: Retrieve the var object matching the specified name. -// Type: Static method. -// Args: vrVarName - (R) The var value name. -// vrwVarObj - (W) A var object. -// Returns: bool - True = object found, false = object not found. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfoVarObj::VarObjGet( - const CMIUtilString &vrVarName, - CMICmnLLDBDebugSessionInfoVarObj &vrwVarObj) { - const MapKeyToVarObj_t::const_iterator it = - ms_mapVarIdToVarObj.find(vrVarName); - if (it != ms_mapVarIdToVarObj.end()) { - const CMICmnLLDBDebugSessionInfoVarObj &rVarObj = (*it).second; - vrwVarObj = rVarObj; - return true; - } - - return false; -} - -//++ -// Details: A count is kept of the number of var value objects created. This is -// count is -// used to ID the var value object. Reset the count to 0. -// Type: Static method. -// Args: None. -// Returns: None. -// Throws: None. -//-- -void CMICmnLLDBDebugSessionInfoVarObj::VarObjIdResetToZero() { - ms_nVarUniqueId = 0; -} - -//++ -// Details: Default format is globally used as the data format when "natural" is -// in effect, that is, this overrides the default -// Type: Static method. -// Args: None. -// Returns: None. -// Throws: None. -//-- -void CMICmnLLDBDebugSessionInfoVarObj::VarObjSetFormat( - varFormat_e eDefaultFormat) { - ms_eDefaultFormat = eDefaultFormat; -} - -//++ -// Details: A count is kept of the number of var value objects created. This is -// count is -// used to ID the var value object. Increment the count by 1. -// Type: Static method. -// Args: None. -// Returns: None. -// Throws: None. -//-- -void CMICmnLLDBDebugSessionInfoVarObj::VarObjIdInc() { ms_nVarUniqueId++; } - -//++ -// Details: A count is kept of the number of var value objects created. This is -// count is -// used to ID the var value object. Retrieve ID. -// Type: Static method. -// Args: None. -// Returns: None. -// Throws: None. -//-- -MIuint CMICmnLLDBDebugSessionInfoVarObj::VarObjIdGet() { - return ms_nVarUniqueId; -} - -//++ -// Details: Retrieve the value formatted object's name. -// Type: Method. -// Args: None. -// Returns: CMIUtilString & - Value's var%u name text. -// Throws: None. -//-- -const CMIUtilString &CMICmnLLDBDebugSessionInfoVarObj::GetName() const { - return m_strName; -} - -//++ -// Details: Retrieve the value formatted object's variable name as given in the -// MI command -// to create the var object. -// Type: Method. -// Args: None. -// Returns: CMIUtilString & - Value's real name text. -// Throws: None. -//-- -const CMIUtilString &CMICmnLLDBDebugSessionInfoVarObj::GetNameReal() const { - return m_strNameReal; -} - -//++ -// Details: Retrieve the value formatted string. -// Type: Method. -// Args: None. -// Returns: CMIUtilString & - Value formatted string. -// Throws: None. -//-- -const CMIUtilString & -CMICmnLLDBDebugSessionInfoVarObj::GetValueFormatted() const { - return m_strFormattedValue; -} - -//++ -// Details: Retrieve the LLDB Value object. -// Type: Method. -// Args: None. -// Returns: lldb::SBValue & - LLDB Value object. -// Throws: None. -//-- -lldb::SBValue &CMICmnLLDBDebugSessionInfoVarObj::GetValue() { - return m_SBValue; -} - -//++ -// Details: Retrieve the LLDB Value object. -// Type: Method. -// Args: None. -// Returns: lldb::SBValue & - Constant LLDB Value object. -// Throws: None. -//-- -const lldb::SBValue &CMICmnLLDBDebugSessionInfoVarObj::GetValue() const { - return m_SBValue; -} - -//++ -// Details: Set the var format type for *this object and update the formatting. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugSessionInfoVarObj::SetVarFormat( - const varFormat_e veVarFormat) { - if (veVarFormat >= eVarFormat_count) - return MIstatus::failure; - - m_eVarFormat = veVarFormat; - UpdateValue(); - return MIstatus::success; -} - -//++ -// Details: Update *this var obj. Update it's value and type. -// Type: Method. -// Args: None. -// Returns: None. -// Throws: None. -//-- -void CMICmnLLDBDebugSessionInfoVarObj::UpdateValue() { - m_strFormattedValue = GetValueStringFormatted(m_SBValue, m_eVarFormat); - - MIuint64 nValue = 0; - if (CMICmnLLDBProxySBValue::GetValueAsUnsigned(m_SBValue, nValue) == - MIstatus::failure) - m_eVarType = eVarType_Composite; - - CMICmnLLDBDebugSessionInfoVarObj::VarObjUpdate(*this); -} - -//++ -// Details: Retrieve the enumeration type of the var object. -// Type: Method. -// Args: None. -// Returns: varType_e - Enumeration value. -// Throws: None. -//-- -CMICmnLLDBDebugSessionInfoVarObj::varType_e -CMICmnLLDBDebugSessionInfoVarObj::GetType() const { - return m_eVarType; -} - -//++ -// Details: Retrieve the parent var object's name, the parent var object to -// *this var -// object (if assigned). The parent is equivalent to LLDB SBValue -// variable's -// parent. -// Type: Method. -// Args: None. -// Returns: CMIUtilString & - Pointer to var object, NULL = no parent. -// Throws: None. -//-- -const CMIUtilString & -CMICmnLLDBDebugSessionInfoVarObj::GetVarParentName() const { - return m_strVarObjParentName; -} diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebugger.h b/lldb/tools/lldb-mi/MICmnLLDBDebugger.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBDebugger.h +++ /dev/null @@ -1,134 +0,0 @@ -//===-- MICmnLLDBDebugger.h -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers -#include "lldb/API/SBDebugger.h" -#include "lldb/API/SBEvent.h" -#include "lldb/API/SBListener.h" -#include -#include -#include - -// In-house headers: -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" -#include "MIUtilThreadBaseStd.h" - -// Declarations: -class CMIDriverBase; -class CMICmnLLDBDebuggerHandleEvents; - -//++ -//============================================================================ -// Details: MI proxy/adapter for the LLDB public SBDebugger API. The CMIDriver -// requires *this object. Command classes make calls on *this object -// to facilitate their work effort. The instance runs in its own worker -// thread. -// A singleton class. -//-- -class CMICmnLLDBDebugger : public CMICmnBase, - public CMIUtilThreadActiveObjBase, - public MI::ISingleton { - friend class MI::ISingleton; - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - - bool SetDriver(const CMIDriverBase &vClientDriver); - CMIDriverBase &GetDriver() const; - lldb::SBDebugger &GetTheDebugger(); - lldb::SBListener &GetTheListener(); - void WaitForHandleEvent(); - bool CheckIfNeedToRebroadcastStopEvent(); - void RebroadcastStopEvent(); - - // MI Commands can use these functions to listen for events they require - bool RegisterForEvent(const CMIUtilString &vClientName, - const CMIUtilString &vBroadcasterClass, - const MIuint vEventMask); - bool UnregisterForEvent(const CMIUtilString &vClientName, - const CMIUtilString &vBroadcasterClass); - bool RegisterForEvent(const CMIUtilString &vClientName, - const lldb::SBBroadcaster &vBroadcaster, - const MIuint vEventMask); - bool UnregisterForEvent(const CMIUtilString &vClientName, - const lldb::SBBroadcaster &vBroadcaster); - - // Overridden: -public: - // From CMIUtilThreadActiveObjBase - const CMIUtilString &ThreadGetName() const override; - - // Overridden: -protected: - // From CMIUtilThreadActiveObjBase - bool ThreadRun(bool &vrIsAlive) override; - bool ThreadFinish() override; - - // Typedefs: -private: - typedef std::map MapBroadcastClassNameToEventMask_t; - typedef std::pair - MapPairBroadcastClassNameToEventMask_t; - typedef std::map MapIdToEventMask_t; - typedef std::pair MapPairIdToEventMask_t; - - // Methods: -private: - /* ctor */ CMICmnLLDBDebugger(); - /* ctor */ CMICmnLLDBDebugger(const CMICmnLLDBDebugger &); - void operator=(const CMICmnLLDBDebugger &); - - bool InitSBDebugger(); - bool InitSBListener(); - bool InitStdStreams(); - bool MonitorSBListenerEvents(bool &vrbYesExit); - - bool BroadcasterGetMask(const CMIUtilString &vBroadcasterClass, - MIuint &vEventMask) const; - bool BroadcasterRemoveMask(const CMIUtilString &vBroadcasterClass); - bool BroadcasterSaveMask(const CMIUtilString &vBroadcasterClass, - const MIuint vEventMask); - - MIuint - ClientGetMaskForAllClients(const CMIUtilString &vBroadcasterClass) const; - bool ClientSaveMask(const CMIUtilString &vClientName, - const CMIUtilString &vBroadcasterClass, - const MIuint vEventMask); - bool ClientRemoveTheirMask(const CMIUtilString &vClientName, - const CMIUtilString &vBroadcasterClass); - bool ClientGetTheirMask(const CMIUtilString &vClientName, - const CMIUtilString &vBroadcasterClass, - MIuint &vwEventMask); - bool LoadMIFormatters(lldb::SBTypeCategory miCategory); - bool RegisterMISummaryProviders(); - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmnLLDBDebugger() override; - - // Attributes: -private: - CMIDriverBase - *m_pClientDriver; // The driver that wants to use *this LLDB debugger - lldb::SBDebugger m_lldbDebugger; // SBDebugger is the primordial object that - // creates SBTargets and provides access to - // them - lldb::SBListener m_lldbListener; // API clients can register its own listener - // to debugger events - const CMIUtilString m_constStrThisThreadId; - MapBroadcastClassNameToEventMask_t m_mapBroadcastClassNameToEventMask; - MapIdToEventMask_t m_mapIdToEventMask; - std::mutex m_mutexEventQueue; - std::condition_variable m_conditionEventQueueEmpty; - uint32_t m_nLastStopId; -}; diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebugger.cpp b/lldb/tools/lldb-mi/MICmnLLDBDebugger.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBDebugger.cpp +++ /dev/null @@ -1,905 +0,0 @@ -//===-- MICmnLLDBDebugger.cpp -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers: -#include "lldb/API/SBCommandInterpreter.h" -#include "lldb/API/SBProcess.h" -#include "lldb/API/SBStream.h" -#include "lldb/API/SBTarget.h" -#include "lldb/API/SBThread.h" -#include "lldb/API/SBType.h" -#include "lldb/API/SBTypeCategory.h" -#include "lldb/API/SBTypeNameSpecifier.h" -#include "lldb/API/SBTypeSummary.h" -#include - -// In-house headers: -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnLLDBDebuggerHandleEvents.h" -#include "MICmnLog.h" -#include "MICmnResources.h" -#include "MICmnThreadMgrStd.h" -#include "MIDriverBase.h" -#include "MIUtilSingletonHelper.h" - -//++ -// MI private summary providers -static inline bool MI_char_summary_provider(lldb::SBValue value, - lldb::SBTypeSummaryOptions options, - lldb::SBStream &stream) { - if (!value.IsValid()) - return false; - - lldb::SBType value_type = value.GetType(); - if (!value_type.IsValid()) - return false; - - lldb::BasicType type_code = value_type.GetBasicType(); - if (type_code == lldb::eBasicTypeSignedChar) - stream.Printf("%d %s", (int)value.GetValueAsSigned(), - CMIUtilString::WithNullAsEmpty(value.GetValue())); - else if (type_code == lldb::eBasicTypeUnsignedChar) - stream.Printf("%u %s", (unsigned)value.GetValueAsUnsigned(), - CMIUtilString::WithNullAsEmpty(value.GetValue())); - else - return false; - - return true; -} - -//++ -// MI summary helper routines -static inline bool MI_add_summary(lldb::SBTypeCategory category, - const char *typeName, - lldb::SBTypeSummary::FormatCallback cb, - uint32_t options, bool regex = false) { -#if defined(LLDB_DISABLE_PYTHON) - return false; -#else - lldb::SBTypeSummary summary = - lldb::SBTypeSummary::CreateWithCallback(cb, options); - return summary.IsValid() - ? category.AddTypeSummary( - lldb::SBTypeNameSpecifier(typeName, regex), summary) - : false; -#endif -} - -//++ -// Details: CMICmnLLDBDebugger constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugger::CMICmnLLDBDebugger() - : m_constStrThisThreadId("MI debugger event") {} - -//++ -// Details: CMICmnLLDBDebugger destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebugger::~CMICmnLLDBDebugger() { Shutdown(); } - -//++ -// Details: Initialize resources for *this debugger object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - ClrErrorDescription(); - - if (m_pClientDriver == nullptr) { - bOk = false; - errMsg = MIRSRC(IDS_LLDBDEBUGGER_ERR_CLIENTDRIVER); - } - - // Note initialization order is important here as some resources depend on - // previous - MI::ModuleInit(IDS_MI_INIT_ERR_LOG, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_THREADMGR, bOk, errMsg); - MI::ModuleInit( - IDS_MI_INIT_ERR_OUTOFBANDHANDLER, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_DEBUGSESSIONINFO, - bOk, errMsg); - - // Note order is important here! - if (bOk) - lldb::SBDebugger::Initialize(); - if (bOk && !InitSBDebugger()) { - bOk = false; - if (!errMsg.empty()) - errMsg += ", "; - errMsg += GetErrorDescription().c_str(); - } - if (bOk && !InitSBListener()) { - bOk = false; - if (!errMsg.empty()) - errMsg += ", "; - errMsg += GetErrorDescription().c_str(); - } - bOk = bOk && InitStdStreams(); - bOk = bOk && RegisterMISummaryProviders(); - m_bInitialized = bOk; - - if (!bOk && !HaveErrorDescription()) { - CMIUtilString strInitError(CMIUtilString::Format( - MIRSRC(IDS_MI_INIT_ERR_LLDBDEBUGGER), errMsg.c_str())); - SetErrorDescription(strInitError); - } - - return bOk; -} - -//++ -// Details: Release resources for *this debugger object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - m_bInitialized = false; - - ClrErrorDescription(); - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - - // Explicitly delete the remote target in case MI needs to exit prematurely - // otherwise - // LLDB debugger may hang in its Destroy() fn waiting on events - lldb::SBTarget sbTarget = CMICmnLLDBDebugSessionInfo::Instance().GetTarget(); - m_lldbDebugger.DeleteTarget(sbTarget); - - // Debug: May need this but does seem to work without it so commented out the - // fudge 19/06/2014 - // It appears we need to wait as hang does not occur when hitting a debug - // breakpoint here - // const std::chrono::milliseconds time( 1000 ); - // std::this_thread::sleep_for( time ); - - lldb::SBDebugger::Destroy(m_lldbDebugger); - lldb::SBDebugger::Terminate(); - m_pClientDriver = nullptr; - m_mapBroadcastClassNameToEventMask.clear(); - m_mapIdToEventMask.clear(); - - // Note shutdown order is important here - MI::ModuleShutdown( - IDS_MI_INIT_ERR_DEBUGSESSIONINFO, bOk, errMsg); - MI::ModuleShutdown( - IDS_MI_INIT_ERR_OUTOFBANDHANDLER, bOk, errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_THREADMGR, bOk, - errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_LOG, bOk, errMsg); - - if (!bOk) { - SetErrorDescriptionn(MIRSRC(IDS_MI_SHTDWN_ERR_LLDBDEBUGGER), - errMsg.c_str()); - } - - return MIstatus::success; -} - -//++ -// Details: Return the LLDB debugger instance created for this debug session. -// Type: Method. -// Args: None. -// Return: lldb::SBDebugger & - LLDB debugger object reference. -// Throws: None. -//-- -lldb::SBDebugger &CMICmnLLDBDebugger::GetTheDebugger() { - return m_lldbDebugger; -} - -//++ -// Details: Return the LLDB listener instance created for this debug session. -// Type: Method. -// Args: None. -// Return: lldb::SBListener & - LLDB listener object reference. -// Throws: None. -//-- -lldb::SBListener &CMICmnLLDBDebugger::GetTheListener() { - return m_lldbListener; -} - -//++ -// Details: Set the client driver that wants to use *this LLDB debugger. Call -// this function -// prior to Initialize(). -// Type: Method. -// Args: vClientDriver - (R) A driver. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::SetDriver(const CMIDriverBase &vClientDriver) { - m_pClientDriver = const_cast(&vClientDriver); - - return MIstatus::success; -} - -//++ -// Details: Get the client driver that is use *this LLDB debugger. -// Type: Method. -// Args: vClientDriver - (R) A driver. -// Return: CMIDriverBase & - A driver instance. -// Throws: None. -//-- -CMIDriverBase &CMICmnLLDBDebugger::GetDriver() const { - return *m_pClientDriver; -} - -//++ -// Details: Wait until all events have been handled. -// This function works in pair with -// CMICmnLLDBDebugger::MonitorSBListenerEvents -// that handles events from queue. When all events were handled and -// queue is -// empty the MonitorSBListenerEvents notifies this function that it's -// ready to -// go on. To synchronize them the m_mutexEventQueue and -// m_conditionEventQueueEmpty are used. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmnLLDBDebugger::WaitForHandleEvent() { - std::unique_lock lock(m_mutexEventQueue); - - lldb::SBEvent event; - if (ThreadIsActive() && m_lldbListener.PeekAtNextEvent(event)) - m_conditionEventQueueEmpty.wait(lock); -} - -//++ -// Details: Check if need to rebroadcast stop event. This function will return -// true if -// debugger is in synchronouse mode. In such case the -// CMICmnLLDBDebugger::RebroadcastStopEvent should be called to -// rebroadcast -// a new stop event (if any). -// Type: Method. -// Args: None. -// Return: bool - True = Need to rebroadcast stop event, false = otherwise. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::CheckIfNeedToRebroadcastStopEvent() { - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - if (!rSessionInfo.GetDebugger().GetAsync()) { - const bool include_expression_stops = false; - m_nLastStopId = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess().GetStopID( - include_expression_stops); - return true; - } - - return false; -} - -//++ -// Details: Rebroadcast stop event if needed. This function should be called -// only if the -// CMICmnLLDBDebugger::CheckIfNeedToRebroadcastStopEvent() returned -// true. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmnLLDBDebugger::RebroadcastStopEvent() { - lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - const bool include_expression_stops = false; - const uint32_t nStopId = process.GetStopID(include_expression_stops); - if (m_nLastStopId != nStopId) { - lldb::SBEvent event = process.GetStopEventForStopID(nStopId); - process.GetBroadcaster().BroadcastEvent(event); - } -} - -//++ -// Details: Initialize the LLDB Debugger object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::InitSBDebugger() { - m_lldbDebugger = lldb::SBDebugger::Create(false); - if (!m_lldbDebugger.IsValid()) { - SetErrorDescription(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDDEBUGGER)); - return MIstatus::failure; - } - - m_lldbDebugger.GetCommandInterpreter().SetPromptOnQuit(false); - - return MIstatus::success; -} - -//++ -// Details: Set the LLDB Debugger's std in, err and out streams. (Not -// implemented left -// here for reference. Was called in the -// CMICmnLLDBDebugger::Initialize() ) -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::InitStdStreams() { - // This is not required when operating the MI driver's code as it has its own - // streams. Setting the Stdin for the lldbDebugger especially on LINUX will - // cause - // another thread to run and partially consume stdin data meant for MI stdin - // handler - // m_lldbDebugger.SetErrorFileHandle( m_pClientDriver->GetStderr(), false ); - // m_lldbDebugger.SetOutputFileHandle( m_pClientDriver->GetStdout(), false ); - // m_lldbDebugger.SetInputFileHandle( m_pClientDriver->GetStdin(), false ); - - return MIstatus::success; -} - -//++ -// Details: Set up the events from the SBDebugger's we would like to listen to. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::InitSBListener() { - m_lldbListener = m_lldbDebugger.GetListener(); - if (!m_lldbListener.IsValid()) { - SetErrorDescription(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDLISTENER)); - return MIstatus::failure; - } - - const CMIUtilString strDbgId("CMICmnLLDBDebugger1"); - MIuint eventMask = lldb::SBTarget::eBroadcastBitBreakpointChanged | - lldb::SBTarget::eBroadcastBitModulesLoaded | - lldb::SBTarget::eBroadcastBitModulesUnloaded | - lldb::SBTarget::eBroadcastBitWatchpointChanged | - lldb::SBTarget::eBroadcastBitSymbolsLoaded; - bool bOk = RegisterForEvent( - strDbgId, CMIUtilString(lldb::SBTarget::GetBroadcasterClassName()), - eventMask); - - eventMask = lldb::SBThread::eBroadcastBitStackChanged; - bOk = bOk && - RegisterForEvent( - strDbgId, CMIUtilString(lldb::SBThread::GetBroadcasterClassName()), - eventMask); - - eventMask = lldb::SBProcess::eBroadcastBitStateChanged | - lldb::SBProcess::eBroadcastBitInterrupt | - lldb::SBProcess::eBroadcastBitSTDOUT | - lldb::SBProcess::eBroadcastBitSTDERR | - lldb::SBProcess::eBroadcastBitProfileData | - lldb::SBProcess::eBroadcastBitStructuredData; - bOk = bOk && - RegisterForEvent( - strDbgId, CMIUtilString(lldb::SBProcess::GetBroadcasterClassName()), - eventMask); - - eventMask = lldb::SBCommandInterpreter::eBroadcastBitQuitCommandReceived | - lldb::SBCommandInterpreter::eBroadcastBitThreadShouldExit | - lldb::SBCommandInterpreter::eBroadcastBitAsynchronousOutputData | - lldb::SBCommandInterpreter::eBroadcastBitAsynchronousErrorData; - bOk = bOk && - RegisterForEvent( - strDbgId, m_lldbDebugger.GetCommandInterpreter().GetBroadcaster(), - eventMask); - - return bOk; -} - -//++ -// Details: Register with the debugger, the SBListener, the type of events you -// are interested -// in. Others, like commands, may have already set the mask. -// Type: Method. -// Args: vClientName - (R) ID of the client who wants these events -// set. -// vBroadcasterClass - (R) The SBBroadcaster's class name. -// vEventMask - (R) The mask of events to listen for. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::RegisterForEvent( - const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass, - const MIuint vEventMask) { - MIuint existingMask = 0; - if (!BroadcasterGetMask(vBroadcasterClass, existingMask)) - return MIstatus::failure; - - if (!ClientSaveMask(vClientName, vBroadcasterClass, vEventMask)) - return MIstatus::failure; - - const char *pBroadCasterName = vBroadcasterClass.c_str(); - MIuint eventMask = vEventMask; - eventMask += existingMask; - const MIuint result = m_lldbListener.StartListeningForEventClass( - m_lldbDebugger, pBroadCasterName, eventMask); - if (result == 0) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_LLDBDEBUGGER_ERR_STARTLISTENER), pBroadCasterName)); - return MIstatus::failure; - } - - return BroadcasterSaveMask(vBroadcasterClass, eventMask); -} - -//++ -// Details: Register with the debugger, the SBListener, the type of events you -// are interested -// in. Others, like commands, may have already set the mask. -// Type: Method. -// Args: vClientName - (R) ID of the client who wants these events set. -// vBroadcaster - (R) An SBBroadcaster's derived class. -// vEventMask - (R) The mask of events to listen for. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::RegisterForEvent( - const CMIUtilString &vClientName, const lldb::SBBroadcaster &vBroadcaster, - const MIuint vEventMask) { - const char *pBroadcasterName = vBroadcaster.GetName(); - if (pBroadcasterName == nullptr) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_BROADCASTER_NAME), - MIRSRC(IDS_WORD_INVALIDNULLPTR))); - return MIstatus::failure; - } - CMIUtilString broadcasterName(pBroadcasterName); - if (broadcasterName.length() == 0) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_BROADCASTER_NAME), - MIRSRC(IDS_WORD_INVALIDEMPTY))); - return MIstatus::failure; - } - - MIuint existingMask = 0; - if (!BroadcasterGetMask(broadcasterName, existingMask)) - return MIstatus::failure; - - if (!ClientSaveMask(vClientName, broadcasterName, vEventMask)) - return MIstatus::failure; - - MIuint eventMask = vEventMask; - eventMask += existingMask; - const MIuint result = - m_lldbListener.StartListeningForEvents(vBroadcaster, eventMask); - if (result == 0) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_LLDBDEBUGGER_ERR_STARTLISTENER), pBroadcasterName)); - return MIstatus::failure; - } - - return BroadcasterSaveMask(broadcasterName, eventMask); -} - -//++ -// Details: Unregister with the debugger, the SBListener, the type of events you -// are no -// longer interested in. Others, like commands, may still remain -// interested so -// an event may not necessarily be stopped. -// Type: Method. -// Args: vClientName - (R) ID of the client who no longer requires -// these events. -// vBroadcasterClass - (R) The SBBroadcaster's class name. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::UnregisterForEvent( - const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass) { - MIuint clientsEventMask = 0; - if (!ClientGetTheirMask(vClientName, vBroadcasterClass, clientsEventMask)) - return MIstatus::failure; - if (!ClientRemoveTheirMask(vClientName, vBroadcasterClass)) - return MIstatus::failure; - - const MIuint otherClientsEventMask = - ClientGetMaskForAllClients(vBroadcasterClass); - MIuint newEventMask = 0; - for (MIuint i = 0; i < 32; i++) { - const MIuint bit = MIuint(1) << i; - const MIuint clientBit = bit & clientsEventMask; - const MIuint othersBit = bit & otherClientsEventMask; - if ((clientBit != 0) && (othersBit == 0)) { - newEventMask += clientBit; - } - } - - const char *pBroadCasterName = vBroadcasterClass.c_str(); - if (!m_lldbListener.StopListeningForEventClass( - m_lldbDebugger, pBroadCasterName, newEventMask)) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_STOPLISTENER), - vClientName.c_str(), pBroadCasterName)); - return MIstatus::failure; - } - - return BroadcasterSaveMask(vBroadcasterClass, otherClientsEventMask); -} - -//++ -// Details: Given the SBBroadcaster class name retrieve it's current event mask. -// Type: Method. -// Args: vBroadcasterClass - (R) The SBBroadcaster's class name. -// vEventMask - (W) The mask of events to listen for. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::BroadcasterGetMask( - const CMIUtilString &vBroadcasterClass, MIuint &vwEventMask) const { - vwEventMask = 0; - - if (vBroadcasterClass.empty()) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDBROADCASTER), - vBroadcasterClass.c_str())); - return MIstatus::failure; - } - - const MapBroadcastClassNameToEventMask_t::const_iterator it = - m_mapBroadcastClassNameToEventMask.find(vBroadcasterClass); - if (it != m_mapBroadcastClassNameToEventMask.end()) { - vwEventMask = (*it).second; - } - - return MIstatus::success; -} - -//++ -// Details: Remove the event mask for the specified SBBroadcaster class name. -// Type: Method. -// Args: vBroadcasterClass - (R) The SBBroadcaster's class name. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::BroadcasterRemoveMask( - const CMIUtilString &vBroadcasterClass) { - MapBroadcastClassNameToEventMask_t::const_iterator it = - m_mapBroadcastClassNameToEventMask.find(vBroadcasterClass); - if (it != m_mapBroadcastClassNameToEventMask.end()) { - m_mapBroadcastClassNameToEventMask.erase(it); - } - - return MIstatus::success; -} - -//++ -// Details: Given the SBBroadcaster class name save it's current event mask. -// Type: Method. -// Args: vBroadcasterClass - (R) The SBBroadcaster's class name. -// vEventMask - (R) The mask of events to listen for. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::BroadcasterSaveMask( - const CMIUtilString &vBroadcasterClass, const MIuint vEventMask) { - if (vBroadcasterClass.empty()) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDBROADCASTER), - vBroadcasterClass.c_str())); - return MIstatus::failure; - } - - BroadcasterRemoveMask(vBroadcasterClass); - MapPairBroadcastClassNameToEventMask_t pr(vBroadcasterClass, vEventMask); - m_mapBroadcastClassNameToEventMask.insert(pr); - - return MIstatus::success; -} - -//++ -// Details: Iterate all the clients who have registered event masks against -// particular -// SBBroadcasters and build up the mask that is for all of them. -// Type: Method. -// Args: vBroadcasterClass - (R) The broadcaster to retrieve the mask for. -// Return: MIuint - Event mask. -// Throws: None. -//-- -MIuint CMICmnLLDBDebugger::ClientGetMaskForAllClients( - const CMIUtilString &vBroadcasterClass) const { - MIuint mask = 0; - MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.begin(); - while (it != m_mapIdToEventMask.end()) { - const CMIUtilString &rId((*it).first); - if (rId.find(vBroadcasterClass) != std::string::npos) { - const MIuint clientsMask = (*it).second; - mask |= clientsMask; - } - - // Next - ++it; - } - - return mask; -} - -//++ -// Details: Given the client save its particular event requirements. -// Type: Method. -// Args: vClientName - (R) The Client's unique ID. -// vBroadcasterClass - (R) The SBBroadcaster's class name targeted for -// the events. -// vEventMask - (R) The mask of events to listen for. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::ClientSaveMask(const CMIUtilString &vClientName, - const CMIUtilString &vBroadcasterClass, - const MIuint vEventMask) { - if (vClientName.empty()) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str())); - return MIstatus::failure; - } - - CMIUtilString strId(vBroadcasterClass); - strId += vClientName; - - ClientRemoveTheirMask(vClientName, vBroadcasterClass); - MapPairIdToEventMask_t pr(strId, vEventMask); - m_mapIdToEventMask.insert(pr); - - return MIstatus::success; -} - -//++ -// Details: Given the client remove it's particular event requirements. -// Type: Method. -// Args: vClientName - (R) The Client's unique ID. -// vBroadcasterClass - (R) The SBBroadcaster's class name. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::ClientRemoveTheirMask( - const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass) { - if (vClientName.empty()) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str())); - return MIstatus::failure; - } - - CMIUtilString strId(vBroadcasterClass); - strId += vClientName; - - const MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.find(strId); - if (it != m_mapIdToEventMask.end()) { - m_mapIdToEventMask.erase(it); - } - - return MIstatus::success; -} - -//++ -// Details: Retrieve the client's event mask used for on a particular -// SBBroadcaster. -// Type: Method. -// Args: vClientName - (R) The Client's unique ID. -// vBroadcasterClass - (R) The SBBroadcaster's class name. -// vwEventMask - (W) The client's mask. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::ClientGetTheirMask( - const CMIUtilString &vClientName, const CMIUtilString &vBroadcasterClass, - MIuint &vwEventMask) { - vwEventMask = 0; - - if (vClientName.empty()) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME), vClientName.c_str())); - return MIstatus::failure; - } - - const CMIUtilString strId(vBroadcasterClass + vClientName); - const MapIdToEventMask_t::const_iterator it = m_mapIdToEventMask.find(strId); - if (it != m_mapIdToEventMask.end()) { - vwEventMask = (*it).second; - } - - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_LLDBDEBUGGER_ERR_CLIENTNOTREGISTERED), vClientName.c_str())); - - return MIstatus::failure; -} - -//++ -// Details: Momentarily wait for an events being broadcast and inspect those -// that do -// come this way. Check if the target should exit event if so start -// shutting -// down this thread and the application. Any other events pass on to -// the -// Out-of-band handler to further determine what kind of event arrived. -// This function runs in the thread "MI debugger event". -// Type: Method. -// Args: vrbIsAlive - (W) False = yes exit event monitoring thread, true = -// continue. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::MonitorSBListenerEvents(bool &vrbIsAlive) { - vrbIsAlive = true; - - // Lock the mutex of event queue - // Note that it should be locked while we are in - // CMICmnLLDBDebugger::MonitorSBListenerEvents to - // avoid a race condition with CMICmnLLDBDebugger::WaitForHandleEvent - std::unique_lock lock(m_mutexEventQueue); - - lldb::SBEvent event; - const bool bGotEvent = m_lldbListener.GetNextEvent(event); - if (!bGotEvent) { - // Notify that we are finished and unlock the mutex of event queue before - // sleeping - m_conditionEventQueueEmpty.notify_one(); - lock.unlock(); - - // Wait a bit to reduce CPU load - const std::chrono::milliseconds time(1); - std::this_thread::sleep_for(time); - return MIstatus::success; - } - assert(event.IsValid()); - assert(event.GetBroadcaster().IsValid()); - - // Debugging - m_pLog->WriteLog(CMIUtilString::Format("##### An event occurred: %s", - event.GetBroadcasterClass())); - - bool bHandledEvent = false; - bool bOk = false; - { - // Lock Mutex before handling events so that we don't disturb a running cmd - CMIUtilThreadLock lock( - CMICmnLLDBDebugSessionInfo::Instance().GetSessionMutex()); - bOk = CMICmnLLDBDebuggerHandleEvents::Instance().HandleEvent(event, - bHandledEvent); - } - - if (!bHandledEvent) { - const CMIUtilString msg( - CMIUtilString::Format(MIRSRC(IDS_LLDBDEBUGGER_WRN_UNKNOWN_EVENT), - event.GetBroadcasterClass())); - m_pLog->WriteLog(msg); - } - - if (!bOk) - m_pLog->WriteLog( - CMICmnLLDBDebuggerHandleEvents::Instance().GetErrorDescription()); - - return MIstatus::success; -} - -//++ -// Details: The main worker method for this thread. -// Type: Method. -// Args: vrbIsAlive - (W) True = *this thread is working, false = thread has -// exited. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::ThreadRun(bool &vrbIsAlive) { - return MonitorSBListenerEvents(vrbIsAlive); -} - -//++ -// Details: Let this thread clean up after itself. -// Type: Method. -// Args: -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::ThreadFinish() { return MIstatus::success; } - -//++ -// Details: Retrieve *this thread object's name. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString & - Text. -// Throws: None. -//-- -const CMIUtilString &CMICmnLLDBDebugger::ThreadGetName() const { - return m_constStrThisThreadId; -} - -//++ -// Details: Loads lldb-mi formatters -// Type: Method. -// Args: None. -// Return: true - Functionality succeeded. -// false - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::LoadMIFormatters(lldb::SBTypeCategory miCategory) { - if (!MI_add_summary(miCategory, "char", MI_char_summary_provider, - lldb::eTypeOptionHideValue | - lldb::eTypeOptionSkipPointers)) - return false; - - if (!MI_add_summary(miCategory, "unsigned char", MI_char_summary_provider, - lldb::eTypeOptionHideValue | - lldb::eTypeOptionSkipPointers)) - return false; - - if (!MI_add_summary(miCategory, "signed char", MI_char_summary_provider, - lldb::eTypeOptionHideValue | - lldb::eTypeOptionSkipPointers)) - return false; - - return true; -} - -//++ -// Details: Registers lldb-mi custom summary providers -// Type: Method. -// Args: None. -// Return: true - Functionality succeeded. -// false - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebugger::RegisterMISummaryProviders() { - static const char *miCategoryName = "lldb-mi"; - lldb::SBTypeCategory miCategory = - m_lldbDebugger.CreateCategory(miCategoryName); - if (!miCategory.IsValid()) - return false; - - if (!LoadMIFormatters(miCategory)) { - m_lldbDebugger.DeleteCategory(miCategoryName); - return false; - } - miCategory.SetEnabled(true); - return true; -} diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h b/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h +++ /dev/null @@ -1,99 +0,0 @@ -//===-- MICmnLLDBDebuggerHandleEvents.h -------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnBase.h" -#include "MICmnMIValueList.h" -#include "MICmnMIValueTuple.h" -#include "MIUtilSingletonBase.h" -#include "lldb/API/SBEvent.h" - -// Declarations: -class CMICmnLLDBDebugSessionInfo; -class CMICmnMIResultRecord; -class CMICmnStreamStdout; -class CMICmnMIOutOfBandRecord; - -//++ -//============================================================================ -// Details: MI class to take LLDB SBEvent objects, filter them and form -// MI Out-of-band records from the information inside the event object. -// These records are then pushed to stdout. -// A singleton class. -//-- -class CMICmnLLDBDebuggerHandleEvents - : public CMICmnBase, - public MI::ISingleton { - friend class MI::ISingleton; - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - // - bool HandleEvent(const lldb::SBEvent &vEvent, bool &vrbHandledEvent); - - // Methods: -private: - /* ctor */ CMICmnLLDBDebuggerHandleEvents(); - /* ctor */ CMICmnLLDBDebuggerHandleEvents( - const CMICmnLLDBDebuggerHandleEvents &); - void operator=(const CMICmnLLDBDebuggerHandleEvents &); - // - bool ChkForStateChanges(); - bool GetProcessStdout(); - bool GetProcessStderr(); - bool HandleEventSBBreakPoint(const lldb::SBEvent &vEvent); - bool HandleEventSBBreakpointCmn(const lldb::SBEvent &vEvent); - bool HandleEventSBBreakpointAdded(const lldb::SBEvent &vEvent); - bool HandleEventSBBreakpointLocationsAdded(const lldb::SBEvent &vEvent); - bool HandleEventSBProcess(const lldb::SBEvent &vEvent); - bool HandleEventSBTarget(const lldb::SBEvent &vEvent); - bool HandleEventSBThread(const lldb::SBEvent &vEvent); - bool HandleEventSBThreadBitStackChanged(const lldb::SBEvent &vEvent); - bool HandleEventSBThreadSuspended(const lldb::SBEvent &vEvent); - bool HandleEventSBCommandInterpreter(const lldb::SBEvent &vEvent); - bool HandleProcessEventBroadcastBitStateChanged(const lldb::SBEvent &vEvent); - bool HandleProcessEventStateRunning(); - bool HandleProcessEventStateExited(); - bool HandleProcessEventStateStopped(const lldb::SBEvent &vrEvent, - bool &vwrbShouldBrk); - bool HandleProcessEventStopReasonTrace(); - bool HandleProcessEventStopReasonBreakpoint(); - bool HandleProcessEventStopSignal(const lldb::SBEvent &vrEvent); - bool HandleProcessEventStopException(); - bool HandleProcessEventStateSuspended(const lldb::SBEvent &vEvent); - bool HandleTargetEventBroadcastBitModulesLoaded(const lldb::SBEvent &vEvent); - bool - HandleTargetEventBroadcastBitModulesUnloaded(const lldb::SBEvent &vEvent); - bool MiHelpGetModuleInfo(const lldb::SBModule &vModule, - const bool vbWithExtraFields, - CMICmnMIOutOfBandRecord &vwrMiOutOfBandRecord); - bool MiHelpGetCurrentThreadFrame(CMICmnMIValueTuple &vwrMiValueTuple); - bool MiResultRecordToStdout(const CMICmnMIResultRecord &vrMiResultRecord); - bool - MiOutOfBandRecordToStdout(const CMICmnMIOutOfBandRecord &vrMiResultRecord); - bool MiStoppedAtBreakPoint(const MIuint64 vBrkPtId, - const lldb::SBBreakpoint &vBrkPt); - bool TextToStdout(const CMIUtilString &vrTxt); - bool TextToStderr(const CMIUtilString &vrTxt); - bool UpdateSelectedThread(); - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmnLLDBDebuggerHandleEvents() override; - void InitializeSignals(); - bool m_bSignalsInitialized; - MIuint64 m_SIGINT; - MIuint64 m_SIGSTOP; - MIuint64 m_SIGSEGV; - MIuint64 m_SIGTRAP; -}; diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp b/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp +++ /dev/null @@ -1,1883 +0,0 @@ -//===-- MICmnLLDBDebuggerHandleEvents.cpp -----------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers: -#include "lldb/API/SBAddress.h" -#include "lldb/API/SBBreakpoint.h" -#include "lldb/API/SBCommandInterpreter.h" -#include "lldb/API/SBCommandReturnObject.h" -#include "lldb/API/SBEvent.h" -#include "lldb/API/SBProcess.h" -#include "lldb/API/SBStream.h" -#include "lldb/API/SBTarget.h" -#include "lldb/API/SBThread.h" -#include "lldb/API/SBUnixSignals.h" -#include "llvm/Support/Compiler.h" -#ifdef _WIN32 -#include -#else -#include -#endif // _WIN32 - -// In-house headers: -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnLLDBDebuggerHandleEvents.h" -#include "MICmnLog.h" -#include "MICmnMIOutOfBandRecord.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "MICmnMIValueList.h" -#include "MICmnResources.h" -#include "MICmnStreamStderr.h" -#include "MICmnStreamStdout.h" -#include "MIDriver.h" -#include "MIUtilDebug.h" -#include "Platform.h" - -#include - -//++ -// Details: CMICmnLLDBDebuggerHandleEvents constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebuggerHandleEvents::CMICmnLLDBDebuggerHandleEvents() {} - -//++ -// Details: CMICmnLLDBDebuggerHandleEvents destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBDebuggerHandleEvents::~CMICmnLLDBDebuggerHandleEvents() { - Shutdown(); -} - -//++ -// Details: Initialize resources for *this broadcaster object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - m_bInitialized = MIstatus::success; - m_bSignalsInitialized = false; - m_SIGINT = 0; - m_SIGSTOP = 0; - m_SIGSEGV = 0; - m_SIGTRAP = 0; - - return m_bInitialized; -} - -//++ -// Details: Release resources for *this broadcaster object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - m_bInitialized = false; - - return MIstatus::success; -} - -//++ -// Details: Interpret the event object to ascertain the action to take or -// information to -// to form and put in a MI Out-of-band record object which is given to -// stdout. -// Type: Method. -// Args: vEvent - (R) An LLDB broadcast event. -// vrbHandledEvent - (W) True - event handled, false = not handled. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEvent(const lldb::SBEvent &vEvent, - bool &vrbHandledEvent) { - bool bOk = MIstatus::success; - vrbHandledEvent = false; - - if (lldb::SBProcess::EventIsProcessEvent(vEvent)) { - vrbHandledEvent = true; - bOk = HandleEventSBProcess(vEvent); - } else if (lldb::SBBreakpoint::EventIsBreakpointEvent(vEvent)) { - vrbHandledEvent = true; - bOk = HandleEventSBBreakPoint(vEvent); - } else if (lldb::SBThread::EventIsThreadEvent(vEvent)) { - vrbHandledEvent = true; - bOk = HandleEventSBThread(vEvent); - } else if (lldb::SBTarget::EventIsTargetEvent(vEvent)) { - vrbHandledEvent = true; - bOk = HandleEventSBTarget(vEvent); - } else if (lldb::SBCommandInterpreter::EventIsCommandInterpreterEvent( - vEvent)) { - vrbHandledEvent = true; - bOk = HandleEventSBCommandInterpreter(vEvent); - } - - return bOk; -} - -//++ -// Details: Handle a LLDB SBProcess event. -// Type: Method. -// Args: vEvent - (R) An LLDB broadcast event. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBProcess( - const lldb::SBEvent &vEvent) { - bool bOk = MIstatus::success; - - const char *pEventType = ""; - const MIuint nEventType = vEvent.GetType(); - switch (nEventType) { - case lldb::SBProcess::eBroadcastBitInterrupt: - pEventType = "eBroadcastBitInterrupt"; - break; - case lldb::SBProcess::eBroadcastBitProfileData: - pEventType = "eBroadcastBitProfileData"; - break; - case lldb::SBProcess::eBroadcastBitStructuredData: - pEventType = "eBroadcastBitStructuredData"; - break; - case lldb::SBProcess::eBroadcastBitStateChanged: - pEventType = "eBroadcastBitStateChanged"; - bOk = HandleProcessEventBroadcastBitStateChanged(vEvent); - break; - case lldb::SBProcess::eBroadcastBitSTDERR: - pEventType = "eBroadcastBitSTDERR"; - bOk = GetProcessStderr(); - break; - case lldb::SBProcess::eBroadcastBitSTDOUT: - pEventType = "eBroadcastBitSTDOUT"; - bOk = GetProcessStdout(); - break; - default: { - const CMIUtilString msg( - CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), - "SBProcess", (MIuint)nEventType)); - SetErrorDescription(msg); - return MIstatus::failure; - } - } - m_pLog->WriteLog(CMIUtilString::Format( - "##### An SB Process event occurred: %s", pEventType)); - - return bOk; -} - -//++ -// Details: Handle a LLDB SBBreakpoint event. -// Type: Method. -// Args: vEvent - (R) An LLDB broadcast event. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakPoint( - const lldb::SBEvent &vEvent) { - bool bOk = MIstatus::success; - - const char *pEventType = ""; - const lldb::BreakpointEventType eEvent = - lldb::SBBreakpoint::GetBreakpointEventTypeFromEvent(vEvent); - switch (eEvent) { - case lldb::eBreakpointEventTypeThreadChanged: - pEventType = "eBreakpointEventTypeThreadChanged"; - break; - case lldb::eBreakpointEventTypeLocationsRemoved: - pEventType = "eBreakpointEventTypeLocationsRemoved"; - break; - case lldb::eBreakpointEventTypeInvalidType: - pEventType = "eBreakpointEventTypeInvalidType"; - break; - case lldb::eBreakpointEventTypeLocationsAdded: - pEventType = "eBreakpointEventTypeLocationsAdded"; - bOk = HandleEventSBBreakpointLocationsAdded(vEvent); - break; - case lldb::eBreakpointEventTypeAdded: - pEventType = "eBreakpointEventTypeAdded"; - bOk = HandleEventSBBreakpointAdded(vEvent); - break; - case lldb::eBreakpointEventTypeRemoved: - pEventType = "eBreakpointEventTypeRemoved"; - bOk = HandleEventSBBreakpointCmn(vEvent); - break; - case lldb::eBreakpointEventTypeLocationsResolved: - pEventType = "eBreakpointEventTypeLocationsResolved"; - bOk = HandleEventSBBreakpointCmn(vEvent); - break; - case lldb::eBreakpointEventTypeEnabled: - pEventType = "eBreakpointEventTypeEnabled"; - bOk = HandleEventSBBreakpointCmn(vEvent); - break; - case lldb::eBreakpointEventTypeDisabled: - pEventType = "eBreakpointEventTypeDisabled"; - bOk = HandleEventSBBreakpointCmn(vEvent); - break; - case lldb::eBreakpointEventTypeCommandChanged: - pEventType = "eBreakpointEventTypeCommandChanged"; - bOk = HandleEventSBBreakpointCmn(vEvent); - break; - case lldb::eBreakpointEventTypeConditionChanged: - pEventType = "eBreakpointEventTypeConditionChanged"; - bOk = HandleEventSBBreakpointCmn(vEvent); - break; - case lldb::eBreakpointEventTypeIgnoreChanged: - pEventType = "eBreakpointEventTypeIgnoreChanged"; - bOk = HandleEventSBBreakpointCmn(vEvent); - break; - case lldb::eBreakpointEventTypeAutoContinueChanged: - pEventType = "eBreakpointEventTypeAutoContinueChanged"; - bOk = HandleEventSBBreakpointCmn(vEvent); - break; - } - m_pLog->WriteLog(CMIUtilString::Format( - "##### An SB Breakpoint event occurred: %s", pEventType)); - - return bOk; -} - -//++ -// Details: Handle a LLDB SBBreakpoint event. -// Type: Method. -// Args: vEvent - (R) An LLDB broadcast event. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointLocationsAdded( - const lldb::SBEvent &vEvent) { - const MIuint nLoc = - lldb::SBBreakpoint::GetNumBreakpointLocationsFromEvent(vEvent); - if (nLoc == 0) - return MIstatus::success; - - lldb::SBBreakpoint brkPt = lldb::SBBreakpoint::GetBreakpointFromEvent(vEvent); - const CMIUtilString plural((nLoc == 1) ? "" : "s"); - const CMIUtilString msg( - CMIUtilString::Format("%d location%s added to breakpoint %d", nLoc, - plural.c_str(), brkPt.GetID())); - - return TextToStdout(msg); -} - -//++ -// Details: Handle a LLDB SBBreakpoint event. -// Type: Method. -// Args: vEvent - (R) An LLDB broadcast event. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointCmn( - const lldb::SBEvent &vEvent) { - lldb::SBBreakpoint brkPt = lldb::SBBreakpoint::GetBreakpointFromEvent(vEvent); - if (!brkPt.IsValid()) - return MIstatus::success; - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfo; - if (!rSessionInfo.GetBrkPtInfo(brkPt, sBrkPtInfo)) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_GET), - "HandleEventSBBreakpointCmn()", brkPt.GetID())); - return MIstatus::failure; - } - - // CODETAG_LLDB_BREAKPOINT_CREATION - // This is in a worker thread - // Add more breakpoint information or overwrite existing information - CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfoRec; - if (!rSessionInfo.RecordBrkPtInfoGet(brkPt.GetID(), sBrkPtInfoRec)) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_NOTFOUND), - "HandleEventSBBreakpointCmn()", brkPt.GetID())); - return MIstatus::failure; - } - sBrkPtInfo.m_bDisp = sBrkPtInfoRec.m_bDisp; - sBrkPtInfo.m_bEnabled = brkPt.IsEnabled(); - sBrkPtInfo.m_bHaveArgOptionThreadGrp = false; - sBrkPtInfo.m_strOptThrdGrp = ""; - sBrkPtInfo.m_nTimes = brkPt.GetHitCount(); - sBrkPtInfo.m_strOrigLoc = sBrkPtInfoRec.m_strOrigLoc; - sBrkPtInfo.m_nIgnore = sBrkPtInfoRec.m_nIgnore; - sBrkPtInfo.m_bPending = sBrkPtInfoRec.m_bPending; - sBrkPtInfo.m_bCondition = sBrkPtInfoRec.m_bCondition; - sBrkPtInfo.m_strCondition = sBrkPtInfoRec.m_strCondition; - sBrkPtInfo.m_bBrkPtThreadId = sBrkPtInfoRec.m_bBrkPtThreadId; - sBrkPtInfo.m_nBrkPtThreadId = sBrkPtInfoRec.m_nBrkPtThreadId; - - // MI print - // "=breakpoint-modified,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016" - // PRIx64 "\", - // func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",times=\"%d\",original-location=\"%s\"}" - CMICmnMIValueTuple miValueTuple; - if (!rSessionInfo.MIResponseFormBrkPtInfo(sBrkPtInfo, miValueTuple)) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE), - "HandleEventSBBreakpointCmn()")); - return MIstatus::failure; - } - - const CMICmnMIValueResult miValueResultC("bkpt", miValueTuple); - const CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointModified, miValueResultC); - bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - - return bOk; -} - -//++ -// Details: Handle a LLDB SBBreakpoint added event. -// Add more breakpoint information or overwrite existing information. -// Normally a break point session info objects exists by now when an MI -// command -// was issued to insert a break so the retrieval would normally always -// succeed -// however should a user type "b main" into a console then LLDB will -// create a -// breakpoint directly, hence no MI command, hence no previous record -// of the -// breakpoint so RecordBrkPtInfoGet() will fail. We still get the event -// though -// so need to create a breakpoint info object here and send appropriate -// MI -// response. -// Type: Method. -// Args: vEvent - (R) An LLDB broadcast event. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakpointAdded( - const lldb::SBEvent &vEvent) { - lldb::SBBreakpoint brkPt = lldb::SBBreakpoint::GetBreakpointFromEvent(vEvent); - if (!brkPt.IsValid()) - return MIstatus::success; - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfo; - if (!rSessionInfo.GetBrkPtInfo(brkPt, sBrkPtInfo)) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_GET), - "HandleEventSBBreakpointAdded()", brkPt.GetID())); - return MIstatus::failure; - } - - // CODETAG_LLDB_BREAKPOINT_CREATION - // This is in a worker thread - CMICmnLLDBDebugSessionInfo::SBrkPtInfo sBrkPtInfoRec; - const bool bBrkPtExistAlready = - rSessionInfo.RecordBrkPtInfoGet(brkPt.GetID(), sBrkPtInfoRec); - if (bBrkPtExistAlready) { - // Update breakpoint information object - sBrkPtInfo.m_bDisp = sBrkPtInfoRec.m_bDisp; - sBrkPtInfo.m_bEnabled = brkPt.IsEnabled(); - sBrkPtInfo.m_bHaveArgOptionThreadGrp = false; - sBrkPtInfo.m_strOptThrdGrp.clear(); - sBrkPtInfo.m_nTimes = brkPt.GetHitCount(); - sBrkPtInfo.m_strOrigLoc = sBrkPtInfoRec.m_strOrigLoc; - sBrkPtInfo.m_nIgnore = sBrkPtInfoRec.m_nIgnore; - sBrkPtInfo.m_bPending = sBrkPtInfoRec.m_bPending; - sBrkPtInfo.m_bCondition = sBrkPtInfoRec.m_bCondition; - sBrkPtInfo.m_strCondition = sBrkPtInfoRec.m_strCondition; - sBrkPtInfo.m_bBrkPtThreadId = sBrkPtInfoRec.m_bBrkPtThreadId; - sBrkPtInfo.m_nBrkPtThreadId = sBrkPtInfoRec.m_nBrkPtThreadId; - } else { - // Create a breakpoint information object - sBrkPtInfo.m_bDisp = brkPt.IsOneShot(); - sBrkPtInfo.m_bEnabled = brkPt.IsEnabled(); - sBrkPtInfo.m_bHaveArgOptionThreadGrp = false; - sBrkPtInfo.m_strOptThrdGrp.clear(); - sBrkPtInfo.m_strOrigLoc = CMIUtilString::Format( - "%s:%d", sBrkPtInfo.m_fileName.c_str(), sBrkPtInfo.m_nLine); - sBrkPtInfo.m_nIgnore = brkPt.GetIgnoreCount(); - sBrkPtInfo.m_bPending = false; - const char *pStrCondition = brkPt.GetCondition(); - sBrkPtInfo.m_bCondition = pStrCondition != nullptr; - sBrkPtInfo.m_strCondition = - (pStrCondition != nullptr) ? pStrCondition : "??"; - sBrkPtInfo.m_bBrkPtThreadId = brkPt.GetThreadID() != 0; - sBrkPtInfo.m_nBrkPtThreadId = brkPt.GetThreadID(); - } - - CMICmnMIValueTuple miValueTuple; - if (!rSessionInfo.MIResponseFormBrkPtInfo(sBrkPtInfo, miValueTuple)) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE), - "HandleEventSBBreakpointAdded()")); - return MIstatus::failure; - } - - bool bOk = MIstatus::success; - if (bBrkPtExistAlready) { - // MI print - // "=breakpoint-modified,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016" - // PRIx64 - // "\",func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",times=\"%d\",original-location=\"%s\"}" - const CMICmnMIValueResult miValueResult("bkpt", miValueTuple); - const CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointModified, miValueResult); - bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - } else { - // CODETAG_LLDB_BRKPT_ID_MAX - if (brkPt.GetID() > (lldb::break_id_t)rSessionInfo.m_nBrkPointCntMax) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_CMD_ERR_BRKPT_CNT_EXCEEDED), - "HandleEventSBBreakpointAdded()", rSessionInfo.m_nBrkPointCntMax, - sBrkPtInfo.m_id)); - return MIstatus::failure; - } - if (!rSessionInfo.RecordBrkPtInfo(brkPt.GetID(), sBrkPtInfo)) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_SET), - "HandleEventSBBreakpointAdded()", sBrkPtInfo.m_id)); - return MIstatus::failure; - } - - // MI print - // "=breakpoint-created,bkpt={number=\"%d\",type=\"breakpoint\",disp=\"%s\",enabled=\"%c\",addr=\"0x%016" - // PRIx64 - // "\",func=\"%s\",file=\"%s\",fullname=\"%s/%s\",line=\"%d\",times=\"%d\",original-location=\"%s\"}" - const CMICmnMIValueResult miValueResult("bkpt", miValueTuple); - const CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointCreated, miValueResult); - bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - } - - return bOk; -} - -//++ -// Details: Handle a LLDB SBThread event. -// Type: Method. -// Args: vEvent - (R) An LLDB broadcast event. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBThread( - const lldb::SBEvent &vEvent) { - if (!ChkForStateChanges()) - return MIstatus::failure; - - bool bOk = MIstatus::success; - const char *pEventType = ""; - const MIuint nEventType = vEvent.GetType(); - switch (nEventType) { - case lldb::SBThread::eBroadcastBitStackChanged: - pEventType = "eBroadcastBitStackChanged"; - bOk = HandleEventSBThreadBitStackChanged(vEvent); - break; - case lldb::SBThread::eBroadcastBitThreadSuspended: - pEventType = "eBroadcastBitThreadSuspended"; - bOk = HandleEventSBThreadSuspended(vEvent); - break; - case lldb::SBThread::eBroadcastBitThreadResumed: - pEventType = "eBroadcastBitThreadResumed"; - break; - case lldb::SBThread::eBroadcastBitSelectedFrameChanged: - pEventType = "eBroadcastBitSelectedFrameChanged"; - break; - case lldb::SBThread::eBroadcastBitThreadSelected: - pEventType = "eBroadcastBitThreadSelected"; - break; - default: { - const CMIUtilString msg( - CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), - "SBThread", (MIuint)nEventType)); - SetErrorDescription(msg); - return MIstatus::failure; - } - } - m_pLog->WriteLog(CMIUtilString::Format("##### An SBThread event occurred: %s", - pEventType)); - - return bOk; -} - -//++ -// Details: Handle a LLDB SBThread event. -// Type: Method. -// Args: vEvent - (R) An LLDB broadcast event. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBThreadSuspended( - const lldb::SBEvent &vEvent) { - lldb::SBThread thread = lldb::SBThread::GetThreadFromEvent(vEvent); - if (!thread.IsValid()) - return MIstatus::success; - - const lldb::StopReason eStopReason = thread.GetStopReason(); - if (eStopReason != lldb::eStopReasonSignal) - return MIstatus::success; - - // MI print "@thread=%d,signal=%lld" - const MIuint64 nId = thread.GetStopReasonDataAtIndex(0); - const CMIUtilString strThread( - CMIUtilString::Format("%d", thread.GetThreadID())); - const CMICmnMIValueConst miValueConst(strThread); - const CMICmnMIValueResult miValueResult("thread", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Thread, miValueResult); - const CMIUtilString strSignal(CMIUtilString::Format("%lld", nId)); - const CMICmnMIValueConst miValueConst2(strSignal); - const CMICmnMIValueResult miValueResult2("signal", miValueConst2); - miOutOfBandRecord.Add(miValueResult2); - return MiOutOfBandRecordToStdout(miOutOfBandRecord); -} - -//++ -// Details: Handle a LLDB SBThread event. -// Type: Method. -// Args: vEvent - (R) An LLDB broadcast event. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBThreadBitStackChanged( - const lldb::SBEvent &vEvent) { - lldb::SBThread thread = lldb::SBThread::GetThreadFromEvent(vEvent); - if (!thread.IsValid()) - return MIstatus::success; - - lldb::SBStream streamOut; - const bool bOk = thread.GetStatus(streamOut); - return bOk && TextToStdout(streamOut.GetData()); -} - -//++ -// Details: Handle a LLDB SBTarget event. -// Type: Method. -// Args: vEvent - (R) An LLDB broadcast event. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBTarget( - const lldb::SBEvent &vEvent) { - if (!ChkForStateChanges()) - return MIstatus::failure; - - bool bOk = MIstatus::success; - const char *pEventType = ""; - const MIuint nEventType = vEvent.GetType(); - switch (nEventType) { - case lldb::SBTarget::eBroadcastBitBreakpointChanged: - pEventType = "eBroadcastBitBreakpointChanged"; - break; - case lldb::SBTarget::eBroadcastBitModulesLoaded: - pEventType = "eBroadcastBitModulesLoaded"; - bOk = HandleTargetEventBroadcastBitModulesLoaded(vEvent); - break; - case lldb::SBTarget::eBroadcastBitModulesUnloaded: - pEventType = "eBroadcastBitModulesUnloaded"; - bOk = HandleTargetEventBroadcastBitModulesUnloaded(vEvent); - break; - case lldb::SBTarget::eBroadcastBitWatchpointChanged: - pEventType = "eBroadcastBitWatchpointChanged"; - break; - case lldb::SBTarget::eBroadcastBitSymbolsLoaded: - pEventType = "eBroadcastBitSymbolsLoaded"; - break; - default: { - const CMIUtilString msg( - CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), - "SBTarget", (MIuint)nEventType)); - SetErrorDescription(msg); - return MIstatus::failure; - } - } - m_pLog->WriteLog(CMIUtilString::Format("##### An SBTarget event occurred: %s", - pEventType)); - - return bOk; -} - -//++ -// Details: Print to stdout -// "=library-loaded,id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016" -// PRIx64"\"" -// Type: Method. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleTargetEventBroadcastBitModulesLoaded( - const lldb::SBEvent &vEvent) { - bool bOk = MIstatus::failure; - const MIuint nSize = lldb::SBTarget::GetNumModulesFromEvent(vEvent); - for (MIuint nIndex = 0; nIndex < nSize; ++nIndex) { - const lldb::SBModule sbModule = - lldb::SBTarget::GetModuleAtIndexFromEvent(nIndex, vEvent); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleLoaded); - const bool bWithExtraFields = true; - bOk = MiHelpGetModuleInfo(sbModule, bWithExtraFields, miOutOfBandRecord); - bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord); - if (!bOk) - break; - } - - return bOk; -} - -//++ -// Details: Print to stdout -// "=library-unloaded,id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016" -// PRIx64"\"" -// Type: Method. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents:: - HandleTargetEventBroadcastBitModulesUnloaded(const lldb::SBEvent &vEvent) { - bool bOk = MIstatus::failure; - const MIuint nSize = lldb::SBTarget::GetNumModulesFromEvent(vEvent); - for (MIuint nIndex = 0; nIndex < nSize; ++nIndex) { - const lldb::SBModule sbModule = - lldb::SBTarget::GetModuleAtIndexFromEvent(nIndex, vEvent); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleUnloaded); - const bool bWithExtraFields = false; - bOk = MiHelpGetModuleInfo(sbModule, bWithExtraFields, miOutOfBandRecord); - bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord); - if (!bOk) - break; - } - - return bOk; -} - -//++ -// Details: Build module information for =library-loaded/=library-unloaded: -// "id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016" -// PRIx64"\"" -// Type: Method. -// Args: vwrMiValueList - (W) MI value list object. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::MiHelpGetModuleInfo( - const lldb::SBModule &vModule, const bool vbWithExtraFields, - CMICmnMIOutOfBandRecord &vwrMiOutOfBandRecord) { - bool bOk = MIstatus::success; - - // First, build standard fields: - // Build "id" field - std::unique_ptr apPath(new char[PATH_MAX]); - vModule.GetFileSpec().GetPath(apPath.get(), PATH_MAX); - const CMIUtilString strTargetPath(apPath.get()); - const CMICmnMIValueConst miValueConst(strTargetPath.AddSlashes()); - const CMICmnMIValueResult miValueResult("id", miValueConst); - vwrMiOutOfBandRecord.Add(miValueResult); - // Build "target-name" field - const CMICmnMIValueConst miValueConst2(strTargetPath.AddSlashes()); - const CMICmnMIValueResult miValueResult2("target-name", miValueConst2); - vwrMiOutOfBandRecord.Add(miValueResult2); - // Build "host-name" field - vModule.GetPlatformFileSpec().GetPath(apPath.get(), PATH_MAX); - const CMIUtilString strHostPath(apPath.get()); - const CMICmnMIValueConst miValueConst3(strHostPath.AddSlashes()); - const CMICmnMIValueResult miValueResult3("host-name", miValueConst3); - vwrMiOutOfBandRecord.Add(miValueResult3); - - // Then build extra fields if needed: - if (vbWithExtraFields) { - // Build "symbols-loaded" field - vModule.GetSymbolFileSpec().GetPath(apPath.get(), PATH_MAX); - const CMIUtilString strSymbolsPath(apPath.get()); - const bool bSymbolsLoaded = - !CMIUtilString::Compare(strHostPath, strSymbolsPath); - const CMICmnMIValueConst miValueConst4( - CMIUtilString::Format("%d", bSymbolsLoaded)); - const CMICmnMIValueResult miValueResult4("symbols-loaded", miValueConst4); - vwrMiOutOfBandRecord.Add(miValueResult4); - // Build "symbols-path" field - if (bSymbolsLoaded) { - const CMICmnMIValueConst miValueConst5(strSymbolsPath.AddSlashes()); - const CMICmnMIValueResult miValueResult5("symbols-path", miValueConst5); - vwrMiOutOfBandRecord.Add(miValueResult5); - } - // Build "loaded_addr" field - lldb::SBAddress sbAddress(vModule.GetObjectFileHeaderAddress()); - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - const lldb::addr_t nLoadAddress( - sbAddress.GetLoadAddress(rSessionInfo.GetTarget())); - const CMIUtilString strLoadedAddr( - nLoadAddress != LLDB_INVALID_ADDRESS - ? CMIUtilString::Format("0x%016" PRIx64, nLoadAddress) - : "-"); - const CMICmnMIValueConst miValueConst6(strLoadedAddr); - const CMICmnMIValueResult miValueResult6("loaded_addr", miValueConst6); - vwrMiOutOfBandRecord.Add(miValueResult6); - - // Build "size" field - lldb::SBSection sbSection = sbAddress.GetSection(); - const CMIUtilString strSize( - CMIUtilString::Format("%" PRIu64, sbSection.GetByteSize())); - const CMICmnMIValueConst miValueConst7(strSize); - const CMICmnMIValueResult miValueResult7("size", miValueConst7); - vwrMiOutOfBandRecord.Add(miValueResult7); - } - - return bOk; -} - -//++ -// Details: Handle a LLDB SBCommandInterpreter event. -// Type: Method. -// Args: vEvent - (R) An LLDB command interpreter event. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleEventSBCommandInterpreter( - const lldb::SBEvent &vEvent) { - // This function is not used - // *** This function is under development - - const char *pEventType = ""; - const MIuint nEventType = vEvent.GetType(); - switch (nEventType) { - case lldb::SBCommandInterpreter::eBroadcastBitThreadShouldExit: - pEventType = "eBroadcastBitThreadShouldExit"; - // ToDo: IOR: Reminder to maybe handle this here - // const MIuint nEventType = event.GetType(); - // if (nEventType & - // lldb::SBCommandInterpreter::eBroadcastBitThreadShouldExit) - //{ - // m_pClientDriver->SetExitApplicationFlag(); - // vrbYesExit = true; - // return MIstatus::success; - //} - break; - case lldb::SBCommandInterpreter::eBroadcastBitResetPrompt: - pEventType = "eBroadcastBitResetPrompt"; - break; - case lldb::SBCommandInterpreter::eBroadcastBitQuitCommandReceived: { - pEventType = "eBroadcastBitQuitCommandReceived"; - const bool bForceExit = true; - CMICmnLLDBDebugger::Instance().GetDriver().SetExitApplicationFlag( - bForceExit); - break; - } - case lldb::SBCommandInterpreter::eBroadcastBitAsynchronousOutputData: - pEventType = "eBroadcastBitAsynchronousOutputData"; - break; - case lldb::SBCommandInterpreter::eBroadcastBitAsynchronousErrorData: - pEventType = "eBroadcastBitAsynchronousErrorData"; - break; - default: { - const CMIUtilString msg( - CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), - "SBCommandInterpreter", (MIuint)nEventType)); - SetErrorDescription(msg); - return MIstatus::failure; - } - } - m_pLog->WriteLog(CMIUtilString::Format( - "##### An SBCommandInterpreter event occurred: %s", pEventType)); - - return MIstatus::success; -} - -//++ -// Details: Handle SBProcess event eBroadcastBitStateChanged. -// Type: Method. -// Args: vEvent - (R) An LLDB event object. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventBroadcastBitStateChanged( - const lldb::SBEvent &vEvent) { - // Make sure the program hasn't been auto-restarted: - if (lldb::SBProcess::GetRestartedFromEvent(vEvent)) - return MIstatus::success; - - bool bOk = ChkForStateChanges(); - bOk = bOk && GetProcessStdout(); - bOk = bOk && GetProcessStderr(); - if (!bOk) - return MIstatus::failure; - - // Something changed in the process; get the event and report the process's - // current - // status and location - const lldb::StateType eEventState = - lldb::SBProcess::GetStateFromEvent(vEvent); - if (eEventState == lldb::eStateInvalid) - return MIstatus::success; - - lldb::SBProcess process = lldb::SBProcess::GetProcessFromEvent(vEvent); - if (!process.IsValid()) { - const CMIUtilString msg(CMIUtilString::Format( - MIRSRC(IDS_LLDBOUTOFBAND_ERR_PROCESS_INVALID), "SBProcess", - "HandleProcessEventBroadcastBitStateChanged()")); - SetErrorDescription(msg); - return MIstatus::failure; - } - - bool bShouldBrk = true; - const char *pEventType = ""; - switch (eEventState) { - case lldb::eStateUnloaded: - pEventType = "eStateUnloaded"; - break; - case lldb::eStateConnected: - pEventType = "eStateConnected"; - break; - case lldb::eStateAttaching: - pEventType = "eStateAttaching"; - break; - case lldb::eStateLaunching: - pEventType = "eStateLaunching"; - break; - case lldb::eStateStopped: - pEventType = "eStateStopped"; - bOk = HandleProcessEventStateStopped(vEvent, bShouldBrk); - if (bShouldBrk) - break; - LLVM_FALLTHROUGH; - case lldb::eStateCrashed: - case lldb::eStateSuspended: - pEventType = "eStateSuspended"; - bOk = HandleProcessEventStateSuspended(vEvent); - break; - case lldb::eStateRunning: - pEventType = "eStateRunning"; - bOk = HandleProcessEventStateRunning(); - break; - case lldb::eStateStepping: - pEventType = "eStateStepping"; - break; - case lldb::eStateDetached: - pEventType = "eStateDetached"; - break; - case lldb::eStateExited: - // Don't exit from lldb-mi here. We should be able to re-run target. - pEventType = "eStateExited"; - bOk = HandleProcessEventStateExited(); - break; - default: { - const CMIUtilString msg(CMIUtilString::Format( - MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), - "SBProcess BroadcastBitStateChanged", (MIuint)eEventState)); - SetErrorDescription(msg); - return MIstatus::failure; - } - } - - // ToDo: Remove when finished coding application - m_pLog->WriteLog(CMIUtilString::Format( - "##### An SB Process event BroadcastBitStateChanged occurred: %s", - pEventType)); - - return bOk; -} - -//++ -// Details: Asynchronous event handler for LLDB Process state suspended. -// Type: Method. -// Args: vEvent - (R) An LLDB event object. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateSuspended( - const lldb::SBEvent &vEvent) { - bool bOk = MIstatus::success; - lldb::SBStream streamOut; - lldb::SBDebugger &rDebugger = - CMICmnLLDBDebugSessionInfo::Instance().GetDebugger(); - lldb::SBProcess sbProcess = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - lldb::SBTarget target = sbProcess.GetTarget(); - if (rDebugger.GetSelectedTarget() == target) { - if (!UpdateSelectedThread()) - return MIstatus::failure; - sbProcess.GetDescription(streamOut); - // Add a delimiter between process' and threads' info. - streamOut.Printf("\n"); - for (uint32_t i = 0, e = sbProcess.GetNumThreads(); i < e; ++i) { - const lldb::SBThread thread = sbProcess.GetThreadAtIndex(i); - if (!thread.IsValid()) - continue; - thread.GetDescription(streamOut); - } - bOk = TextToStdout(streamOut.GetData()); - } else { - const MIuint nTargetIndex = rDebugger.GetIndexOfTarget(target); - if (nTargetIndex != UINT_MAX) - streamOut.Printf("Target %" PRIu64 ": (", (uint64_t)nTargetIndex); - else - streamOut.Printf("Target : ("); - target.GetDescription(streamOut, lldb::eDescriptionLevelBrief); - streamOut.Printf(") stopped.\n"); - bOk = TextToStdout(streamOut.GetData()); - } - - return bOk; -} - -//++ -// Details: Print to stdout MI formatted text to indicate process stopped. -// Type: Method. -// Args: vwrbShouldBrk - (W) True = Yes break, false = do not. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateStopped( - const lldb::SBEvent &vrEvent, bool &vwrbShouldBrk) { - if (!UpdateSelectedThread()) - return MIstatus::failure; - - const char *pEventType = ""; - bool bOk = MIstatus::success; - lldb::SBProcess sbProcess = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - const lldb::StopReason eStoppedReason = - sbProcess.GetSelectedThread().GetStopReason(); - switch (eStoppedReason) { - case lldb::eStopReasonInvalid: - pEventType = "eStopReasonInvalid"; - vwrbShouldBrk = false; - break; - case lldb::eStopReasonNone: - pEventType = "eStopReasonNone"; - break; - case lldb::eStopReasonTrace: - pEventType = "eStopReasonTrace"; - bOk = HandleProcessEventStopReasonTrace(); - break; - case lldb::eStopReasonBreakpoint: - pEventType = "eStopReasonBreakpoint"; - bOk = HandleProcessEventStopReasonBreakpoint(); - break; - case lldb::eStopReasonWatchpoint: - pEventType = "eStopReasonWatchpoint"; - break; - case lldb::eStopReasonSignal: - pEventType = "eStopReasonSignal"; - bOk = HandleProcessEventStopSignal(vrEvent); - break; - case lldb::eStopReasonException: - pEventType = "eStopReasonException"; - bOk = HandleProcessEventStopException(); - break; - case lldb::eStopReasonExec: - pEventType = "eStopReasonExec"; - break; - case lldb::eStopReasonPlanComplete: - pEventType = "eStopReasonPlanComplete"; - bOk = HandleProcessEventStopReasonTrace(); - break; - case lldb::eStopReasonThreadExiting: - pEventType = "eStopReasonThreadExiting"; - break; - case lldb::eStopReasonInstrumentation: - pEventType = "eStopReasonInstrumentation"; - break; - } - - // ToDo: Remove when finished coding application - m_pLog->WriteLog(CMIUtilString::Format( - "##### An SB Process event stop state occurred: %s", pEventType)); - - return bOk; -} - -//++ -// Details: Asynchronous event handler for LLDB Process stop signal. -// Type: Method. -// Args: vrEvent - (R) An LLDB broadcast event. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal( - const lldb::SBEvent &vrEvent) { - bool bOk = MIstatus::success; - - InitializeSignals(); - lldb::SBProcess sbProcess = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - const MIuint64 nStopReason = - sbProcess.GetSelectedThread().GetStopReasonDataAtIndex(0); - const bool bInterrupted = lldb::SBProcess::GetInterruptedFromEvent(vrEvent); - if (nStopReason == m_SIGINT || (nStopReason == m_SIGSTOP && bInterrupted)) { - // MI print - // "*stopped,reason=\"signal-received\",signal-name=\"SIGINT\",signal-meaning=\"Interrupt\",frame={%s},thread-id=\"%d\",stopped-threads=\"all\"" - const CMICmnMIValueConst miValueConst("signal-received"); - const CMICmnMIValueResult miValueResult("reason", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult); - const CMICmnMIValueConst miValueConst2("SIGINT"); - const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2); - miOutOfBandRecord.Add(miValueResult2); - const CMICmnMIValueConst miValueConst3("Interrupt"); - const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3); - miOutOfBandRecord.Add(miValueResult3); - CMICmnMIValueTuple miValueTuple; - bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple); - const CMICmnMIValueResult miValueResult4("frame", miValueTuple); - miOutOfBandRecord.Add(miValueResult4); - const CMIUtilString strThreadId(CMIUtilString::Format( - "%" PRIu32, sbProcess.GetSelectedThread().GetIndexID())); - const CMICmnMIValueConst miValueConst5(strThreadId); - const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5); - miOutOfBandRecord.Add(miValueResult5); - const CMICmnMIValueConst miValueConst6("all"); - const CMICmnMIValueResult miValueResult6("stopped-threads", miValueConst6); - miOutOfBandRecord.Add(miValueResult6); - bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - } else if (nStopReason == m_SIGSTOP) { - // MI print - // "*stopped,reason=\"signal-received\",signal-name=\"SIGSTOP\",signal-meaning=\"Stop\",frame={%s},thread-id=\"%d\",stopped-threads=\"all\"" - const CMICmnMIValueConst miValueConst("signal-received"); - const CMICmnMIValueResult miValueResult("reason", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult); - const CMICmnMIValueConst miValueConst2("SIGSTOP"); - const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2); - miOutOfBandRecord.Add(miValueResult2); - const CMICmnMIValueConst miValueConst3("Stop"); - const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3); - miOutOfBandRecord.Add(miValueResult3); - CMICmnMIValueTuple miValueTuple; - bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple); - const CMICmnMIValueResult miValueResult4("frame", miValueTuple); - miOutOfBandRecord.Add(miValueResult4); - const CMIUtilString strThreadId(CMIUtilString::Format( - "%" PRIu32, sbProcess.GetSelectedThread().GetIndexID())); - const CMICmnMIValueConst miValueConst5(strThreadId); - const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5); - miOutOfBandRecord.Add(miValueResult5); - const CMICmnMIValueConst miValueConst6("all"); - const CMICmnMIValueResult miValueResult6("stopped-threads", miValueConst6); - miOutOfBandRecord.Add(miValueResult6); - bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - } else if (nStopReason == m_SIGSEGV) { - // MI print - // "*stopped,reason=\"signal-received\",signal-name=\"SIGSEGV\",signal-meaning=\"Segmentation - // fault\",thread-id=\"%d\",frame={%s}" - const CMICmnMIValueConst miValueConst("signal-received"); - const CMICmnMIValueResult miValueResult("reason", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult); - const CMICmnMIValueConst miValueConst2("SIGSEGV"); - const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2); - miOutOfBandRecord.Add(miValueResult2); - const CMICmnMIValueConst miValueConst3("Segmentation fault"); - const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3); - miOutOfBandRecord.Add(miValueResult3); - CMICmnMIValueTuple miValueTuple; - bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple); - const CMICmnMIValueResult miValueResult4("frame", miValueTuple); - miOutOfBandRecord.Add(miValueResult4); - const CMIUtilString strThreadId(CMIUtilString::Format( - "%d", sbProcess.GetSelectedThread().GetIndexID())); - const CMICmnMIValueConst miValueConst5(strThreadId); - const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5); - miOutOfBandRecord.Add(miValueResult5); - bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord); - // Note no "(gdb)" output here - } else if (nStopReason == m_SIGTRAP) { - lldb::SBThread thread = sbProcess.GetSelectedThread(); - const MIuint nFrames = thread.GetNumFrames(); - if (nFrames > 0) { - lldb::SBFrame frame = thread.GetFrameAtIndex(0); - const char *pFnName = frame.GetFunctionName(); - if (pFnName != nullptr) { - const CMIUtilString fnName = CMIUtilString(pFnName); - static const CMIUtilString threadCloneFn = - CMIUtilString("__pthread_clone"); - - if (CMIUtilString::Compare(threadCloneFn, fnName)) { - if (sbProcess.IsValid()) - sbProcess.Continue(); - } - } - } - } else { - // MI print - // "*stopped,reason=\"signal-received\",signal-name=\"%s\",thread-id=\"%d\",stopped-threads=\"all\"" - // MI print - // "*stopped,reason=\"signal-received\",signal=\"%d\",thread-id=\"%d\",stopped-threads=\"all\"" - const CMICmnMIValueConst miValueConst("signal-received"); - const CMICmnMIValueResult miValueResult("reason", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult); - lldb::SBUnixSignals sbUnixSignals = sbProcess.GetUnixSignals(); - const char *pSignal = sbUnixSignals.GetSignalAsCString(nStopReason); - if (pSignal) { - const CMICmnMIValueConst miValueConst2(pSignal); - const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2); - miOutOfBandRecord.Add(miValueResult2); - } else { - const CMIUtilString strSignal( - CMIUtilString::Format("%" PRIu64, nStopReason)); - const CMICmnMIValueConst miValueConst2(strSignal); - const CMICmnMIValueResult miValueResult2("signal", miValueConst2); - miOutOfBandRecord.Add(miValueResult2); - } - const CMIUtilString strThreadId(CMIUtilString::Format( - "%d", sbProcess.GetSelectedThread().GetIndexID())); - const CMICmnMIValueConst miValueConst3(strThreadId); - const CMICmnMIValueResult miValueResult3("thread-id", miValueConst3); - miOutOfBandRecord.Add(miValueResult3); - const CMICmnMIValueConst miValueConst4("all"); - const CMICmnMIValueResult miValueResult4("stopped-threads", miValueConst4); - miOutOfBandRecord.Add(miValueResult4); - bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - } - return bOk; -} - -//++ -// Details: Asynchronous event handler for LLDB Process stop exception. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopException() { - const lldb::SBProcess sbProcess = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - lldb::SBThread sbThread = sbProcess.GetSelectedThread(); - const size_t nStopDescriptionLen = sbThread.GetStopDescription(nullptr, 0); - std::unique_ptr apStopDescription(new char[nStopDescriptionLen]); - sbThread.GetStopDescription(apStopDescription.get(), nStopDescriptionLen); - - // MI print - // "*stopped,reason=\"exception-received\",exception=\"%s\",thread-id=\"%d\",stopped-threads=\"all\"" - const CMICmnMIValueConst miValueConst("exception-received"); - const CMICmnMIValueResult miValueResult("reason", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult); - const CMIUtilString strReason(apStopDescription.get()); - const CMICmnMIValueConst miValueConst2(strReason); - const CMICmnMIValueResult miValueResult2("exception", miValueConst2); - miOutOfBandRecord.Add(miValueResult2); - const CMIUtilString strThreadId( - CMIUtilString::Format("%d", sbThread.GetIndexID())); - const CMICmnMIValueConst miValueConst3(strThreadId); - const CMICmnMIValueResult miValueResult3("thread-id", miValueConst3); - miOutOfBandRecord.Add(miValueResult3); - const CMICmnMIValueConst miValueConst4("all"); - const CMICmnMIValueResult miValueResult4("stopped-threads", miValueConst4); - miOutOfBandRecord.Add(miValueResult4); - bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - - return bOk; -} - -//++ -// Details: Form partial MI response in a MI value tuple object. -// Type: Method. -// Args: vwrMiValueTuple - (W) MI value tuple object. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::MiHelpGetCurrentThreadFrame( - CMICmnMIValueTuple &vwrMiValueTuple) { - CMIUtilString strThreadFrame; - lldb::SBProcess sbProcess = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - lldb::SBThread thread = sbProcess.GetSelectedThread(); - const MIuint nFrame = thread.GetNumFrames(); - if (nFrame == 0) { - // MI print - // "addr=\"??\",func=\"??\",file=\"??\",fullname=\"??\",line=\"??\"" - const CMICmnMIValueConst miValueConst("??"); - const CMICmnMIValueResult miValueResult("addr", miValueConst); - CMICmnMIValueTuple miValueTuple(miValueResult); - const CMICmnMIValueResult miValueResult2("func", miValueConst); - miValueTuple.Add(miValueResult2); - const CMICmnMIValueResult miValueResult4("file", miValueConst); - miValueTuple.Add(miValueResult4); - const CMICmnMIValueResult miValueResult5("fullname", miValueConst); - miValueTuple.Add(miValueResult5); - const CMICmnMIValueResult miValueResult6("line", miValueConst); - miValueTuple.Add(miValueResult6); - - vwrMiValueTuple = miValueTuple; - - return MIstatus::success; - } - - CMICmnMIValueTuple miValueTuple; - if (!CMICmnLLDBDebugSessionInfo::Instance().MIResponseFormFrameInfo( - thread, 0, CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_NoArguments, - miValueTuple)) { - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE), - "MiHelpGetCurrentThreadFrame()")); - return MIstatus::failure; - } - - vwrMiValueTuple = miValueTuple; - - return MIstatus::success; -} - -//++ -// Details: Asynchronous event handler for LLDB Process stop reason breakpoint. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopReasonBreakpoint() { - // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM - if (!CMIDriver::Instance().SetDriverStateRunningNotDebugging()) { - const CMIUtilString &rErrMsg(CMIDriver::Instance().GetErrorDescription()); - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_LLDBOUTOFBAND_ERR_SETNEWDRIVERSTATE), - "HandleProcessEventStopReasonBreakpoint()", rErrMsg.c_str())); - return MIstatus::failure; - } - - lldb::SBProcess sbProcess = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - const MIuint64 brkPtId = - sbProcess.GetSelectedThread().GetStopReasonDataAtIndex(0); - lldb::SBBreakpoint brkPt = - CMICmnLLDBDebugSessionInfo::Instance().GetTarget().GetBreakpointAtIndex( - (MIuint)brkPtId); - - return MiStoppedAtBreakPoint(brkPtId, brkPt); -} - -//++ -// Details: Form the MI Out-of-band response for stopped reason on hitting a -// break point. -// Type: Method. -// Args: vBrkPtId - (R) The LLDB break point's ID -// vBrkPt - (R) THe LLDB break point object. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::MiStoppedAtBreakPoint( - const MIuint64 vBrkPtId, const lldb::SBBreakpoint &vBrkPt) { - bool bOk = MIstatus::success; - - lldb::SBProcess sbProcess = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - lldb::SBThread thread = sbProcess.GetSelectedThread(); - const MIuint nFrame = thread.GetNumFrames(); - if (nFrame == 0) { - // MI print - // "*stopped,reason=\"breakpoint-hit\",disp=\"del\",bkptno=\"%d\",frame={},thread-id=\"%d\",stopped-threads=\"all\"" - const CMICmnMIValueConst miValueConst("breakpoint-hit"); - const CMICmnMIValueResult miValueResult("reason", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult); - const CMICmnMIValueConst miValueConst2("del"); - const CMICmnMIValueResult miValueResult2("disp", miValueConst2); - miOutOfBandRecord.Add(miValueResult2); - const CMIUtilString strBkp(CMIUtilString::Format("%d", vBrkPtId)); - const CMICmnMIValueConst miValueConst3(strBkp); - CMICmnMIValueResult miValueResult3("bkptno", miValueConst3); - miOutOfBandRecord.Add(miValueResult3); - const CMICmnMIValueConst miValueConst4("{}"); - const CMICmnMIValueResult miValueResult4("frame", miValueConst4); - miOutOfBandRecord.Add(miValueResult4); - const CMIUtilString strThreadId( - CMIUtilString::Format("%d", vBrkPt.GetThreadIndex())); - const CMICmnMIValueConst miValueConst5(strThreadId); - const CMICmnMIValueResult miValueResult5("thread-id", miValueConst5); - miOutOfBandRecord.Add(miValueResult5); - const CMICmnMIValueConst miValueConst6("all"); - const CMICmnMIValueResult miValueResult6("stopped-threads", miValueConst6); - miOutOfBandRecord.Add(miValueResult6); - bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - return bOk; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - - // MI print - // "*stopped,reason=\"breakpoint-hit\",disp=\"del\",bkptno=\"%d\",frame={addr=\"0x%016" - // PRIx64 - // "\",func=\"%s\",args=[],file=\"%s\",fullname=\"%s\",line=\"%d\"},thread-id=\"%d\",stopped-threads=\"all\"" - const CMICmnMIValueConst miValueConst("breakpoint-hit"); - const CMICmnMIValueResult miValueResult("reason", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult); - const CMICmnMIValueConst miValueConstA("del"); - const CMICmnMIValueResult miValueResultA("disp", miValueConstA); - miOutOfBandRecord.Add(miValueResultA); - const CMIUtilString strBkp(CMIUtilString::Format("%d", vBrkPtId)); - const CMICmnMIValueConst miValueConstB(strBkp); - CMICmnMIValueResult miValueResultB("bkptno", miValueConstB); - miOutOfBandRecord.Add(miValueResultB); - - // frame={addr=\"0x%016" PRIx64 - // "\",func=\"%s\",args=[],file=\"%s\",fullname=\"%s\",line=\"%d\"} - if (bOk) { - CMICmnMIValueTuple miValueTuple; - bOk = bOk && - rSessionInfo.MIResponseFormFrameInfo( - thread, 0, - CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_AllArguments, - miValueTuple); - const CMICmnMIValueResult miValueResult8("frame", miValueTuple); - miOutOfBandRecord.Add(miValueResult8); - } - - // Add to MI thread-id=\"%d\",stopped-threads=\"all\" - if (bOk) { - const CMIUtilString strThreadId( - CMIUtilString::Format("%d", thread.GetIndexID())); - const CMICmnMIValueConst miValueConst8(strThreadId); - const CMICmnMIValueResult miValueResult8("thread-id", miValueConst8); - miOutOfBandRecord.Add(miValueResult8); - } - if (bOk) { - const CMICmnMIValueConst miValueConst9("all"); - const CMICmnMIValueResult miValueResult9("stopped-threads", miValueConst9); - miOutOfBandRecord.Add(miValueResult9); - bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - } - - return MIstatus::success; -} - -//++ -// Details: Asynchronous event handler for LLDB Process stop reason trace. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopReasonTrace() { - bool bOk = true; - lldb::SBProcess sbProcess = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - lldb::SBThread thread = sbProcess.GetSelectedThread(); - const MIuint nFrame = thread.GetNumFrames(); - if (nFrame == 0) { - // MI print "*stopped,reason=\"trace\",stopped-threads=\"all\"" - const CMICmnMIValueConst miValueConst("trace"); - const CMICmnMIValueResult miValueResult("reason", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult); - const CMICmnMIValueConst miValueConst2("all"); - const CMICmnMIValueResult miValueResult2("stopped-threads", miValueConst2); - miOutOfBandRecord.Add(miValueResult2); - bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - return bOk; - } - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - - // MI print - // "*stopped,reason=\"end-stepping-range\",frame={addr=\"0x%016" PRIx64 - // "\",func=\"%s\",args=[\"%s\"],file=\"%s\",fullname=\"%s\",line=\"%d\"},thread-id=\"%d\",stopped-threads=\"all\"" - - // Function args - CMICmnMIValueTuple miValueTuple; - if (!rSessionInfo.MIResponseFormFrameInfo( - thread, 0, CMICmnLLDBDebugSessionInfo::eFrameInfoFormat_AllArguments, - miValueTuple)) - return MIstatus::failure; - - const CMICmnMIValueConst miValueConst("end-stepping-range"); - const CMICmnMIValueResult miValueResult("reason", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult); - const CMICmnMIValueResult miValueResult2("frame", miValueTuple); - miOutOfBandRecord.Add(miValueResult2); - - // Add to MI thread-id=\"%d\",stopped-threads=\"all\" - const CMIUtilString strThreadId( - CMIUtilString::Format("%d", thread.GetIndexID())); - const CMICmnMIValueConst miValueConst8(strThreadId); - const CMICmnMIValueResult miValueResult8("thread-id", miValueConst8); - miOutOfBandRecord.Add(miValueResult8); - - const CMICmnMIValueConst miValueConst9("all"); - const CMICmnMIValueResult miValueResult9("stopped-threads", miValueConst9); - miOutOfBandRecord.Add(miValueResult9); - bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - - return bOk; -} - -//++ -// Details: Asynchronous function update selected thread. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::UpdateSelectedThread() { - lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance() - .GetDebugger() - .GetSelectedTarget() - .GetProcess(); - if (!process.IsValid()) - return MIstatus::success; - - lldb::SBThread currentThread = process.GetSelectedThread(); - lldb::SBThread thread; - const lldb::StopReason eCurrentThreadStoppedReason = - currentThread.GetStopReason(); - if (!currentThread.IsValid() || - (eCurrentThreadStoppedReason == lldb::eStopReasonInvalid) || - (eCurrentThreadStoppedReason == lldb::eStopReasonNone)) { - // Prefer a thread that has just completed its plan over another thread as - // current thread - lldb::SBThread planThread; - lldb::SBThread otherThread; - const size_t nThread = process.GetNumThreads(); - for (MIuint i = 0; i < nThread; i++) { - // GetThreadAtIndex() uses a base 0 index - // GetThreadByIndexID() uses a base 1 index - thread = process.GetThreadAtIndex(i); - const lldb::StopReason eThreadStopReason = thread.GetStopReason(); - switch (eThreadStopReason) { - case lldb::eStopReasonTrace: - case lldb::eStopReasonBreakpoint: - case lldb::eStopReasonWatchpoint: - case lldb::eStopReasonSignal: - case lldb::eStopReasonException: - if (!otherThread.IsValid()) - otherThread = thread; - break; - case lldb::eStopReasonPlanComplete: - if (!planThread.IsValid()) - planThread = thread; - break; - case lldb::eStopReasonInvalid: - case lldb::eStopReasonNone: - default: - break; - } - } - if (planThread.IsValid()) - process.SetSelectedThread(planThread); - else if (otherThread.IsValid()) - process.SetSelectedThread(otherThread); - else { - if (currentThread.IsValid()) - thread = currentThread; - else - thread = process.GetThreadAtIndex(0); - - if (thread.IsValid()) - process.SetSelectedThread(thread); - } - } // if( !currentThread.IsValid() || (eCurrentThreadStoppedReason == - // lldb::eStopReasonInvalid) || (eCurrentThreadStoppedReason == - // lldb::eStopReasonNone) ) - - return MIstatus::success; -} - -//++ -// Details: Print to stdout "*running,thread-id=\"all\"", "(gdb)". -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateRunning() { - CMICmnMIValueConst miValueConst("all"); - CMICmnMIValueResult miValueResult("thread-id", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_Running, miValueResult); - bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - - return bOk; -} - -//++ -// Details: Print to stdout "=thread-exited,id=\"%ld\",group-id=\"i1\"", -// "=thread-group-exited,id=\"i1\",exit-code=\"0\""), -// "*stopped,reason=\"exited-normally\"", -// "(gdb)" -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStateExited() { - const CMIUtilString strId(CMIUtilString::Format("%ld", 1)); - CMICmnMIValueConst miValueConst(strId); - CMICmnMIValueResult miValueResult("id", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited, miValueResult); - CMICmnMIValueConst miValueConst2("i1"); - CMICmnMIValueResult miValueResult2("group-id", miValueConst2); - miOutOfBandRecord.Add(miValueResult2); - bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - if (bOk) { - CMICmnMIValueConst miValueConst3("i1"); - CMICmnMIValueResult miValueResult3("id", miValueConst3); - CMICmnMIOutOfBandRecord miOutOfBandRecord2( - CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupExited, miValueResult3); - CMICmnMIValueConst miValueConst2("0"); - CMICmnMIValueResult miValueResult2("exit-code", miValueConst2); - miOutOfBandRecord2.Add(miValueResult2); - bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord2); - } - if (bOk) { - CMICmnMIValueConst miValueConst4("exited-normally"); - CMICmnMIValueResult miValueResult4("reason", miValueConst4); - CMICmnMIOutOfBandRecord miOutOfBandRecord3( - CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult4); - bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord3); - } - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - - return bOk; -} - -//++ -// Details: Drain all stdout so we don't see any output come after we print our -// prompts. -// The process has stuff waiting for stdout; get it and write it out to -// the -// appropriate place. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::GetProcessStdout() { - CMIUtilString text; - std::unique_ptr apStdoutBuffer(new char[1024]); - lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance() - .GetDebugger() - .GetSelectedTarget() - .GetProcess(); - while (1) { - const size_t nBytes = process.GetSTDOUT(apStdoutBuffer.get(), 1024); - text.append(apStdoutBuffer.get(), nBytes); - - while (1) { - const size_t nNewLine = text.find('\n'); - if (nNewLine == std::string::npos) - break; - - const CMIUtilString line(text.substr(0, nNewLine + 1)); - text.erase(0, nNewLine + 1); - const bool bEscapeQuotes(true); - CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes)); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, miValueConst); - const bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - if (!bOk) - return MIstatus::failure; - } - - if (nBytes == 0) { - if (!text.empty()) { - const bool bEscapeQuotes(true); - CMICmnMIValueConst miValueConst(text.Escape(bEscapeQuotes)); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, - miValueConst); - return MiOutOfBandRecordToStdout(miOutOfBandRecord); - } - break; - } - } - - return MIstatus::success; -} - -//++ -// Details: Drain all stderr so we don't see any output come after we print our -// prompts. -// The process has stuff waiting for stderr; get it and write it out to -// the -// appropriate place. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::GetProcessStderr() { - CMIUtilString text; - std::unique_ptr apStderrBuffer(new char[1024]); - lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance() - .GetDebugger() - .GetSelectedTarget() - .GetProcess(); - while (1) { - const size_t nBytes = process.GetSTDERR(apStderrBuffer.get(), 1024); - text.append(apStderrBuffer.get(), nBytes); - - while (1) { - const size_t nNewLine = text.find('\n'); - if (nNewLine == std::string::npos) - break; - - const CMIUtilString line(text.substr(0, nNewLine + 1)); - const bool bEscapeQuotes(true); - CMICmnMIValueConst miValueConst(line.Escape(bEscapeQuotes)); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, miValueConst); - const bool bOk = MiOutOfBandRecordToStdout(miOutOfBandRecord); - if (!bOk) - return MIstatus::failure; - } - - if (nBytes == 0) { - if (!text.empty()) { - const bool bEscapeQuotes(true); - CMICmnMIValueConst miValueConst(text.Escape(bEscapeQuotes)); - CMICmnMIOutOfBandRecord miOutOfBandRecord( - CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, - miValueConst); - return MiOutOfBandRecordToStdout(miOutOfBandRecord); - } - break; - } - } - - return MIstatus::success; -} - -//++ -// Details: Asynchronous event function check for state changes. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::ChkForStateChanges() { - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - if (!sbProcess.IsValid()) - return MIstatus::success; - - // Check for created threads - const MIuint nThread = sbProcess.GetNumThreads(); - for (MIuint i = 0; i < nThread; i++) { - // GetThreadAtIndex() uses a base 0 index - // GetThreadByIndexID() uses a base 1 index - lldb::SBThread thread = sbProcess.GetThreadAtIndex(i); - if (!thread.IsValid()) - continue; - - const MIuint threadIndexID = thread.GetIndexID(); - const bool bFound = - std::find(rSessionInfo.m_vecActiveThreadId.cbegin(), - rSessionInfo.m_vecActiveThreadId.cend(), - threadIndexID) != rSessionInfo.m_vecActiveThreadId.end(); - if (!bFound) { - rSessionInfo.m_vecActiveThreadId.push_back(threadIndexID); - - // Form MI "=thread-created,id=\"%d\",group-id=\"i1\"" - const CMIUtilString strValue(CMIUtilString::Format("%d", threadIndexID)); - const CMICmnMIValueConst miValueConst(strValue); - const CMICmnMIValueResult miValueResult("id", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBand( - CMICmnMIOutOfBandRecord::eOutOfBand_ThreadCreated, miValueResult); - const CMICmnMIValueConst miValueConst2("i1"); - const CMICmnMIValueResult miValueResult2("group-id", miValueConst2); - miOutOfBand.Add(miValueResult2); - bool bOk = MiOutOfBandRecordToStdout(miOutOfBand); - if (!bOk) - return MIstatus::failure; - } - } - - lldb::SBThread currentThread = sbProcess.GetSelectedThread(); - if (currentThread.IsValid()) { - const MIuint currentThreadIndexID = currentThread.GetIndexID(); - if (rSessionInfo.m_currentSelectedThread != currentThreadIndexID) { - rSessionInfo.m_currentSelectedThread = currentThreadIndexID; - - // Form MI "=thread-selected,id=\"%d\"" - const CMIUtilString strValue( - CMIUtilString::Format("%d", currentThreadIndexID)); - const CMICmnMIValueConst miValueConst(strValue); - const CMICmnMIValueResult miValueResult("id", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBand( - CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected, miValueResult); - if (!MiOutOfBandRecordToStdout(miOutOfBand)) - return MIstatus::failure; - } - } - - // Check for invalid (removed) threads - CMICmnLLDBDebugSessionInfo::VecActiveThreadId_t::iterator it = - rSessionInfo.m_vecActiveThreadId.begin(); - while (it != rSessionInfo.m_vecActiveThreadId.end()) { - const MIuint threadIndexID = *it; - lldb::SBThread thread = sbProcess.GetThreadByIndexID(threadIndexID); - if (!thread.IsValid()) { - // Form MI "=thread-exited,id=\"%ld\",group-id=\"i1\"" - const CMIUtilString strValue(CMIUtilString::Format("%ld", threadIndexID)); - const CMICmnMIValueConst miValueConst(strValue); - const CMICmnMIValueResult miValueResult("id", miValueConst); - CMICmnMIOutOfBandRecord miOutOfBand( - CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited, miValueResult); - const CMICmnMIValueConst miValueConst2("i1"); - const CMICmnMIValueResult miValueResult2("group-id", miValueConst2); - miOutOfBand.Add(miValueResult2); - bool bOk = MiOutOfBandRecordToStdout(miOutOfBand); - if (!bOk) - return MIstatus::failure; - - // Remove current thread from cache and get next - it = rSessionInfo.m_vecActiveThreadId.erase(it); - } else - // Next - ++it; - } - - return CMICmnStreamStdout::WritePrompt(); -} - -//++ -// Details: Take a fully formed MI result record and send to the stdout stream. -// Also output to the MI Log file. -// Type: Method. -// Args: vrMiResultRecord - (R) MI result record object. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::MiResultRecordToStdout( - const CMICmnMIResultRecord &vrMiResultRecord) { - return TextToStdout(vrMiResultRecord.GetString()); -} - -//++ -// Details: Take a fully formed MI Out-of-band record and send to the stdout -// stream. -// Also output to the MI Log file. -// Type: Method. -// Args: vrMiOutOfBandRecord - (R) MI Out-of-band record object. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::MiOutOfBandRecordToStdout( - const CMICmnMIOutOfBandRecord &vrMiOutOfBandRecord) { - return TextToStdout(vrMiOutOfBandRecord.GetString()); -} - -//++ -// Details: Take a text data and send to the stdout stream. Also output to the -// MI Log -// file. -// Type: Method. -// Args: vrTxt - (R) Text. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::TextToStdout(const CMIUtilString &vrTxt) { - return CMICmnStreamStdout::TextToStdout(vrTxt); -} - -//++ -// Details: Take a text data and send to the stderr stream. Also output to the -// MI Log -// file. -// Type: Method. -// Args: vrTxt - (R) Text. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBDebuggerHandleEvents::TextToStderr(const CMIUtilString &vrTxt) { - return CMICmnStreamStderr::TextToStderr(vrTxt); -} - -//++ -// Details: Initialize the member variables with the signal values in this -// process -// file. -// Type: Method. -// Args: None -// Return: Noen -// Throws: None. -//-- -void CMICmnLLDBDebuggerHandleEvents::InitializeSignals() { - if (!m_bSignalsInitialized) { - lldb::SBProcess sbProcess = - CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - if (sbProcess.IsValid()) { - lldb::SBUnixSignals unix_signals = sbProcess.GetUnixSignals(); - m_SIGINT = unix_signals.GetSignalNumberFromName("SIGINT"); - m_SIGSTOP = unix_signals.GetSignalNumberFromName("SIGSTOP"); - m_SIGSEGV = unix_signals.GetSignalNumberFromName("SIGSEGV"); - m_SIGTRAP = unix_signals.GetSignalNumberFromName("SIGTRAP"); - m_bSignalsInitialized = true; - } - } -} diff --git a/lldb/tools/lldb-mi/MICmnLLDBProxySBValue.h b/lldb/tools/lldb-mi/MICmnLLDBProxySBValue.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBProxySBValue.h +++ /dev/null @@ -1,34 +0,0 @@ -//===-- MICmnLLDBProxySBValue.h ---------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third Party Headers: -#include "lldb/API/SBValue.h" - -// In-house headers: -#include "MIDataTypes.h" - -// Declarations: -class CMIUtilString; - -//++ -//============================================================================ -// Details: MI proxy wrapper class to lldb::SBValue. The class provides -// functionality -// to assist in the use of SBValue's particular function usage. -//-- -class CMICmnLLDBProxySBValue { - // Statics: -public: - static bool GetValueAsSigned(const lldb::SBValue &vrValue, MIint64 &vwValue); - static bool GetValueAsUnsigned(const lldb::SBValue &vrValue, - MIuint64 &vwValue); - static bool GetCString(const lldb::SBValue &vrValue, - CMIUtilString &vwCString); -}; diff --git a/lldb/tools/lldb-mi/MICmnLLDBProxySBValue.cpp b/lldb/tools/lldb-mi/MICmnLLDBProxySBValue.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBProxySBValue.cpp +++ /dev/null @@ -1,134 +0,0 @@ -//===-- MICmnLLDBProxySBValue.cpp -------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include - -// Third Party Headers: -#include "lldb/API/SBError.h" - -// In-house headers: -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBProxySBValue.h" -#include "MIUtilString.h" - -//++ -// Details: Retrieve the numerical value from the SBValue object. If the -// function fails -// it could indicate the SBValue object does not represent an internal -// type. -// Type: Static method. -// Args: vrValue - (R) The SBValue object to get a value from. -// vwValue - (W) The numerical value. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBProxySBValue::GetValueAsUnsigned(const lldb::SBValue &vrValue, - MIuint64 &vwValue) { - lldb::SBValue &rValue = const_cast(vrValue); - bool bCompositeType = true; - MIuint64 nFailValue = 0; - MIuint64 nValue = rValue.GetValueAsUnsigned(nFailValue); - if (nValue == nFailValue) { - nFailValue = 5; // Some arbitrary number - nValue = rValue.GetValueAsUnsigned(nFailValue); - if (nValue != nFailValue) { - bCompositeType = false; - vwValue = nValue; - } - } else { - bCompositeType = false; - vwValue = nValue; - } - - return (bCompositeType ? MIstatus::failure : MIstatus::success); -} - -//++ -// Details: Retrieve the numerical value from the SBValue object. If the -// function fails -// it could indicate the SBValue object does not represent an internal -// type. -// Type: Static method. -// Args: vrValue - (R) The SBValue object to get a value from. -// vwValue - (W) The numerical value. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnLLDBProxySBValue::GetValueAsSigned(const lldb::SBValue &vrValue, - MIint64 &vwValue) { - lldb::SBValue &rValue = const_cast(vrValue); - bool bCompositeType = true; - MIuint64 nFailValue = 0; - MIuint64 nValue = rValue.GetValueAsSigned(nFailValue); - if (nValue == nFailValue) { - nFailValue = 5; // Some arbitrary number - nValue = rValue.GetValueAsSigned(nFailValue); - if (nValue != nFailValue) { - bCompositeType = false; - vwValue = nValue; - } - } else { - bCompositeType = false; - vwValue = nValue; - } - - return (bCompositeType ? MIstatus::failure : MIstatus::success); -} - -//++ -// Details: Retrieve the NUL terminated string from the SBValue object if it of -// the type -// unsigned char *. -// Type: Static method. -// Args: vrValue - (R) The SBValue object to get a value from. -// vwCString - (W) The text data '\0' terminated. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed, not suitable type. -// Throws: None. -//-- -bool CMICmnLLDBProxySBValue::GetCString(const lldb::SBValue &vrValue, - CMIUtilString &vwCString) { - lldb::SBValue &rValue = const_cast(vrValue); - const char *pCType = rValue.GetTypeName(); - if (pCType == nullptr) - return MIstatus::failure; - - const char *pType = "unsigned char *"; - if (!CMIUtilString::Compare(pCType, pType)) - return MIstatus::failure; - - const CMIUtilString strAddr(rValue.GetValue()); - MIint64 nNum = 0; - if (!strAddr.ExtractNumber(nNum)) - return MIstatus::failure; - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - lldb::SBProcess sbProcess = rSessionInfo.GetProcess(); - MIuint nBufferSize = 64; - bool bNeedResize = false; - char *pBuffer = static_cast(::malloc(nBufferSize)); - do { - lldb::SBError error; - const size_t nReadSize = sbProcess.ReadCStringFromMemory( - (lldb::addr_t)nNum, pBuffer, nBufferSize, error); - if (nReadSize == (nBufferSize - 1)) { - bNeedResize = true; - nBufferSize = nBufferSize << 1; - pBuffer = static_cast(::realloc(pBuffer, nBufferSize)); - } else - bNeedResize = false; - } while (bNeedResize); - - vwCString = pBuffer; - free((void *)pBuffer); - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MICmnLLDBUtilSBValue.h b/lldb/tools/lldb-mi/MICmnLLDBUtilSBValue.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBUtilSBValue.h +++ /dev/null @@ -1,77 +0,0 @@ -//===-- MICmnLLDBUtilSBValue.h ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third Party Headers: -#include "lldb/API/SBValue.h" - -// In-house headers: -#include "MICmnMIValueTuple.h" -#include "MIDataTypes.h" - -// Declarations: -class CMIUtilString; - -//++ -//============================================================================ -// Details: Utility helper class to lldb::SBValue. Using a lldb::SBValue extract -// value object information to help form verbose debug information. -//-- -class CMICmnLLDBUtilSBValue { - // Methods: -public: - /* ctor */ CMICmnLLDBUtilSBValue(const lldb::SBValue &vrValue, - const bool vbHandleCharType = false, - const bool vbHandleArrayType = true); - /* dtor */ ~CMICmnLLDBUtilSBValue(); - // - CMIUtilString GetName() const; - CMIUtilString GetValue(const bool vbExpandAggregates = false) const; - CMIUtilString GetTypeName() const; - CMIUtilString GetTypeNameDisplay() const; - bool IsCharType() const; - bool IsFirstChildCharType() const; - bool IsPointeeCharType() const; - bool IsIntegerType() const; - bool IsPointerType() const; - bool IsArrayType() const; - bool IsLLDBVariable() const; - bool IsNameUnknown() const; - bool IsValueUnknown() const; - bool IsValid() const; - bool HasName() const; - - // Methods: -private: - template - CMIUtilString - ReadCStringFromHostMemory(lldb::SBValue &vrValue, - const MIuint vnMaxLen = UINT32_MAX) const; - bool GetSimpleValue(const bool vbHandleArrayType, - CMIUtilString &vrValue) const; - bool GetCompositeValue(const bool vbPrintFieldNames, - CMICmnMIValueTuple &vwrMiValueTuple, - const MIuint vnDepth = 1) const; - CMIUtilString - GetValueSummary(bool valueOnly, - const CMIUtilString &failVal = CMIUtilString()) const; - - // Statics: -private: - static bool IsCharBasicType(lldb::BasicType eType); - - // Attributes: -private: - lldb::SBValue &m_rValue; - bool m_bValidSBValue; // True = SBValue is a valid object, false = not valid. - bool m_bHandleCharType; // True = Yes return text molding to char type, false - // = just return data. - bool m_bHandleArrayType; // True = Yes return special stub for array type, - // false = just return data. -}; diff --git a/lldb/tools/lldb-mi/MICmnLLDBUtilSBValue.cpp b/lldb/tools/lldb-mi/MICmnLLDBUtilSBValue.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBUtilSBValue.cpp +++ /dev/null @@ -1,497 +0,0 @@ -//===-- MICmnLLDBUtilSBValue.cpp --------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers: -#include "lldb/API/SBTypeSummary.h" -#include - -// In-house headers: -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBUtilSBValue.h" -#include "MICmnMIValueConst.h" -#include "MICmnMIValueTuple.h" -#include "MIUtilString.h" - -static const char *kUnknownValue = "??"; -static const char *kUnresolvedCompositeValue = "{...}"; - -//++ -// Details: CMICmnLLDBUtilSBValue constructor. -// Type: Method. -// Args: vrValue - (R) The LLDB value object. -// vbHandleCharType - (R) True = Yes return text molding to char -// type, -// False = just return data. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBUtilSBValue::CMICmnLLDBUtilSBValue( - const lldb::SBValue &vrValue, const bool vbHandleCharType /* = false */, - const bool vbHandleArrayType /* = true */) - : m_rValue(const_cast(vrValue)), - m_bHandleCharType(vbHandleCharType), - m_bHandleArrayType(vbHandleArrayType) { - m_bValidSBValue = m_rValue.IsValid(); -} - -//++ -// Details: CMICmnLLDBUtilSBValue destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLLDBUtilSBValue::~CMICmnLLDBUtilSBValue() {} - -//++ -// Details: Retrieve from the LLDB SB Value object the name of the variable. If -// the name -// is invalid (or the SBValue object invalid) then "??" is returned. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Name of the variable or "??" for unknown. -// Throws: None. -//-- -CMIUtilString CMICmnLLDBUtilSBValue::GetName() const { - const char *pName = m_bValidSBValue ? m_rValue.GetName() : nullptr; - const CMIUtilString text((pName != nullptr) ? pName : CMIUtilString()); - - return text; -} - -//++ -// Details: Retrieve from the LLDB SB Value object the value of the variable -// described in -// text. If the value is invalid (or the SBValue object invalid) then -// "??" is -// returned. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Text description of the variable's value or "??". -// Throws: None. -//-- -CMIUtilString CMICmnLLDBUtilSBValue::GetValue( - const bool vbExpandAggregates /* = false */) const { - if (!m_bValidSBValue) - return kUnknownValue; - - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - bool bPrintExpandAggregates = false; - bPrintExpandAggregates = rSessionInfo.SharedDataRetrieve( - rSessionInfo.m_constStrPrintExpandAggregates, - bPrintExpandAggregates) && - bPrintExpandAggregates; - - const bool bHandleArrayTypeAsSimple = - m_bHandleArrayType && !vbExpandAggregates && !bPrintExpandAggregates; - CMIUtilString value; - const bool bIsSimpleValue = GetSimpleValue(bHandleArrayTypeAsSimple, value); - if (bIsSimpleValue) - return value; - - if (!vbExpandAggregates && !bPrintExpandAggregates) - return kUnresolvedCompositeValue; - - bool bPrintAggregateFieldNames = false; - bPrintAggregateFieldNames = - !rSessionInfo.SharedDataRetrieve( - rSessionInfo.m_constStrPrintAggregateFieldNames, - bPrintAggregateFieldNames) || - bPrintAggregateFieldNames; - - CMICmnMIValueTuple miValueTuple; - const bool bOk = GetCompositeValue(bPrintAggregateFieldNames, miValueTuple); - if (!bOk) - return kUnknownValue; - - value = miValueTuple.GetString(); - return value; -} - -//++ -// Details: Retrieve from the LLDB SB Value object the value of the variable -// described in -// text if it has a simple format (not composite). -// Type: Method. -// Args: vwrValue - (W) The SBValue in a string format. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::GetSimpleValue(const bool vbHandleArrayType, - CMIUtilString &vwrValue) const { - const MIuint nChildren = m_rValue.GetNumChildren(); - if (nChildren == 0) { - vwrValue = GetValueSummary(!m_bHandleCharType && IsCharType(), kUnknownValue); - return MIstatus::success; - } else if (IsPointerType()) { - vwrValue = - GetValueSummary(!m_bHandleCharType && IsPointeeCharType(), kUnknownValue); - return MIstatus::success; - } else if (IsArrayType()) { - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - bool bPrintCharArrayAsString = false; - bPrintCharArrayAsString = rSessionInfo.SharedDataRetrieve( - rSessionInfo.m_constStrPrintCharArrayAsString, - bPrintCharArrayAsString) && - bPrintCharArrayAsString; - if (bPrintCharArrayAsString && m_bHandleCharType && - IsFirstChildCharType()) { - vwrValue = GetValueSummary(false); - return MIstatus::success; - } else if (vbHandleArrayType) { - vwrValue = CMIUtilString::Format("[%u]", nChildren); - return MIstatus::success; - } - } else { - // Treat composite value which has registered summary - // (for example with AddCXXSummary) as simple value - vwrValue = GetValueSummary(false); - if (!vwrValue.empty()) - return MIstatus::success; - } - - // Composite variable type i.e. struct - return MIstatus::failure; -} - -bool CMICmnLLDBUtilSBValue::GetCompositeValue( - const bool vbPrintFieldNames, CMICmnMIValueTuple &vwrMiValueTuple, - const MIuint vnDepth /* = 1 */) const { - const MIuint nMaxDepth = 10; - const MIuint nChildren = m_rValue.GetNumChildren(); - for (MIuint i = 0; i < nChildren; ++i) { - const lldb::SBValue member = m_rValue.GetChildAtIndex(i); - const CMICmnLLDBUtilSBValue utilMember(member, m_bHandleCharType, - m_bHandleArrayType); - const bool bHandleArrayTypeAsSimple = false; - CMIUtilString value; - const bool bIsSimpleValue = - utilMember.GetSimpleValue(bHandleArrayTypeAsSimple, value); - if (bIsSimpleValue) { - // OK. Value is simple (not composite) and was successfully got - } else if (vnDepth < nMaxDepth) { - // Need to get value from composite type - CMICmnMIValueTuple miValueTuple; - const bool bOk = utilMember.GetCompositeValue(vbPrintFieldNames, - miValueTuple, vnDepth + 1); - if (!bOk) - // Can't obtain composite type - value = kUnknownValue; - else - // OK. Value is composite and was successfully got - value = miValueTuple.GetString(); - } else { - // Need to get value from composite type, but vnMaxDepth is reached - value = kUnresolvedCompositeValue; - } - const bool bNoQuotes = true; - const CMICmnMIValueConst miValueConst(value, bNoQuotes); - if (vbPrintFieldNames) { - const bool bUseSpacing = true; - const CMICmnMIValueResult miValueResult(utilMember.GetName(), - miValueConst, bUseSpacing); - vwrMiValueTuple.Add(miValueResult, bUseSpacing); - } else { - const bool bUseSpacing = false; - vwrMiValueTuple.Add(miValueConst, bUseSpacing); - } - } - - return MIstatus::success; -} - -// Returns value or value + summary, depending on valueOnly parameter value. -// If result is an empty string returns failVal. -CMIUtilString -CMICmnLLDBUtilSBValue::GetValueSummary(bool valueOnly, - const CMIUtilString &failVal) const { - if (!m_rValue.IsValid()) - return failVal; - - CMIUtilString value, valSummary; - const char *c_value = m_rValue.GetValue(); - if (valueOnly) - return c_value == nullptr ? failVal : c_value; - - const char *c_summary = m_rValue.GetSummary(); - if (c_value) - value = c_value; - else if (c_summary == nullptr) - return failVal; - - if (c_summary && c_summary[0]) { - valSummary = c_summary; - lldb::SBTypeSummary summary = m_rValue.GetTypeSummary(); - if (summary.IsValid() && summary.DoesPrintValue(m_rValue) && - !value.empty()) { - valSummary.insert(0, value + " "); - } - return valSummary; - } - // no summary - return just value - return value; -} - -//++ -// Details: Check that basic type is a char type. Char type can be signed or -// unsigned. -// Type: Static. -// Args: eType - type to check -// Return: bool - True = Yes is a char type, false = some other type. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsCharBasicType(lldb::BasicType eType) { - switch (eType) { - case lldb::eBasicTypeChar: - case lldb::eBasicTypeSignedChar: - case lldb::eBasicTypeUnsignedChar: - case lldb::eBasicTypeChar16: - case lldb::eBasicTypeChar32: - return true; - default: - return false; - } -} - -//++ -// Details: Retrieve the flag stating whether this value object is a char type -// or some -// other type. Char type can be signed or unsigned. -// Type: Method. -// Args: None. -// Return: bool - True = Yes is a char type, false = some other type. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsCharType() const { - const lldb::BasicType eType = m_rValue.GetType().GetBasicType(); - return IsCharBasicType(eType); -} - -//++ -// Details: Retrieve the flag stating whether first child value object of *this -// object is -// a char type or some other type. Returns false if there are not -// children. Char -// type can be signed or unsigned. -// Type: Method. -// Args: None. -// Return: bool - True = Yes is a char type, false = some other type. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsFirstChildCharType() const { - const MIuint nChildren = m_rValue.GetNumChildren(); - - // Is it a basic type - if (nChildren == 0) - return false; - - const lldb::SBValue member = m_rValue.GetChildAtIndex(0); - const CMICmnLLDBUtilSBValue utilValue(member); - return utilValue.IsCharType(); -} - -//++ -// Details: Retrieve the flag stating whether pointee object of *this object is -// a char type or some other type. Returns false if there are not -// children. Char -// type can be signed or unsigned. -// Type: Method. -// Args: None. -// Return: bool - True = Yes is a char type, false = some other type. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsPointeeCharType() const { - const MIuint nChildren = m_rValue.GetNumChildren(); - - // Is it a basic type - if (nChildren == 0) - return false; - - const lldb::BasicType eType = - m_rValue.GetType().GetPointeeType().GetBasicType(); - return IsCharBasicType(eType); -} - -//++ -// Details: Retrieve the flag stating whether this value object is a integer -// type or some -// other type. Char type can be signed or unsigned and short or -// long/very long. -// Type: Method. -// Args: None. -// Return: bool - True = Yes is a integer type, false = some other type. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsIntegerType() const { - const lldb::BasicType eType = m_rValue.GetType().GetBasicType(); - return ((eType == lldb::eBasicTypeShort) || - (eType == lldb::eBasicTypeUnsignedShort) || - (eType == lldb::eBasicTypeInt) || - (eType == lldb::eBasicTypeUnsignedInt) || - (eType == lldb::eBasicTypeLong) || - (eType == lldb::eBasicTypeUnsignedLong) || - (eType == lldb::eBasicTypeLongLong) || - (eType == lldb::eBasicTypeUnsignedLongLong) || - (eType == lldb::eBasicTypeInt128) || - (eType == lldb::eBasicTypeUnsignedInt128)); -} - -//++ -// Details: Retrieve the flag stating whether this value object is a pointer -// type or some -// other type. -// Type: Method. -// Args: None. -// Return: bool - True = Yes is a pointer type, false = some other type. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsPointerType() const { - return m_rValue.GetType().IsPointerType(); -} - -//++ -// Details: Retrieve the flag stating whether this value object is an array type -// or some -// other type. -// Type: Method. -// Args: None. -// Return: bool - True = Yes is an array type, false = some other type. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsArrayType() const { - return m_rValue.GetType().IsArrayType(); -} - -//++ -// Details: Retrieve the C string data of value object by read the memory where -// the -// variable is held. -// Type: Method. -// Args: vrValue - (R) LLDB SBValue variable object. -// Return: CMIUtilString - Text description of the variable's value. -// Throws: None. -//-- -template -CMIUtilString -CMICmnLLDBUtilSBValue::ReadCStringFromHostMemory(lldb::SBValue &vrValue, - const MIuint vnMaxLen) const { - std::string result; - lldb::addr_t addr = vrValue.GetLoadAddress(), - end_addr = addr + vnMaxLen * sizeof(charT); - lldb::SBProcess process = CMICmnLLDBDebugSessionInfo::Instance().GetProcess(); - lldb::SBError error; - while (addr < end_addr) { - charT ch; - const MIuint64 nReadBytes = - process.ReadMemory(addr, &ch, sizeof(ch), error); - if (error.Fail() || nReadBytes != sizeof(ch)) - return kUnknownValue; - else if (ch == 0) - break; - result.append( - CMIUtilString::ConvertToPrintableASCII(ch, true /* bEscapeQuotes */)); - addr += sizeof(ch); - } - - return result; -} - -//++ -// Details: Retrieve the state of the value object's name. -// Type: Method. -// Args: None. -// Return: bool - True = yes name is indeterminate, false = name is valid. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsNameUnknown() const { - const CMIUtilString name(GetName()); - return (name == kUnknownValue); -} - -//++ -// Details: Retrieve the state of the value object's value data. -// Type: Method. -// Args: None. -// Return: bool - True = yes value is indeterminate, false = value valid. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsValueUnknown() const { - const CMIUtilString value(GetValue()); - return (value == kUnknownValue); -} - -//++ -// Details: Retrieve the value object's type name if valid. -// Type: Method. -// Args: None. -// Return: CMIUtilString - The type name or "??". -// Throws: None. -//-- -CMIUtilString CMICmnLLDBUtilSBValue::GetTypeName() const { - const char *pName = m_bValidSBValue ? m_rValue.GetTypeName() : nullptr; - const CMIUtilString text((pName != nullptr) ? pName : kUnknownValue); - - return text; -} - -//++ -// Details: Retrieve the value object's display type name if valid. -// Type: Method. -// Args: None. -// Return: CMIUtilString - The type name or "??". -// Throws: None. -//-- -CMIUtilString CMICmnLLDBUtilSBValue::GetTypeNameDisplay() const { - const char *pName = m_bValidSBValue ? m_rValue.GetDisplayTypeName() : nullptr; - const CMIUtilString text((pName != nullptr) ? pName : kUnknownValue); - - return text; -} - -//++ -// Details: Retrieve whether the value object's is valid or not. -// Type: Method. -// Args: None. -// Return: bool - True = valid, false = not valid. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsValid() const { return m_bValidSBValue; } - -//++ -// Details: Retrieve the value object' has a name. A value object can be valid -// but still -// have no name which suggest it is not a variable. -// Type: Method. -// Args: None. -// Return: bool - True = valid, false = not valid. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::HasName() const { - bool bHasAName = false; - - const char *pName = m_bValidSBValue ? m_rValue.GetDisplayTypeName() : nullptr; - if (pName != nullptr) { - bHasAName = (CMIUtilString(pName).length() > 0); - } - - return bHasAName; -} - -//++ -// Details: Determine if the value object' represents a LLDB variable i.e. "$0". -// Type: Method. -// Args: None. -// Return: bool - True = Yes LLDB variable, false = no. -// Throws: None. -//-- -bool CMICmnLLDBUtilSBValue::IsLLDBVariable() const { - return (GetName().at(0) == '$'); -} diff --git a/lldb/tools/lldb-mi/MICmnLog.h b/lldb/tools/lldb-mi/MICmnLog.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLog.h +++ /dev/null @@ -1,138 +0,0 @@ -//===-- MICmnLog.h ----------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers: -#include - -// In-house headers: -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI common code implementation class. Handle application trace -// activity logging. Medium objects derived from the Medium abstract -/// class are registered with this logger. The function Write is called -// by a client callee to log information. That information is given to -// registered relevant mediums. The medium file is registered during -// *this logs initialization so it will always have a file log for the -// application. -// Singleton class. -//-- -class CMICmnLog : public MI::ISingleton { - friend MI::ISingleton; - - // Enumeration: -public: - //++ - // Description: Data given to the Logger can be of several types. The Logger - // can be - // set at levels of verbosity. Can determine how data is sent to - // one or - // mediums. - //-- - enum ELogVerbosity { // Descriptions of what 'may' occur, depends ultimately - // on the medium itself. See the medium. - eLogVerbosity_FnTrace = 0x00000004, // Debug function stack call tracing - eLogVerbosity_DbgOp = 0x00000008, // Send a string to the debugger for - // display (not implemented) - eLogVerbosity_ClientMsg = 0x00000010, // A client using MI can insert - // messages into the log (not - // implemented) - eLogVerbosity_Log = 0x00000020 // Send to only the Log file. - }; - - // Class: -public: - //++ - // Description: Register a medium derived from this interface which will be - // called writing log trace data i.e. a file or a console. - // Medium objects registered are not owned by *this logger. - //-- - class IMedium { - public: - virtual bool Initialize() = 0; - virtual const CMIUtilString &GetName() const = 0; - virtual bool Write(const CMIUtilString &vData, - const ELogVerbosity veType) = 0; - virtual const CMIUtilString &GetError() const = 0; - virtual bool Shutdown() = 0; - - // Not part of the interface, ignore - // AD: This virtual destructor seems to hit a bug in the stdlib - // where vector delete is incorrectly called. Workaround is - // to comment this out while I investigate. - /* dtor */ virtual ~IMedium() {} - }; - - // Statics: -public: - static bool WriteLog(const CMIUtilString &vData); - - // Methods: -public: - bool RegisterMedium(const IMedium &vrMedium); - bool UnregisterMedium(const IMedium &vrMedium); - bool Write(const CMIUtilString &vData, const ELogVerbosity veType); - bool SetEnabled(const bool vbYes); - bool GetEnabled() const; - - // MI common object handling - duplicate of CMICmnBase functions, necessary - // for LINUX build - // Done to stop locking on object construction init circular dependency. - const CMIUtilString &GetErrorDescription() const; - void SetErrorDescription(const CMIUtilString &vrTxt) const; - void ClrErrorDescription() const; - - // Overridden: -public: - // From MI::ISingleton - bool Initialize() override; - bool Shutdown() override; - - // Methods: -private: - /* ctor */ CMICmnLog(); - /* ctor */ CMICmnLog(const CMICmnLog &); - void operator=(const CMICmnLog &); - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmnLog() override; - - // Typedef: -private: - typedef std::map MapMediumToName_t; - typedef std::pair MapPairMediumToName_t; - - // Methods: -private: - bool HaveMediumAlready(const IMedium &vrMedium) const; - bool UnregisterMediumAll(); - - // Attributes: -private: - bool m_bRecursiveDive; // True = yes recursive, false = no - MapMediumToName_t m_mapMediumToName; - bool m_bEnabled; // True = Logger enabled for writing to mediums, false = - // medium not written to - bool m_bInitializingATM; // True = Yes in process of initing *this logger, - // false = not initing - // - // MI common object handling - duplicate of CMICmnBase functions, necessary - // for LINUX build - bool m_bInitialized; // True = yes successfully initialized, false = no yet or - // failed - mutable CMIUtilString m_strMILastErrorDescription; - MIint m_clientUsageRefCnt; // Count of client using *this object so not - // shutdown() object to early -}; diff --git a/lldb/tools/lldb-mi/MICmnLog.cpp b/lldb/tools/lldb-mi/MICmnLog.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLog.cpp +++ /dev/null @@ -1,330 +0,0 @@ -//===-- MICmnLog.cpp --------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnLog.h" -#include "MICmnLogMediumFile.h" -#include "MICmnResources.h" -#include "MIDriverMgr.h" -#include "MIUtilDateTimeStd.h" - -//++ -// Details: CMICmnLog constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLog::CMICmnLog() : m_bEnabled(false), m_bInitializingATM(false) { - // Do not use this constructor, use Initialize() -} - -//++ -// Details: CMICmnLog destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLog::~CMICmnLog() { Shutdown(); } - -//++ -// Details: Initialize resources for *this Logger. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLog::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - ClrErrorDescription(); - - // Mediums set inside because explicitly initing in MIDriverMain.cpp causes - // compile errors with CAtlFile - CMICmnLogMediumFile &rFileLog(CMICmnLogMediumFile::Instance()); - bool bOk = RegisterMedium(rFileLog); - if (bOk) { - // Set the Log trace file's header - const CMIUtilString &rCR(rFileLog.GetLineReturn()); - CMIUtilDateTimeStd date; - CMIUtilString msg; - msg = CMIUtilString::Format( - "%s\n", CMIDriverMgr::Instance().GetAppVersion().c_str()); - CMIUtilString logHdr(msg); - msg = CMIUtilString::Format(MIRSRC(IDS_LOG_MSG_CREATION_DATE), - date.GetDate().c_str(), date.GetTime().c_str(), - rCR.c_str()); - logHdr += msg; - msg = - CMIUtilString::Format(MIRSRC(IDS_LOG_MSG_FILE_LOGGER_PATH), - rFileLog.GetFileNamePath().c_str(), rCR.c_str()); - logHdr += msg; - - bOk = rFileLog.SetHeaderTxt(logHdr); - - // Note log file medium's status is not available until we write at least - // once to the file (so just write the title 1st line) - m_bInitializingATM = true; - CMICmnLog::WriteLog("."); - if (!rFileLog.IsOk()) { - const CMIUtilString msg( - CMIUtilString::Format(MIRSRC(IDS_LOG_ERR_FILE_LOGGER_DISABLED), - rFileLog.GetErrorDescription().c_str())); - CMICmnLog::WriteLog(msg); - } - m_bInitializingATM = false; - } - - m_bInitialized = bOk; - - return bOk; -} - -//++ -// Details: Release resources for *this Logger. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLog::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - ClrErrorDescription(); - - const bool bOk = UnregisterMediumAll(); - - m_bInitialized = bOk; - - return bOk; -} - -//++ -// Details: Enabled or disable *this Logger from writing any data to registered -// clients. -// Type: Method. -// Args: vbYes - (R) True = Logger enabled, false = disabled. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLog::SetEnabled(const bool vbYes) { - m_bEnabled = vbYes; - - return MIstatus::success; -} - -//++ -// Details: Retrieve state whether *this Logger is enabled writing data to -// registered clients. -// Type: Method. -// Args: None. -// Return: True = Logger enable. -// False = disabled. -// Throws: None. -//-- -bool CMICmnLog::GetEnabled() const { return m_bEnabled; } - -//++ -// Details: Unregister all the Mediums registered with *this Logger. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLog::UnregisterMediumAll() { - MapMediumToName_t::const_iterator it = m_mapMediumToName.begin(); - for (; it != m_mapMediumToName.end(); it++) { - IMedium *pMedium = (*it).first; - pMedium->Shutdown(); - } - - m_mapMediumToName.clear(); - - return MIstatus::success; -} - -//++ -// Details: Register a Medium with *this Logger. -// Type: Method. -// Args: vrMedium - (R) The medium to register. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLog::RegisterMedium(const IMedium &vrMedium) { - if (HaveMediumAlready(vrMedium)) - return MIstatus::success; - - IMedium *pMedium = const_cast(&vrMedium); - if (!pMedium->Initialize()) { - const CMIUtilString &rStrMedName(pMedium->GetName()); - const CMIUtilString &rStrMedErr(pMedium->GetError()); - SetErrorDescription(CMIUtilString::Format(MIRSRC(IDS_LOG_MEDIUM_ERR_INIT), - rStrMedName.c_str(), - rStrMedErr.c_str())); - return MIstatus::failure; - } - - MapPairMediumToName_t pr(pMedium, pMedium->GetName()); - m_mapMediumToName.insert(pr); - - return MIstatus::success; -} - -//++ -// Details: Query the Logger to see if a medium is already registered. -// Type: Method. -// Args: vrMedium - (R) The medium to query. -// Return: True - registered. -// False - not registered. -// Throws: None. -//-- -bool CMICmnLog::HaveMediumAlready(const IMedium &vrMedium) const { - IMedium *pMedium = const_cast(&vrMedium); - const MapMediumToName_t::const_iterator it = m_mapMediumToName.find(pMedium); - return it != m_mapMediumToName.end(); -} - -//++ -// Details: Unregister a medium from the Logger. -// Type: Method. -// Args: vrMedium - (R) The medium to unregister. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLog::UnregisterMedium(const IMedium &vrMedium) { - IMedium *pMedium = const_cast(&vrMedium); - m_mapMediumToName.erase(pMedium); - - return MIstatus::success; -} - -//++ -// Details: The callee client uses this function to write to the Logger. The -// data to be -// written is given out to all the mediums registered. The verbosity -// type parameter -// indicates to the medium(s) the type of data or message given to it. -// The medium has -// modes of verbosity and depending on the verbosity set determines -// which writes -// go in to the logger. -// The logger must be initialized successfully before a write to any -// registered -// can be carried out. -// Type: Method. -// Args: vData - (R) The data to write to the logger. -// veType - (R) Verbosity type. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLog::Write(const CMIUtilString &vData, const ELogVerbosity veType) { - if (!m_bInitialized && !m_bInitializingATM) - return MIstatus::success; - if (m_bRecursiveDive) - return MIstatus::success; - if (!m_bEnabled) - return MIstatus::success; - - m_bRecursiveDive = true; - - MIuint cnt = 0; - MIuint cntErr = 0; - { - MapMediumToName_t::const_iterator it = m_mapMediumToName.begin(); - while (it != m_mapMediumToName.end()) { - IMedium *pMedium = (*it).first; - const CMIUtilString &rNameMedium = (*it).second; - MIunused(rNameMedium); - if (pMedium->Write(vData, veType)) - cnt++; - else - cntErr++; - - // Next - ++it; - } - } - - bool bOk = MIstatus::success; - const MIuint mediumCnt = m_mapMediumToName.size(); - if ((cnt == 0) && (mediumCnt > 0)) { - SetErrorDescription(MIRSRC(IDS_LOG_MEDIUM_ERR_WRITE_ANY)); - bOk = MIstatus::failure; - } - if (bOk && (cntErr != 0)) { - SetErrorDescription(MIRSRC(IDS_LOG_MEDIUM_ERR_WRITE_MEDIUMFAIL)); - bOk = MIstatus::failure; - } - - m_bRecursiveDive = false; - - return bOk; -} - -//++ -// Details: Short cut function call to write only to the Log file. -// The logger must be initialized successfully before a write to any -// registered -// can be carried out. -// Type: Static. -// Args: vData - (R) The data to write to the logger. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLog::WriteLog(const CMIUtilString &vData) { - return CMICmnLog::Instance().Write(vData, CMICmnLog::eLogVerbosity_Log); -} - -//++ -// Details: Retrieve a string detailing the last error. -// Type: Method. -// Args: None, -// Return: CMIUtilString. -// Throws: None. -//-- -const CMIUtilString &CMICmnLog::GetErrorDescription() const { - return m_strMILastErrorDescription; -} - -//++ -// Details: Set the internal description of the last error. -// Type: Method. -// Args: (R) String containing a description of the last error. -// Return: None. -// Throws: None. -//-- -void CMICmnLog::SetErrorDescription(const CMIUtilString &vrTxt) const { - m_strMILastErrorDescription = vrTxt; -} - -//++ -// Details: Clear the last error. -// Type: None. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmnLog::ClrErrorDescription() const { - m_strMILastErrorDescription = CMIUtilString(""); -} diff --git a/lldb/tools/lldb-mi/MICmnLogMediumFile.h b/lldb/tools/lldb-mi/MICmnLogMediumFile.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLogMediumFile.h +++ /dev/null @@ -1,84 +0,0 @@ -//===-- MICmnLogMediumFile.h ------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnBase.h" -#include "MICmnLog.h" -#include "MIUtilDateTimeStd.h" -#include "MIUtilFileStd.h" -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI common code implementation class. Logs application fn -// trace/message/ -// error messages to a file. Used as part of the CMICmnLog Logger -// system. When instantiated *this object is register with the Logger -// which the Logger when given data to write to registered medium comes -// *this medium. -// Singleton class. -//-- -class CMICmnLogMediumFile : public CMICmnBase, public CMICmnLog::IMedium { - // Statics: -public: - static CMICmnLogMediumFile &Instance(); - - // Methods: -public: - bool SetHeaderTxt(const CMIUtilString &vText); - bool SetVerbosity(const MIuint veType); - MIuint GetVerbosity() const; - const CMIUtilString &GetFileName() const; - const CMIUtilString &GetFileNamePath() const; - bool IsOk() const; - bool IsFileExist() const; - const CMIUtilString &GetLineReturn() const; - bool SetDirectory(const CMIUtilString &vPath); - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmnLogMediumFile() override; - // From CMICmnLog::IMedium - bool Initialize() override; - const CMIUtilString &GetName() const override; - bool Write(const CMIUtilString &vData, - const CMICmnLog::ELogVerbosity veType) override; - const CMIUtilString &GetError() const override; - bool Shutdown() override; - - // Methods: -private: - /* ctor */ CMICmnLogMediumFile(); - /* ctor */ CMICmnLogMediumFile(const CMICmnLogMediumFile &); - void operator=(const CMICmnLogMediumFile &); - - bool FileWriteEnglish(const CMIUtilString &vData); - bool FileFormFileNamePath(); - CMIUtilString MassagedData(const CMIUtilString &vData, - const CMICmnLog::ELogVerbosity veType); - bool FileWriteHeader(); - char ConvertLogVerbosityTypeToId(const CMICmnLog::ELogVerbosity veType) const; - CMIUtilString ConvertCr(const CMIUtilString &vData) const; - - // Attributes: -private: - const CMIUtilString m_constThisMediumName; - const CMIUtilString m_constMediumFileNameFormat; - // - CMIUtilString m_strMediumFileName; - CMIUtilString m_strMediumFileDirectory; - CMIUtilString m_fileNamePath; - MIuint m_eVerbosityType; - CMIUtilString m_strDate; - CMIUtilString m_fileHeaderTxt; - CMIUtilFileStd m_file; - CMIUtilDateTimeStd m_dateTime; -}; diff --git a/lldb/tools/lldb-mi/MICmnLogMediumFile.cpp b/lldb/tools/lldb-mi/MICmnLogMediumFile.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnLogMediumFile.cpp +++ /dev/null @@ -1,385 +0,0 @@ -//===-- MICmnLogMediumFile.cpp ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnLogMediumFile.h" -#include "MICmnResources.h" - -//++ -// Details: CMICmnLogMediumFile constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLogMediumFile::CMICmnLogMediumFile() - : m_constThisMediumName(MIRSRC(IDS_MEDIUMFILE_NAME)), - m_constMediumFileNameFormat("lldb-mi-%s.log"), - m_strMediumFileName(MIRSRC(IDS_MEDIUMFILE_ERR_INVALID_PATH)), - m_strMediumFileDirectory("."), - m_fileNamePath(MIRSRC(IDS_MEDIUMFILE_ERR_INVALID_PATH)), - m_eVerbosityType(CMICmnLog::eLogVerbosity_Log), - m_strDate(CMIUtilDateTimeStd().GetDate()), - m_fileHeaderTxt(MIRSRC(IDS_MEDIUMFILE_ERR_FILE_HEADER)) {} - -//++ -// Details: CMICmnLogMediumFile destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnLogMediumFile::~CMICmnLogMediumFile() {} - -//++ -// Details: Get the singleton instance of *this class. -// Type: Static. -// Args: None. -// Return: CMICmnLogMediumFile - Reference to *this object. -// Throws: None. -//-- -CMICmnLogMediumFile &CMICmnLogMediumFile::Instance() { - static CMICmnLogMediumFile instance; - - return instance; -} - -//++ -// Details: Initialize setup *this medium ready for use. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLogMediumFile::Initialize() { - m_bInitialized = true; - return FileFormFileNamePath(); -} - -//++ -// Details: Unbind detach or release resources used by *this medium. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -bool CMICmnLogMediumFile::Shutdown() { - if (m_bInitialized) { - m_bInitialized = false; - m_file.Close(); - } - return MIstatus::success; -} - -//++ -// Details: Retrieve the name of *this medium. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString - Text data. -// Throws: None. -//-- -const CMIUtilString &CMICmnLogMediumFile::GetName() const { - return m_constThisMediumName; -} - -//++ -// Details: The callee client calls the write function on the Logger. The data -// to be -// written is given out to all the mediums registered. The verbosity -// type parameter -// indicates to the medium the type of data or message given to it. The -// medium has -// modes of verbosity and depending on the verbosity set determines -// which data is -// sent to the medium's output. -// Type: Method. -// Args: vData - (R) The data to write to the logger. -// veType - (R) Verbosity type. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLogMediumFile::Write(const CMIUtilString &vData, - const CMICmnLog::ELogVerbosity veType) { - if (m_bInitialized && m_file.IsOk()) { - const bool bDoWrite = (m_eVerbosityType & veType); - if (bDoWrite) { - bool bNewCreated = false; - bool bOk = m_file.CreateWrite(m_fileNamePath, bNewCreated); - if (bOk) { - if (bNewCreated) - bOk = FileWriteHeader(); - bOk = bOk && FileWriteEnglish(MassagedData(vData, veType)); - } - return bOk; - } - } - - return MIstatus::failure; -} - -//++ -// Details: Retrieve *this medium's last error condition. -// Type: Method. -// Args: None. -// Return: CString & - Text description. -// Throws: None. -//-- -const CMIUtilString &CMICmnLogMediumFile::GetError() const { - return m_strMILastErrorDescription; -} - -//++ -// Details: Set the verbosity mode for this medium. -// Type: Method. -// Args: veType - (R) Mask value. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLogMediumFile::SetVerbosity(const MIuint veType) { - m_eVerbosityType = veType; - return MIstatus::success; -} - -//++ -// Details: Get the verbosity mode for this medium. -// Type: Method. -// Args: veType - (R) Mask value. -// Return: CMICmnLog::ELogVerbosity - Mask value. -// Throws: None. -//-- -MIuint CMICmnLogMediumFile::GetVerbosity() const { return m_eVerbosityType; } - -//++ -// Details: Write data to a file English font. -// Type: Method. -// Args: vData - (R) The data to write to the logger. -// Return: None. -// Throws: None. -//-- -bool CMICmnLogMediumFile::FileWriteEnglish(const CMIUtilString &vData) { - return m_file.Write(vData); -} - -//++ -// Details: Determine and form the medium file's directory path and name. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLogMediumFile::FileFormFileNamePath() { - ClrErrorDescription(); - - m_fileNamePath = MIRSRC(IDS_MEDIUMFILE_ERR_INVALID_PATH); - - CMIUtilDateTimeStd date; - m_strMediumFileName = - CMIUtilString::Format(m_constMediumFileNameFormat.c_str(), - date.GetDateTimeLogFilename().c_str()); - -#if defined(_MSC_VER) - m_fileNamePath = CMIUtilString::Format( - "%s\\%s", m_strMediumFileDirectory.c_str(), m_strMediumFileName.c_str()); -#else - m_fileNamePath = CMIUtilString::Format( - "%s/%s", m_strMediumFileDirectory.c_str(), m_strMediumFileName.c_str()); -#endif // defined ( _MSC_VER ) - - return MIstatus::success; -} - -//++ -// Details: Retrieve the medium file's directory path and name. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - File path. -// Throws: None. -//-- -const CMIUtilString &CMICmnLogMediumFile::GetFileNamePath() const { - return m_fileNamePath; -} - -//++ -// Details: Retrieve the medium file's name. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - File name. -// Throws: None. -//-- -const CMIUtilString &CMICmnLogMediumFile::GetFileName() const { - return m_strMediumFileName; -} - -//++ -// Details: Massage the data to behave correct when submitted to file. Insert -// extra log -// specific text. The veType is there to allow in the future to parse -// the log and -// filter in out specific types of message to make viewing the log more -// manageable. -// Type: Method. -// Args: vData - (R) Raw data. -// veType - (R) Message type. -// Return: CMIUtilString - Massaged data. -// Throws: None. -//-- -CMIUtilString -CMICmnLogMediumFile::MassagedData(const CMIUtilString &vData, - const CMICmnLog::ELogVerbosity veType) { - const CMIUtilString strCr("\n"); - CMIUtilString data; - const char verbosityCode(ConvertLogVerbosityTypeToId(veType)); - const CMIUtilString dt(CMIUtilString::Format("%s %s", m_strDate.c_str(), - m_dateTime.GetTime().c_str())); - - data = CMIUtilString::Format("%c,%s,%s", verbosityCode, dt.c_str(), - vData.c_str()); - data = ConvertCr(data); - - // Look for EOL... - const size_t pos = vData.rfind(strCr); - if (pos == vData.size()) - return data; - - // ... did not have an EOL so add one - data += GetLineReturn(); - - return data; -} - -//++ -// Details: Convert the Log's verbosity type number into a single char -// character. -// Type: Method. -// Args: veType - (R) Message type. -// Return: wchar_t - A letter. -// Throws: None. -//-- -char CMICmnLogMediumFile::ConvertLogVerbosityTypeToId( - const CMICmnLog::ELogVerbosity veType) const { - char c = 0; - if (veType != 0) { - MIuint cnt = 0; - MIuint number(veType); - while (1 != number) { - number = number >> 1; - ++cnt; - } - c = 'A' + cnt; - } else { - c = '*'; - } - - return c; -} - -//++ -// Details: Retrieve state of whether the file medium is ok. -// Type: Method. -// Args: None. -// Return: True - file ok. -// False - file has a problem. -// Throws: None. -//-- -bool CMICmnLogMediumFile::IsOk() const { return m_file.IsOk(); } - -//++ -// Details: Status on the file log medium existing already. -// Type: Method. -// Args: None. -// Return: True - Exists. -// False - Not found. -// Throws: None. -//-- -bool CMICmnLogMediumFile::IsFileExist() const { - return m_file.IsFileExist(GetFileNamePath()); -} - -//++ -// Details: Write the header text the logger file. -// Type: Method. -// Args: vText - (R) Text. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLogMediumFile::FileWriteHeader() { - return FileWriteEnglish(ConvertCr(m_fileHeaderTxt)); -} - -//++ -// Details: Convert any carriage line returns to be compatible with the platform -// the -// Log file is being written to. -// Type: Method. -// Args: vData - (R) Text data. -// Return: CMIUtilString - Converted string data. -// Throws: None. -//-- -CMIUtilString CMICmnLogMediumFile::ConvertCr(const CMIUtilString &vData) const { - const CMIUtilString strCr("\n"); - const CMIUtilString &rCrCmpat(GetLineReturn()); - - if (strCr == rCrCmpat) - return vData; - - const size_t nSizeCmpat(rCrCmpat.size()); - const size_t nSize(strCr.size()); - CMIUtilString strConv(vData); - size_t pos = strConv.find(strCr); - while (pos != CMIUtilString::npos) { - strConv.replace(pos, nSize, rCrCmpat); - pos = strConv.find(strCr, pos + nSizeCmpat); - } - - return strConv; -} - -//++ -// Details: Set the header text that is written to the logger file at the -// beginning. -// Type: Method. -// Args: vText - (R) Text. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLogMediumFile::SetHeaderTxt(const CMIUtilString &vText) { - m_fileHeaderTxt = vText; - - return MIstatus::success; -} - -//++ -// Details: Retrieve the file current carriage line return characters used. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - Text. -// Throws: None. -//-- -const CMIUtilString &CMICmnLogMediumFile::GetLineReturn() const { - return m_file.GetLineReturn(); -} - -//++ -// Details: Set the directory to place the log file. -// Type: Method. -// Args: vPath - (R) Path to log. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnLogMediumFile::SetDirectory(const CMIUtilString &vPath) { - m_strMediumFileDirectory = vPath; - - return FileFormFileNamePath(); -} diff --git a/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.h b/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.h +++ /dev/null @@ -1,93 +0,0 @@ -//===-- MICmnMIOutOfBandRecord.h --------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnBase.h" -#include "MICmnMIValueConst.h" -#include "MICmnMIValueResult.h" -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI common code MI Out-of-band (Async) Record class. A class that -// encapsulates -// MI result record data and the forming/format of data added to it. -// Out-of-band records are used to notify the GDB/MI client of -// additional -// changes that have occurred. Those changes can either be a -// consequence -// of GDB/MI (e.g., a breakpoint modified) or a result of target -// activity -// (e.g., target stopped). -// The syntax is as follows: -// "*" type ( "," result )* -// type ==> running | stopped -// -// The Out-of-band record can be retrieve at any time *this object is -// instantiated so unless work is done on *this Out-of-band record then -// it is -// possible to return a malformed Out-of-band record. If nothing has -// been set -// or added to *this MI Out-of-band record object then text "" -// will -// be returned. -// -// More information see: -// http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_chapter/gdb_22.html// -//-- -class CMICmnMIOutOfBandRecord : public CMICmnBase { - // Enumerations: -public: - //++ - // Details: Enumeration of the type of Out-of-band for *this Out-of-band - // record - //-- - enum OutOfBand_e { - eOutOfBand_Running = 0, - eOutOfBand_Stopped, - eOutOfBand_BreakPointCreated, - eOutOfBand_BreakPointModified, - eOutOfBand_Thread, - eOutOfBand_ThreadGroupAdded, - eOutOfBand_ThreadGroupExited, - eOutOfBand_ThreadGroupRemoved, - eOutOfBand_ThreadGroupStarted, - eOutOfBand_ThreadCreated, - eOutOfBand_ThreadExited, - eOutOfBand_ThreadSelected, - eOutOfBand_TargetModuleLoaded, - eOutOfBand_TargetModuleUnloaded, - eOutOfBand_TargetStreamOutput, - eOutOfBand_ConsoleStreamOutput, - eOutOfBand_LogStreamOutput - }; - - // Methods: -public: - /* ctor */ CMICmnMIOutOfBandRecord(); - /* ctor */ CMICmnMIOutOfBandRecord(OutOfBand_e veType); - /* ctor */ CMICmnMIOutOfBandRecord(OutOfBand_e veType, - const CMICmnMIValueConst &vConst); - /* ctor */ CMICmnMIOutOfBandRecord(OutOfBand_e veType, - const CMICmnMIValueResult &vResult); - // - const CMIUtilString &GetString() const; - void Add(const CMICmnMIValueResult &vResult); - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmnMIOutOfBandRecord() override; - - // Attributes: -private: - CMIUtilString - m_strAsyncRecord; // Holds the text version of the result record to date -}; diff --git a/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.cpp b/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.cpp +++ /dev/null @@ -1,202 +0,0 @@ -//===-- MICmnMIOutOfBandRecord.cpp ------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third Party Headers: -#include - -// In-house headers: -#include "MICmnMIOutOfBandRecord.h" -#include "MICmnResources.h" - -// Instantiations: -static const char * -MapOutOfBandToText(CMICmnMIOutOfBandRecord::OutOfBand_e veType) { - switch (veType) { - case CMICmnMIOutOfBandRecord::eOutOfBand_Running: - return "running"; - case CMICmnMIOutOfBandRecord::eOutOfBand_Stopped: - return "stopped"; - case CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointCreated: - return "breakpoint-created"; - case CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointModified: - return "breakpoint-modified"; - case CMICmnMIOutOfBandRecord::eOutOfBand_Thread: - return ""; // "" Meant to be empty - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupAdded: - return "thread-group-added"; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupExited: - return "thread-group-exited"; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupRemoved: - return "thread-group-removed"; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupStarted: - return "thread-group-started"; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadCreated: - return "thread-created"; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited: - return "thread-exited"; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected: - return "thread-selected"; - case CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleLoaded: - return "library-loaded"; - case CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleUnloaded: - return "library-unloaded"; - case CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput: - return ""; - case CMICmnMIOutOfBandRecord::eOutOfBand_ConsoleStreamOutput: - return ""; - case CMICmnMIOutOfBandRecord::eOutOfBand_LogStreamOutput: - return ""; - } - assert(false && "unknown CMICmnMIOutofBandRecord::OutOfBand_e"); - return nullptr; -} - -static const char * -MapOutOfBandToToken(CMICmnMIOutOfBandRecord::OutOfBand_e veType) { - switch (veType) { - case CMICmnMIOutOfBandRecord::eOutOfBand_Running: - return "*"; - case CMICmnMIOutOfBandRecord::eOutOfBand_Stopped: - return "*"; - case CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointCreated: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_BreakPointModified: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_Thread: - return "@"; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupAdded: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupExited: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupRemoved: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupStarted: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadCreated: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleLoaded: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleUnloaded: - return "="; - case CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput: - return "@"; - case CMICmnMIOutOfBandRecord::eOutOfBand_ConsoleStreamOutput: - return "~"; - case CMICmnMIOutOfBandRecord::eOutOfBand_LogStreamOutput: - return "&"; - } - assert(false && "unknown CMICmnMIOutofBandRecord::OutOfBand_e"); - return nullptr; -} - -//++ -// Details: Build the Out-of-band record's mandatory data part. The part up to -// the first -// (additional) result i.e. async-record ==> "*" type. -// Args: veType - (R) A MI Out-of-Band enumeration. -// Return: CMIUtilString - The async record text. -// Throws: None. -//-- -static CMIUtilString -BuildAsyncRecord(CMICmnMIOutOfBandRecord::OutOfBand_e veType) { - auto Token = MapOutOfBandToToken(veType); - auto Text = MapOutOfBandToText(veType); - return CMIUtilString::Format("%s%s", CMIUtilString::WithNullAsEmpty(Token), - CMIUtilString::WithNullAsEmpty(Text)); -} - -//++ -// Details: CMICmnMIOutOfBandRecord constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIOutOfBandRecord::CMICmnMIOutOfBandRecord() - : m_strAsyncRecord(MIRSRC(IDS_CMD_ERR_EVENT_HANDLED_BUT_NO_ACTION)) {} - -//++ -// Details: CMICmnMIOutOfBandRecord constructor. -// Type: Method. -// Args: veType - (R) A MI Out-of-Bound enumeration. -// Return: None. -// Throws: None. -//-- -CMICmnMIOutOfBandRecord::CMICmnMIOutOfBandRecord(OutOfBand_e veType) - : m_strAsyncRecord(BuildAsyncRecord(veType)) {} - -//++ -// Details: CMICmnMIOutOfBandRecord constructor. -// Type: Method. -// Args: veType - (R) A MI Out-of-Bound enumeration. -// vConst - (R) A MI const object. -// Return: None. -// Throws: None. -//-- -CMICmnMIOutOfBandRecord::CMICmnMIOutOfBandRecord( - OutOfBand_e veType, const CMICmnMIValueConst &vConst) - : m_strAsyncRecord(BuildAsyncRecord(veType)) { - m_strAsyncRecord += vConst.GetString(); -} - -//++ -// Details: CMICmnMIOutOfBandRecord constructor. -// Type: Method. -// Args: veType - (R) A MI Out-of-Bound enumeration. -// vResult - (R) A MI result object. -// Return: None. -// Throws: None. -//-- -CMICmnMIOutOfBandRecord::CMICmnMIOutOfBandRecord( - OutOfBand_e veType, const CMICmnMIValueResult &vResult) - : m_strAsyncRecord(BuildAsyncRecord(veType)) { - Add(vResult); -} - -//++ -// Details: CMICmnMIOutOfBandRecord destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIOutOfBandRecord::~CMICmnMIOutOfBandRecord() {} - -//++ -// Details: Return the MI Out-of-band record as a string. The string is a direct -// result of -// work done on *this Out-of-band record so if not enough data is added -// then it is -// possible to return a malformed Out-of-band record. If nothing has -// been set or -// added to *this MI Out-of-band record object then text "" -// will be returned. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - MI output text. -// Throws: None. -//-- -const CMIUtilString &CMICmnMIOutOfBandRecord::GetString() const { - return m_strAsyncRecord; -} - -//++ -// Details: Add to *this Out-of-band record additional information. -// Type: Method. -// Args: vResult - (R) A MI result object. -// Return: None. -// Throws: None. -//-- -void CMICmnMIOutOfBandRecord::Add(const CMICmnMIValueResult &vResult) { - m_strAsyncRecord += ","; - m_strAsyncRecord += vResult.GetString(); -} diff --git a/lldb/tools/lldb-mi/MICmnMIResultRecord.h b/lldb/tools/lldb-mi/MICmnMIResultRecord.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIResultRecord.h +++ /dev/null @@ -1,79 +0,0 @@ -//===-- MICmnMIResultRecord.h -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnBase.h" -#include "MICmnMIValueResult.h" -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI common code MI Result Record class. A class that encapsulates -// MI result record data and the forming/format of data added to it. -// The syntax is as follows: -// result-record ==> [ token ] "^" result-class ( "," result )* nl -// token = any sequence of digits -// * = 0 to many -// nl = CR | CR_LF -// result-class ==> "done" | "running" | "connected" | "error" | "exit" -// result ==> variable "=" value -// value ==> const | tuple | list -// const ==> c-string (7 bit iso c string content) i.e. "all" inc -// quotes -// tuple ==> "{}" | "{" result ( "," result )* "}" -// list ==> "[]" | "[" value ( "," value )* "]" | "[" result ( "," -// result )* "]" -// -// The result record can be retrieve at any time *this object is -// instantiated so unless work is done on *this result record then it -// is -// possible to return a malformed result record. If nothing has been -// set -// or added to *this MI result record object then text "" will -// be returned. -// More information see: -// http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_chapter/gdb_22.html -//-- -class CMICmnMIResultRecord : public CMICmnBase { - // Enumerations: -public: - //++ - // Details: Enumeration of the result class for *this result record - //-- - enum ResultClass_e { - eResultClass_Done = 0, - eResultClass_Running, - eResultClass_Connected, - eResultClass_Error, - eResultClass_Exit - }; - - // Methods: -public: - /* ctor */ CMICmnMIResultRecord(); - /* ctor */ CMICmnMIResultRecord(const CMIUtilString &vrToken, - ResultClass_e veType); - /* ctor */ CMICmnMIResultRecord(const CMIUtilString &vrToken, - ResultClass_e veType, - const CMICmnMIValueResult &vValue); - // - const CMIUtilString &GetString() const; - void Add(const CMICmnMIValue &vMIValue); - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmnMIResultRecord() override; - - // Attributes: -private: - CMIUtilString - m_strResultRecord; // Holds the text version of the result record to date -}; diff --git a/lldb/tools/lldb-mi/MICmnMIResultRecord.cpp b/lldb/tools/lldb-mi/MICmnMIResultRecord.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIResultRecord.cpp +++ /dev/null @@ -1,133 +0,0 @@ -//===-- MICmnMIResultRecord.cpp ---------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third Party Headers: -#include - -// In-house headers: -#include "MICmnMIResultRecord.h" -#include "MICmnResources.h" - -//++ -// Details: Map a result class to the corresponding string. -// Args: veType - (R) A MI result class enumeration. -// Return: const char* - The string corresponding to the result class. -// Throws: None. -//-- -static const char * -MapResultClassToResultClassText(CMICmnMIResultRecord::ResultClass_e veType) { - switch (veType) { - case CMICmnMIResultRecord::eResultClass_Done: - return "done"; - case CMICmnMIResultRecord::eResultClass_Running: - return "running"; - case CMICmnMIResultRecord::eResultClass_Connected: - return "connected"; - case CMICmnMIResultRecord::eResultClass_Error: - return "error"; - case CMICmnMIResultRecord::eResultClass_Exit: - return "exit"; - } - assert(false && "unknown CMICmnMIResultRecord::ResultClass_e"); - return nullptr; -} - -//++ -// Details: Build the result record's mandatory data part. The part up to the -// first -// (additional) result i.e. result-record ==> [ token ] "^" -// result-class. -// Args: vrToken - (R) The command's transaction ID or token. -// veType - (R) A MI result class enumeration. -// Return: CMIUtilString & - MI result record mandatory data -// Throws: None. -//-- -static const CMIUtilString -BuildResultRecord(const CMIUtilString &vrToken, - CMICmnMIResultRecord::ResultClass_e veType) { - const char *pStrResultRecord = MapResultClassToResultClassText(veType); - return CMIUtilString::Format("%s^%s", vrToken.c_str(), - CMIUtilString::WithNullAsEmpty(pStrResultRecord)); -} - -//++ -// Details: CMICmnMIResultRecord constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIResultRecord::CMICmnMIResultRecord() - : m_strResultRecord(MIRSRC(IDS_CMD_ERR_CMD_RUN_BUT_NO_ACTION)) {} - -//++ -// Details: CMICmnMIResultRecord constructor. -// Type: Method. -// Args: vrToken - (R) The command's transaction ID or token. -// veType - (R) A MI result class enumeration. -// Return: None. -// Throws: None. -//-- -CMICmnMIResultRecord::CMICmnMIResultRecord(const CMIUtilString &vrToken, - ResultClass_e veType) - : m_strResultRecord(BuildResultRecord(vrToken, veType)) {} - -//++ -// Details: CMICmnMIResultRecord constructor. -// Type: Method. -// Args: vrToken - (R) The command's transaction ID or token. -// veType - (R) A MI result class enumeration. -// vMIResult - (R) A MI result object. -// Return: None. -// Throws: None. -//-- -CMICmnMIResultRecord::CMICmnMIResultRecord(const CMIUtilString &vrToken, - ResultClass_e veType, - const CMICmnMIValueResult &vValue) - : m_strResultRecord(BuildResultRecord(vrToken, veType)) { - Add(vValue); -} - -//++ -// Details: CMICmnMIResultRecord destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIResultRecord::~CMICmnMIResultRecord() {} - -//++ -// Details: Return the MI result record as a string. The string is a direct -// result of -// work done on *this result record so if not enough data is added then -// it is -// possible to return a malformed result record. If nothing has been -// set or -// added to *this MI result record object then text "" will be -// returned. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - MI output text. -// Throws: None. -//-- -const CMIUtilString &CMICmnMIResultRecord::GetString() const { - return m_strResultRecord; -} - -//++ -// Details: Add to *this result record additional information. -// Type: Method. -// Args: vMIValue - (R) A MI value derived object. -// Return: None. -// Throws: None. -//-- -void CMICmnMIResultRecord::Add(const CMICmnMIValue &vMIValue) { - m_strResultRecord += ","; - m_strResultRecord += vMIValue.GetString(); -} diff --git a/lldb/tools/lldb-mi/MICmnMIValue.h b/lldb/tools/lldb-mi/MICmnMIValue.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIValue.h +++ /dev/null @@ -1,50 +0,0 @@ -//===-- MICmnMIValue.h ------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnBase.h" - -//++ -//============================================================================ -// Details: MI common code MI Result class. Part of the CMICmnMIValueRecord -// set of objects. -// The syntax is as follows: -// result-record ==> [ token ] "^" result-class ( "," result )* nl -// token = any sequence of digits -// * = 0 to many -// nl = CR | CR_LF -// result-class ==> "done" | "running" | "connected" | "error" | "exit" -// result ==> variable "=" value -// value ==> const | tuple | list -// const ==> c-string (7 bit iso c string content) -// tuple ==> "{}" | "{" result ( "," result )* "}" -// list ==> "[]" | "[" value ( "," value )* "]" | "[" result ( "," -// result )* "]" -// More information see: -// http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_chapter/gdb_22.html -//-- -class CMICmnMIValue : public CMICmnBase { - // Methods: -public: - /* ctor */ CMICmnMIValue(); - // - const CMIUtilString &GetString() const; - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmnMIValue() override; - - // Attributes: -protected: - CMIUtilString m_strValue; - bool m_bJustConstructed; // True = *this just constructed with no value, false - // = *this has had value added to it -}; diff --git a/lldb/tools/lldb-mi/MICmnMIValue.cpp b/lldb/tools/lldb-mi/MICmnMIValue.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIValue.cpp +++ /dev/null @@ -1,43 +0,0 @@ -//===-- MICmnMIValue.cpp ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnMIValue.h" -#include "MICmnResources.h" - -//++ -// Details: CMICmnMIValue constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIValue::CMICmnMIValue() - : m_strValue(MIRSRC(IDS_WORD_INVALIDBRKTS)), m_bJustConstructed(true) {} - -//++ -// Details: CMICmnMIValue destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIValue::~CMICmnMIValue() {} - -//++ -// Details: Return the MI value as a string. The string is a direct result of -// work done on *this value so if not enough data is added then it is -// possible to return a malformed value. If nothing has been set or -// added to *this MI value object then text "" will be -// returned. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - MI output text. -// Throws: None. -//-- -const CMIUtilString &CMICmnMIValue::GetString() const { return m_strValue; } diff --git a/lldb/tools/lldb-mi/MICmnMIValueConst.h b/lldb/tools/lldb-mi/MICmnMIValueConst.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIValueConst.h +++ /dev/null @@ -1,59 +0,0 @@ -//===-- MICmnMIValueConst.h -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnMIValue.h" - -//++ -//============================================================================ -// Details: MI common code MI Result class. Part of the CMICmnMIValueConstRecord -// set of objects. -// The syntax is as follows: -// result-record ==> [ token ] "^" result-class ( "," result )* nl -// token = any sequence of digits -// * = 0 to many -// nl = CR | CR_LF -// result-class ==> "done" | "running" | "connected" | "error" | "exit" -// result ==> variable "=" value -// value ==> const | tuple | list -// const ==> c-string (7 bit iso c string content) -// tuple ==> "{}" | "{" result ( "," result )* "}" -// list ==> "[]" | "[" value ( "," value )* "]" | "[" result ( "," -// result )* "]" -// More information see: -// http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_chapter/gdb_22.html -// -// The text formed in *this Result class is stripped of any '\n' -// characters. -//-- -class CMICmnMIValueConst : public CMICmnMIValue { - // Methods: -public: - /* ctor */ CMICmnMIValueConst(const CMIUtilString &vString); - /* ctor */ CMICmnMIValueConst(const CMIUtilString &vString, - const bool vbNoQuotes); - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmnMIValueConst() override; - - // Methods: -private: - bool BuildConst(); - - // Attributes: -private: - static const CMIUtilString ms_constStrDblQuote; - // - CMIUtilString m_strPartConst; - bool m_bNoQuotes; // True = return string not surrounded with quotes, false = - // use quotes -}; diff --git a/lldb/tools/lldb-mi/MICmnMIValueConst.cpp b/lldb/tools/lldb-mi/MICmnMIValueConst.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIValueConst.cpp +++ /dev/null @@ -1,77 +0,0 @@ -//===-- MICmnMIValueConst.cpp -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnMIValueConst.h" - -// Instantiations: -const CMIUtilString CMICmnMIValueConst::ms_constStrDblQuote("\""); - -//++ -// Details: CMICmnMIValueConst constructor. -// Type: Method. -// Args: vString - (R) MI Const c-string value. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueConst::CMICmnMIValueConst(const CMIUtilString &vString) - : m_strPartConst(vString), m_bNoQuotes(false) { - BuildConst(); -} - -//++ -// Details: CMICmnMIValueConst constructor. -// Type: Method. -// Args: vString - (R) MI Const c-string value. -// vbNoQuotes - (R) True = return string not surrounded with quotes, -// false = use quotes. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueConst::CMICmnMIValueConst(const CMIUtilString &vString, - const bool vbNoQuotes) - : m_strPartConst(vString), m_bNoQuotes(vbNoQuotes) { - BuildConst(); -} - -//++ -// Details: CMICmnMIValueConst destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueConst::~CMICmnMIValueConst() {} - -//++ -// Details: Build the Value Const data. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnMIValueConst::BuildConst() { - if (m_strPartConst.length() != 0) { - const CMIUtilString strValue(m_strPartConst.StripCREndOfLine()); - if (m_bNoQuotes) { - m_strValue = strValue; - } else { - const char *pFormat = "%s%s%s"; - m_strValue = - CMIUtilString::Format(pFormat, ms_constStrDblQuote.c_str(), - strValue.c_str(), ms_constStrDblQuote.c_str()); - } - } else { - const char *pFormat = "%s%s"; - m_strValue = CMIUtilString::Format(pFormat, ms_constStrDblQuote.c_str(), - ms_constStrDblQuote.c_str()); - } - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MICmnMIValueList.h b/lldb/tools/lldb-mi/MICmnMIValueList.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIValueList.h +++ /dev/null @@ -1,55 +0,0 @@ -//===-- MICmnMIValueList.h --------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnMIValue.h" -#include "MICmnMIValueResult.h" - -//++ -//============================================================================ -// Details: MI common code MI Result class. Part of the CMICmnMIValueListRecord -// set of objects. -// The syntax is as follows: -// result-record ==> [ token ] "^" result-class ( "," result )* nl -// token = any sequence of digits -// * = 0 to many -// nl = CR | CR_LF -// result-class ==> "done" | "running" | "connected" | "error" | "exit" -// result ==> variable "=" value -// value ==> const | tuple | list -// const ==> c-string (7 bit iso c string content) -// tuple ==> "{}" | "{" result ( "," result )* "}" -// list ==> "[]" | "[" value ( "," value )* "]" | "[" result ( "," -// result )* "]" -// More information see: -// http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_chapter/gdb_22.html -//-- -class CMICmnMIValueList : public CMICmnMIValue { - // Methods: -public: - /* ctor */ CMICmnMIValueList(const bool vbValueTypeList); - /* ctor */ CMICmnMIValueList(const CMICmnMIValueResult &vResult); - /* ctor */ CMICmnMIValueList(const CMICmnMIValue &vValue); - // - void Add(const CMICmnMIValueResult &vResult); - void Add(const CMICmnMIValue &vValue); - CMIUtilString ExtractContentNoBrackets() const; - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmnMIValueList() override; - - // Methods: -private: - void BuildList(); - void BuildList(const CMICmnMIValueResult &vResult); - void BuildList(const CMICmnMIValue &vResult); -}; diff --git a/lldb/tools/lldb-mi/MICmnMIValueList.cpp b/lldb/tools/lldb-mi/MICmnMIValueList.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIValueList.cpp +++ /dev/null @@ -1,177 +0,0 @@ -//===-- MICmnMIValueList.cpp ------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnMIValueList.h" -#include "MICmnResources.h" - -//++ -// Details: CMICmnMIValueList constructor. -// Type: Method. -// Args: vbValueTypeList - (R) True = yes value type list, false = result -// type list. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueList::CMICmnMIValueList(const bool vbValueTypeList) { - m_strValue = "[]"; -} - -//++ -// Details: CMICmnMIValueList constructor. -// Construct a results only list. -// return MIstatus::failure. -// Type: Method. -// Args: vResult - (R) MI result object. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueList::CMICmnMIValueList(const CMICmnMIValueResult &vResult) { - m_strValue = vResult.GetString(); - BuildList(); - m_bJustConstructed = false; -} - -//++ -// Details: CMICmnMIValueList constructor. -// Construct a value only list. -// Type: Method. -// Args: vValue - (R) MI value object. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueList::CMICmnMIValueList(const CMICmnMIValue &vValue) { - m_strValue = vValue.GetString(); - BuildList(); - m_bJustConstructed = false; -} - -//++ -// Details: CMICmnMIValueList destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueList::~CMICmnMIValueList() {} - -//++ -// Details: Build the result value's mandatory data part, one tuple -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueList::BuildList() { - const char *pFormat = "[%s]"; - m_strValue = CMIUtilString::Format(pFormat, m_strValue.c_str()); -} - -//++ -// Details: Add another MI result object to the value list's of list is -// results. -// Only result objects can be added to a list of result otherwise this -// function -// will return MIstatus::failure. -// Type: Method. -// Args: vResult - (R) The MI result object. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueList::Add(const CMICmnMIValueResult &vResult) { - BuildList(vResult); -} - -//++ -// Details: Add another MI value object to the value list's of list is values. -// Only values objects can be added to a list of values otherwise this -// function -// will return MIstatus::failure. -// Type: Method. -// Args: vValue - (R) The MI value object. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueList::Add(const CMICmnMIValue &vValue) { BuildList(vValue); } - -//++ -// Details: Add another MI result object to the value list's of list is -// results. -// Only result objects can be added to a list of result otherwise this -// function -// will return MIstatus::failure. -// Type: Method. -// Args: vResult - (R) The MI result object. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueList::BuildList(const CMICmnMIValueResult &vResult) { - // Clear out the default "" text - if (m_bJustConstructed) { - m_bJustConstructed = false; - m_strValue = vResult.GetString(); - BuildList(); - return; - } - - const CMIUtilString data(ExtractContentNoBrackets()); - const char *pFormat = "[%s,%s]"; - m_strValue = - CMIUtilString::Format(pFormat, data.c_str(), vResult.GetString().c_str()); -} - -//++ -// Details: Add another MI value object to the value list's of list is values. -// Only values objects can be added to a list of values otherwise this -// function -// will return MIstatus::failure. -// Type: Method. -// Args: vValue - (R) The MI value object. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueList::BuildList(const CMICmnMIValue &vValue) { - // Clear out the default "" text - if (m_bJustConstructed) { - m_bJustConstructed = false; - m_strValue = vValue.GetString(); - BuildList(); - return; - } - - // Remove already present '[' and ']' from the start and end - m_strValue = m_strValue.Trim(); - size_t len = m_strValue.size(); - if ((len > 1) && (m_strValue[0] == '[') && (m_strValue[len - 1] == ']')) - m_strValue = m_strValue.substr(1, len - 2); - const char *pFormat = "[%s,%s]"; - m_strValue = CMIUtilString::Format(pFormat, m_strValue.c_str(), - vValue.GetString().c_str()); -} - -//++ -// Details: Retrieve the contents of *this value object but without the outer -// most -// brackets. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Data within the object. -// Throws: None. -//-- -CMIUtilString CMICmnMIValueList::ExtractContentNoBrackets() const { - CMIUtilString data(m_strValue); - - if (data[0] == '[') { - data = data.substr(1, data.length() - 1); - } - if (data[data.size() - 1] == ']') { - data = data.substr(0, data.length() - 1); - } - - return data; -} diff --git a/lldb/tools/lldb-mi/MICmnMIValueResult.h b/lldb/tools/lldb-mi/MICmnMIValueResult.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIValueResult.h +++ /dev/null @@ -1,66 +0,0 @@ -//===-- MICmnMIValueResult.h ------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnMIValue.h" - -//++ -//============================================================================ -// Details: MI common code MI Result class. Part of the -// CMICmnMIValueResultRecord -// set of objects. -// The syntax is as follows: -// result-record ==> [ token ] "^" result-class ( "," result )* nl -// token = any sequence of digits -// * = 0 to many -// nl = CR | CR_LF -// result-class ==> "done" | "running" | "connected" | "error" | "exit" -// result ==> variable "=" value -// value ==> const | tuple | list -// const ==> c-string (7 bit iso c string content) -// tuple ==> "{}" | "{" result ( "," result )* "}" -// list ==> "[]" | "[" value ( "," value )* "]" | "[" result ( "," -// result )* "]" -// More information see: -// http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_chapter/gdb_22.html -//-- -class CMICmnMIValueResult : public CMICmnMIValue { - // Methods: -public: - /* ctor */ CMICmnMIValueResult(); - /* ctor */ CMICmnMIValueResult(const CMIUtilString &vVariable, - const CMICmnMIValue &vValue); - /* ctor */ CMICmnMIValueResult(const CMIUtilString &vVariable, - const CMICmnMIValue &vValue, - const bool vbUseSpacing); - // - void Add(const CMIUtilString &vVariable, const CMICmnMIValue &vValue); - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmnMIValueResult() override; - - // Methods: -private: - void BuildResult(); - void BuildResult(const CMIUtilString &vVariable, const CMICmnMIValue &vValue); - - // Attributes: -private: - static const CMIUtilString ms_constStrEqual; - // - CMIUtilString m_strPartVariable; - CMICmnMIValue m_partMIValue; - bool m_bEmptyConstruction; // True = *this object used constructor with no - // parameters, false = constructor with parameters - bool m_bUseSpacing; // True = put space separators into the string, false = no - // spaces used -}; diff --git a/lldb/tools/lldb-mi/MICmnMIValueResult.cpp b/lldb/tools/lldb-mi/MICmnMIValueResult.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIValueResult.cpp +++ /dev/null @@ -1,116 +0,0 @@ -//===-- MICmnMIValueResult.cpp ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnMIValueResult.h" -#include "MICmnResources.h" - -// Instantiations: -const CMIUtilString CMICmnMIValueResult::ms_constStrEqual("="); - -//++ -// Details: CMICmnMIValueResult constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueResult::CMICmnMIValueResult() : m_bEmptyConstruction(true) {} - -//++ -// Details: CMICmnMIValueResult constructor. -// Type: Method. -// Args: vrVariable - (R) MI value's name. -// vrValue - (R) The MI value. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueResult::CMICmnMIValueResult(const CMIUtilString &vrVariable, - const CMICmnMIValue &vrValue) - : m_strPartVariable(vrVariable), m_partMIValue(vrValue), - m_bEmptyConstruction(false), m_bUseSpacing(false) { - BuildResult(); -} - -//++ -// Details: CMICmnMIValueResult constructor. -// Type: Method. -// Args: vrVariable - (R) MI value's name. -// vrValue - (R) The MI value. -// vbUseSpacing - (R) True = put space separators into the string, -// false = no spaces used. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueResult::CMICmnMIValueResult(const CMIUtilString &vrVariable, - const CMICmnMIValue &vrValue, - const bool vbUseSpacing) - : m_strPartVariable(vrVariable), m_partMIValue(vrValue), - m_bEmptyConstruction(false), m_bUseSpacing(vbUseSpacing) { - BuildResult(); -} - -//++ -// Details: CMICmnMIValueResult destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueResult::~CMICmnMIValueResult() {} - -//++ -// Details: Build the MI value result string. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueResult::BuildResult() { - const char *pFormat = m_bUseSpacing ? "%s %s %s" : "%s%s%s"; - m_strValue = CMIUtilString::Format(pFormat, m_strPartVariable.c_str(), - ms_constStrEqual.c_str(), - m_partMIValue.GetString().c_str()); -} - -//++ -// Details: Build the MI value result string. -// Type: Method. -// Args: vrVariable - (R) MI value's name. -// vrValue - (R) The MI value. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueResult::BuildResult(const CMIUtilString &vVariable, - const CMICmnMIValue &vValue) { - const char *pFormat = m_bUseSpacing ? "%s, %s %s %s" : "%s,%s%s%s"; - m_strValue = CMIUtilString::Format( - pFormat, m_strValue.c_str(), vVariable.c_str(), ms_constStrEqual.c_str(), - vValue.GetString().c_str()); -} - -//++ -// Details: Append another MI value object to *this MI value result. -// Type: Method. -// Args: vrVariable - (R) MI value's name. -// vrValue - (R) The MI value. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -void CMICmnMIValueResult::Add(const CMIUtilString &vrVariable, - const CMICmnMIValue &vrValue) { - if (!m_bEmptyConstruction) - BuildResult(vrVariable, vrValue); - else { - m_bEmptyConstruction = false; - m_strPartVariable = vrVariable; - m_partMIValue = vrValue; - BuildResult(); - } -} diff --git a/lldb/tools/lldb-mi/MICmnMIValueTuple.h b/lldb/tools/lldb-mi/MICmnMIValueTuple.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIValueTuple.h +++ /dev/null @@ -1,63 +0,0 @@ -//===-- MICmnMIValueTuple.h -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnMIValue.h" -#include "MICmnMIValueConst.h" -#include "MICmnMIValueResult.h" - -//++ -//============================================================================ -// Details: MI common code MI Result class. Part of the CMICmnMIValueTupleRecord -// set of objects. -// The syntax is as follows: -// result-record ==> [ token ] "^" result-class ( "," result )* nl -// token = any sequence of digits -// * = 0 to many -// nl = CR | CR_LF -// result-class ==> "done" | "running" | "connected" | "error" | "exit" -// result ==> variable "=" value -// value ==> const | tuple | list -// const ==> c-string (7 bit iso c string content) -// tuple ==> "{}" | "{" result ( "," result )* "}" -// list ==> "[]" | "[" value ( "," value )* "]" | "[" result ( "," -// result )* "]" -// More information see: -// http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_chapter/gdb_22.html -//-- -class CMICmnMIValueTuple : public CMICmnMIValue { - // Methods: -public: - /* ctor */ CMICmnMIValueTuple(); - /* ctor */ CMICmnMIValueTuple(const CMICmnMIValueResult &vResult); - /* ctor */ CMICmnMIValueTuple(const CMICmnMIValueResult &vResult, - const bool vbUseSpacing); - // - void Add(const CMICmnMIValueResult &vResult); - void Add(const CMICmnMIValueResult &vResult, const bool vbUseSpacing); - void Add(const CMICmnMIValueConst &vValue, const bool vbUseSpacing); - CMIUtilString ExtractContentNoBrackets() const; - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMICmnMIValueTuple() override; - - // Methods: -private: - void BuildTuple(); - void BuildTuple(const CMICmnMIValueResult &vResult); - void BuildTuple(const CMIUtilString &vValue); - - // Attributes: -private: - bool m_bSpaceAfterComma; // True = put space separators into the string, false - // = no spaces used -}; diff --git a/lldb/tools/lldb-mi/MICmnMIValueTuple.cpp b/lldb/tools/lldb-mi/MICmnMIValueTuple.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnMIValueTuple.cpp +++ /dev/null @@ -1,194 +0,0 @@ -//===-- MICmnMIValueTuple.cpp -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnMIValueTuple.h" - -//++ -// Details: CMICmnMIValueTuple constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueTuple::CMICmnMIValueTuple() : m_bSpaceAfterComma(false) { - m_strValue = "{}"; -} - -//++ -// Details: CMICmnMIValueTuple constructor. -// Type: Method. -// Args: vResult - (R) MI result object. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueTuple::CMICmnMIValueTuple(const CMICmnMIValueResult &vResult) - : m_bSpaceAfterComma(false) { - m_strValue = vResult.GetString(); - BuildTuple(); - m_bJustConstructed = false; -} - -//++ -// Details: CMICmnMIValueTuple constructor. -// Type: Method. -// Args: vResult - (R) MI result object. -// vbUseSpacing - (R) True = put space separators into the string, -// false = no spaces used. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueTuple::CMICmnMIValueTuple(const CMICmnMIValueResult &vResult, - const bool vbUseSpacing) - : m_bSpaceAfterComma(vbUseSpacing) { - m_strValue = vResult.GetString(); - BuildTuple(); - m_bJustConstructed = false; -} - -//++ -// Details: CMICmnMIValueTuple destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnMIValueTuple::~CMICmnMIValueTuple() {} - -//++ -// Details: Build the result value's mandatory data part, one tuple -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueTuple::BuildTuple() { - const char *pFormat = "{%s}"; - m_strValue = CMIUtilString::Format(pFormat, m_strValue.c_str()); -} - -//++ -// Details: Add another MI result object to the value's list of tuples. -// Type: Method. -// Args: vResult - (R) The MI result object. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueTuple::BuildTuple(const CMICmnMIValueResult &vResult) { - // Clear out the default "" text - if (m_bJustConstructed) { - m_bJustConstructed = false; - m_strValue = vResult.GetString(); - BuildTuple(); - return; - } - - if (m_strValue[0] == '{') { - m_strValue = m_strValue.substr(1, m_strValue.size() - 1); - } - if (m_strValue[m_strValue.size() - 1] == '}') { - m_strValue = m_strValue.substr(0, m_strValue.size() - 1); - } - - const char *pFormat = m_bSpaceAfterComma ? "{%s, %s}" : "{%s,%s}"; - m_strValue = CMIUtilString::Format(pFormat, m_strValue.c_str(), - vResult.GetString().c_str()); -} - -//++ -// Details: Add string value to the value's list of tuples. -// Type: Method. -// Args: vValue - (R) The string object. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueTuple::BuildTuple(const CMIUtilString &vValue) { - // Clear out the default "" text - if (m_bJustConstructed) { - m_bJustConstructed = false; - m_strValue = vValue; - BuildTuple(); - return; - } - - const CMIUtilString data(ExtractContentNoBrackets()); - const char *pFormat = m_bSpaceAfterComma ? "{%s, %s}" : "{%s,%s}"; - m_strValue = CMIUtilString::Format(pFormat, data.c_str(), vValue.c_str()); -} - -//++ -// Details: Add another MI value object to the value list's of list is values. -// Only values objects can be added to a list of values otherwise this -// function -// will return MIstatus::failure. -// Type: Method. -// Args: vValue - (R) The MI value object. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueTuple::Add(const CMICmnMIValueResult &vResult) { - BuildTuple(vResult); -} - -//++ -// Details: Add another MI value object to the value list's of list is values. -// Only values objects can be added to a list of values otherwise this -// function -// will return MIstatus::failure. -// Type: Method. -// Args: vValue - (R) The MI value object. -// vbUseSpacing - (R) True = put space separators into the string, -// false = no spaces used. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueTuple::Add(const CMICmnMIValueResult &vResult, - const bool vbUseSpacing) { - m_bSpaceAfterComma = vbUseSpacing; - BuildTuple(vResult); -} - -//++ -// Details: Add another MI value object to the value list's of list is values. -// Only values objects can be added to a list of values otherwise this -// function -// will return MIstatus::failure. -// Type: Method. -// Args: vValue - (R) The MI value object. -// vbUseSpacing - (R) True = put space separators into the string, -// false = no spaces used. -// Return: None. -// Throws: None. -//-- -void CMICmnMIValueTuple::Add(const CMICmnMIValueConst &vValue, - const bool vbUseSpacing) { - m_bSpaceAfterComma = vbUseSpacing; - BuildTuple(vValue.GetString()); -} - -//++ -// Details: Retrieve the contents of *this value object but without the outer -// most -// brackets. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Data within the object. -// Throws: None. -//-- -CMIUtilString CMICmnMIValueTuple::ExtractContentNoBrackets() const { - CMIUtilString data(m_strValue); - - if (data[0] == '{') { - data = data.substr(1, data.length() - 1); - } - if (data[data.size() - 1] == '}') { - data = data.substr(0, data.length() - 1); - } - - return data; -} diff --git a/lldb/tools/lldb-mi/MICmnResources.h b/lldb/tools/lldb-mi/MICmnResources.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnResources.h +++ /dev/null @@ -1,339 +0,0 @@ -//===-- MICmnResources.h ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers -#include - -// In-house headers: -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI string test data resource definitions. These IDs match up with -// actual string data in a map internal to CMICmnResources. -// *** Be sure to update ms_pResourceId2TextData[] array **** -enum { - IDS_PROJNAME = 1, - IDS_MI_VERSION_DESCRIPTION_DEBUG, - IDS_MI_VERSION_DESCRIPTION, - IDS_MI_APPNAME_SHORT, - IDS_MI_APPNAME_LONG, - IDS_MI_APP_FILEPATHNAME, - IDS_MI_APP_ARGS, - IDE_MI_VERSION_GDB, - - IDS_UTIL_FILE_ERR_INVALID_PATHNAME, - IDS_UTIL_FILE_ERR_OPENING_FILE, - IDS_UTIL_FILE_ERR_OPENING_FILE_UNKNOWN, - IDE_UTIL_FILE_ERR_WRITING_FILE, - IDE_UTIL_FILE_ERR_WRITING_NOTOPEN, - - IDS_RESOURCES_ERR_STRING_NOT_FOUND, - IDS_RESOURCES_ERR_STRING_TABLE_INVALID, - - IDS_MI_CLIENT_MSG, - - IDS_LOG_MSG_CREATION_DATE, - IDS_LOG_MSG_FILE_LOGGER_PATH, - IDS_LOG_MSG_VERSION, - IDS_LOG_ERR_FILE_LOGGER_DISABLED, - IDS_LOG_MEDIUM_ERR_INIT, - IDS_LOG_MEDIUM_ERR_WRITE_ANY, - IDS_LOG_MEDIUM_ERR_WRITE_MEDIUMFAIL, - - IDS_MEDIUMFILE_NAME, - IDS_MEDIUMFILE_ERR_INVALID_PATH, - IDS_MEDIUMFILE_ERR_FILE_HEADER, - IDS_MEDIUMFILE_NAME_LOG, - - IDE_OS_ERR_UNKNOWN, - IDE_OS_ERR_RETRIEVING, - - IDS_DRIVERMGR_DRIVER_ERR_INIT, - - IDE_MEDIUMSTDERR_NAME, - IDE_MEDIUMSTDOUT_NAME, - - IDE_MI_APP_DESCRIPTION, - IDE_MI_APP_INFORMATION, - IDE_MI_APP_ARG_USAGE, - IDE_MI_APP_ARG_HELP, - IDE_MI_APP_ARG_VERSION, - IDE_MI_APP_ARG_VERSION_LONG, - IDE_MI_APP_ARG_INTERPRETER, - IDE_MI_APP_ARG_EXECUTEABLE, - IDE_MI_APP_ARG_SOURCE, - IDE_MI_APP_ARG_APP_LOG, - IDE_MI_APP_ARG_APP_LOG_DIR, - IDE_MI_APP_ARG_EXAMPLE, - IDE_MI_APP_ARG_EXECUTABLE, - IDE_MI_APP_ARG_SYNCHRONOUS, - - IDS_STDIN_ERR_INVALID_PROMPT, - IDS_STDIN_ERR_THREAD_CREATION_FAILED, - IDS_STDIN_ERR_THREAD_DELETE, - IDS_STDIN_ERR_CHKING_BYTE_AVAILABLE, - IDS_STDIN_INPUT_CTRL_CHARS, - - IDS_CMD_QUIT_HELP, - - IDS_THREADMGR_ERR_THREAD_ID_INVALID, - IDS_THREADMGR_ERR_THREAD_FAIL_CREATE, - IDS_THREADMGR_ERR_THREAD_ID_NOT_FOUND, - IDS_THREADMGR_ERR_THREAD_STILL_ALIVE, - - IDS_FALLTHRU_DRIVER_CMD_RECEIVED, - - IDS_CMDFACTORY_ERR_INVALID_CMD_NAME, - IDS_CMDFACTORY_ERR_INVALID_CMD_CR8FN, - IDS_CMDFACTORY_ERR_CMD_NOT_REGISTERED, - IDS_CMDFACTORY_ERR_CMD_ALREADY_REGED, - - IDS_CMDMGR_ERR_CMD_FAILED_CREATE, - IDS_CMDMGR_ERR_CMD_INVOKER, - - IDS_MI_INIT_ERR_LOG, - IDS_MI_INIT_ERR_RESOURCES, - IDS_MI_INIT_ERR_INIT, - IDS_MI_INIT_ERR_STREAMSTDIN, - IDS_MI_INIT_ERR_STREAMSTDIN_OSHANDLER, - IDS_MI_INIT_ERR_OS_STDIN_HANDLER, - IDS_MI_INIT_ERR_STREAMSTDOUT, - IDS_MI_INIT_ERR_STREAMSTDERR, - IDS_MI_INIT_ERR_FALLTHRUDRIVER, - IDS_MI_INIT_ERR_THREADMGR, - IDS_MI_INIT_ERR_CMDINTERPRETER, - IDS_MI_INIT_ERR_CMDMGR, - IDS_MI_INIT_ERR_CMDFACTORY, - IDS_MI_INIT_ERR_CMDINVOKER, - IDS_MI_INIT_ERR_CMDMONITOR, - IDS_MI_INIT_ERR_LLDBDEBUGGER, - IDS_MI_INIT_ERR_DRIVERMGR, - IDS_MI_INIT_ERR_DRIVER, - IDS_MI_INIT_ERR_OUTOFBANDHANDLER, - IDS_MI_INIT_ERR_DEBUGSESSIONINFO, - IDS_MI_INIT_ERR_THREADMANAGER, - IDS_MI_INIT_ERR_CLIENT_USING_DRIVER, - IDS_MI_INIT_ERR_LOCAL_DEBUG_SESSION, - - IDS_CODE_ERR_INVALID_PARAMETER_VALUE, - IDS_CODE_ERR_INVALID_PARAM_NULL_POINTER, - IDS_CODE_ERR_INVALID_ENUMERATION_VALUE, - - IDS_LLDBDEBUGGER_ERR_INVALIDLISTENER, - IDS_LLDBDEBUGGER_ERR_INVALIDDEBUGGER, - IDS_LLDBDEBUGGER_ERR_CLIENTDRIVER, - IDS_LLDBDEBUGGER_ERR_STARTLISTENER, - IDS_LLDBDEBUGGER_ERR_THREADCREATIONFAIL, - IDS_LLDBDEBUGGER_ERR_THREAD_DELETE, - IDS_LLDBDEBUGGER_ERR_INVALIDBROADCASTER, - IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME, - IDS_LLDBDEBUGGER_ERR_CLIENTNOTREGISTERED, - IDS_LLDBDEBUGGER_ERR_STOPLISTENER, - IDS_LLDBDEBUGGER_ERR_BROADCASTER_NAME, - IDS_LLDBDEBUGGER_WRN_UNKNOWN_EVENT, - - IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT, - IDS_LLDBOUTOFBAND_ERR_PROCESS_INVALID, - IDS_LLDBOUTOFBAND_ERR_BRKPT_NOTFOUND, - IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_GET, - IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_SET, - IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE, - IDS_LLDBOUTOFBAND_ERR_FRAME_INFO_GET, - IDS_LLDBOUTOFBAND_ERR_SETNEWDRIVERSTATE, - IDS_LLDBOUTOFBAND_ERR_BRKPT_CNT_EXCEEDED, - - IDS_DBGSESSION_ERR_SHARED_DATA_ADD, - - IDS_MI_SHTDWN_ERR_LOG, - IDS_MI_SHUTDOWN_ERR, - IDE_MI_SHTDWN_ERR_RESOURCES, - IDE_MI_SHTDWN_ERR_STREAMSTDIN, - IDS_MI_SHTDWN_ERR_OS_STDIN_HANDLER, - IDS_MI_SHTDWN_ERR_STREAMSTDOUT, - IDS_MI_SHTDWN_ERR_STREAMSTDERR, - IDS_MI_SHTDWN_ERR_THREADMGR, - IDS_MI_SHTDWN_ERR_CMDINTERPRETER, - IDS_MI_SHTDWN_ERR_CMDMGR, - IDS_MI_SHTDWN_ERR_CMDFACTORY, - IDS_MI_SHTDWN_ERR_CMDINVOKER, - IDS_MI_SHTDWN_ERR_CMDMONITOR, - IDS_MI_SHTDWN_ERR_LLDBDEBUGGER, - IDS_MI_SHTDWN_ERR_DRIVERMGR, - IDS_MI_SHTDWN_ERR_DRIVER, - IDS_MI_SHTDWN_ERR_OUTOFBANDHANDLER, - IDS_MI_SHTDWN_ERR_DEBUGSESSIONINFO, - IDE_MI_SHTDWN_ERR_THREADMANAGER, - - IDS_DRIVER_ERR_PARSE_ARGS, - IDS_DRIVER_ERR_PARSE_ARGS_UNKNOWN, - IDS_DRIVER_ERR_CURRENT_NOT_SET, - IDS_DRIVER_ERR_NON_REGISTERED, - IDS_DRIVER_SAY_DRIVER_USING, - IDS_DRIVER_ERR_ID_INVALID, - IDS_DRIVER_ERR_FALLTHRU_DRIVER_ERR, - IDS_DRIVER_CMD_RECEIVED, - IDS_DRIVER_CMD_NOT_IN_FACTORY, - IDS_DRIVER_ERR_DRIVER_STATE_ERROR, - IDS_DRIVER_ERR_MAINLOOP, - IDS_DRIVER_ERR_LOCAL_DEBUG_NOT_IMPL, - IDS_DRIVER_ERR_LOCAL_DEBUG_INIT, - - IDS_DRIVER_WAITING_STDIN_DATA, - - IDS_STDERR_ERR_NOT_ALL_DATA_WRITTEN, - - IDS_CMD_ARGS_ERR_OPTION_NOT_FOUND, - IDS_CMD_ARGS_ERR_VALIDATION_MANDATORY, - IDS_CMD_ARGS_ERR_VALIDATION_INVALID, - IDS_CMD_ARGS_ERR_VALIDATION_MAN_INVALID, - IDS_CMD_ARGS_ERR_VALIDATION_MISSING_INF, - IDS_CMD_ARGS_ERR_CONTEXT_NOT_ALL_EATTEN, - IDS_CMD_ARGS_ERR_PREFIX_MSG, - - IDS_VARIANT_ERR_USED_BASECLASS, - IDS_VARIANT_ERR_MAP_KEY_INVALID, - - IDS_WORD_INVALIDBRKTS, - IDS_WORD_NONE, - IDS_WORD_NOT, - IDS_WORD_INVALIDEMPTY, - IDS_WORD_INVALIDNULLPTR, - IDS_WORD_UNKNOWNBRKTS, - IDS_WORD_NOT_IMPLEMENTED, - IDS_WORD_NOT_IMPLEMENTED_BRKTS, - IDS_WORD_UNKNOWNTYPE_BRKTS, - IDS_WORD_ERR_MSG_NOT_IMPLEMENTED_BRKTS, - - IDS_CMD_ERR_N_OPTIONS_REQUIRED, - IDS_CMD_ERR_OPTION_NOT_FOUND, - IDS_CMD_ERR_ARGS, - IDS_CMD_WRN_ARGS_NOT_HANDLED, - IDS_CMD_ERR_FNFAILED, - IDS_CMD_ERR_SHARED_DATA_NOT_FOUND, - IDS_CMD_ERR_LLDBPROCESS_DETACH, - IDS_CMD_ERR_LLDBPROCESS_DESTROY, - IDS_CMD_ERR_SETWKDIR, - IDS_CMD_ERR_INVALID_TARGET, - IDS_CMD_ERR_INVALID_TARGET_CURRENT, - IDS_CMD_ERR_INVALID_TARGET_TYPE, - IDS_CMD_ERR_INVALID_TARGET_PLUGIN, - IDS_CMD_ERR_CONNECT_TO_TARGET, - IDS_CMD_ERR_INVALID_TARGETPLUGINCURRENT, - IDS_CMD_ERR_NOT_IMPLEMENTED, - IDS_CMD_ERR_NOT_IMPLEMENTED_DEPRECATED, - IDS_CMD_ERR_CREATE_TARGET, - IDS_CMD_ERR_BRKPT_LOCATION_FORMAT, - IDS_CMD_ERR_BRKPT_LOCATION_NOT_FOUND, - IDS_CMD_ERR_BRKPT_INVALID, - IDS_CMD_ERR_BRKPT_CNT_EXCEEDED, - IDS_CMD_ERR_SOME_ERROR, - IDS_CMD_ERR_THREAD_INVALID, - IDS_CMD_ERR_THREAD_FRAME_RANGE_INVALID, - IDS_CMD_ERR_FRAME_INVALID, - IDS_CMD_ERR_VARIABLE_DOESNOTEXIST, - IDS_CMD_ERR_VARIABLE_ENUM_INVALID, - IDS_CMD_ERR_VARIABLE_EXPRESSIONPATH, - IDS_CMD_ERR_VARIABLE_CREATION_FAILED, - IDS_CMD_ERR_VARIABLE_CHILD_RANGE_INVALID, - IDS_CMD_ERR_CMD_RUN_BUT_NO_ACTION, - IDS_CMD_ERR_EVENT_HANDLED_BUT_NO_ACTION, - IDS_CMD_ERR_DISASM_ADDR_START_INVALID, - IDS_CMD_ERR_DISASM_ADDR_END_INVALID, - IDS_CMD_ERR_MEMORY_ALLOC_FAILURE, - IDS_CMD_ERR_LLDB_ERR_NOT_READ_WHOLE_BLK, - IDS_CMD_ERR_LLDB_ERR_READ_MEM_BYTES, - IDS_CMD_ERR_INVALID_PROCESS, - IDS_CMD_ERR_INVALID_PRINT_VALUES, - IDS_CMD_ERR_INVALID_LOCATION_FORMAT, - IDS_CMD_ERR_INVALID_FORMAT_TYPE, - IDS_CMD_ERR_BRKPT_INFO_OBJ_NOT_FOUND, - IDS_CMD_ERR_LLDB_ERR_WRITE_MEM_BYTES, - IDS_CMD_ERR_LLDB_ERR_NOT_WRITE_WHOLEBLK, - IDS_CMD_ERR_SET_NEW_DRIVER_STATE, - IDS_CMD_ERR_INFO_PRINTFN_NOT_FOUND, - IDS_CMD_ERR_INFO_PRINTFN_FAILED, - IDS_CMD_ERR_GDBSET_OPT_TARGETASYNC, - IDS_CMD_ERR_GDBSET_OPT_BREAKPOINT, - IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH, - IDS_CMD_ERR_GDBSET_OPT_PRINT_BAD_ARGS, - IDS_CMD_ERR_GDBSET_OPT_PRINT_UNKNOWN_OPTION, - IDS_CMD_ERR_GDBSHOW_OPT_PRINT_BAD_ARGS, - IDS_CMD_ERR_GDBSHOW_OPT_PRINT_UNKNOWN_OPTION, - IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_BAD_ARGS, - IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_UNKNOWN_OPTION, - IDS_CMD_ERR_EXPR_INVALID, - IDS_CMD_ERR_ATTACH_FAILED, - IDS_CMD_ERR_ATTACH_BAD_ARGS -}; - -//++ -//============================================================================ -// Details: MI common code implementation class. Handle application resources -// and locality. -// Singleton class. -//-- -class CMICmnResources : public CMICmnBase, - public MI::ISingleton { - friend class MI::ISingleton; - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - - CMIUtilString GetString(const MIuint vResourceId) const; - bool HasString(const MIuint vResourceId) const; - - // Typedef: -private: - typedef std::map MapRscrIdToTextData_t; - typedef std::pair MapPairRscrIdToTextData_t; - - // Enumerations: -private: - enum Buffer_e { eBufferSize = 2048 }; - - // Structs: -private: - struct SRsrcTextData { - MIuint id; - const char *pTextData; - }; - - // Methods: -private: - /* ctor */ CMICmnResources(); - /* ctor */ CMICmnResources(const CMICmnResources &); - void operator=(const CMICmnResources &); - - bool GetStringFromResource(const MIuint vResourceId, - CMIUtilString &vrwResourceString) const; - bool ReadResourceStringData(); - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmnResources() override; - - // Attributes: -private: - static const SRsrcTextData ms_pResourceId2TextData[]; - // - MIuint m_nResourceId2TextDataSize; - MapRscrIdToTextData_t m_mapRscrIdToTextData; -}; - -//++ ========================================================================= -// Details: Macro short cut for retrieving a text data resource -//-- -#define MIRSRC(x) CMICmnResources::Instance().GetString(x).c_str() diff --git a/lldb/tools/lldb-mi/MICmnResources.cpp b/lldb/tools/lldb-mi/MICmnResources.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnResources.cpp +++ /dev/null @@ -1,619 +0,0 @@ -//===-- MICmnResources.cpp --------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers -#include "assert.h" -#include - -// In-house headers: -#include "MICmnResources.h" - -// Instantiations: -const CMICmnResources::SRsrcTextData - CMICmnResources::ms_pResourceId2TextData[] = { - {IDS_PROJNAME, - "LLDB Machine Interface Driver (MI) All rights reserved"}, - {IDS_MI_VERSION_DESCRIPTION_DEBUG, - "Version: 1.0.0.9 (Debug)"}, // See version history in MIDriverMain.cpp - {IDS_MI_VERSION_DESCRIPTION, "Version: 1.0.0.9"}, - {IDS_MI_APPNAME_SHORT, "MI"}, - {IDS_MI_APPNAME_LONG, "Machine Interface Driver"}, - {IDS_MI_APP_FILEPATHNAME, "Application: %s"}, - {IDS_MI_APP_ARGS, "Command line args: "}, - {IDE_MI_VERSION_GDB, "Version: GNU gdb (GDB) 7.4 \n(This is a MI stub " - "on top of LLDB and not GDB)\nAll rights " - "reserved.\n"}, // *** Eclipse needs this - // exactly!! - {IDS_UTIL_FILE_ERR_INVALID_PATHNAME, - "File Handler. Invalid file name path"}, - {IDS_UTIL_FILE_ERR_OPENING_FILE, "File Handler. Error %s opening '%s'"}, - {IDS_UTIL_FILE_ERR_OPENING_FILE_UNKNOWN, - "File Handler. Unknown error opening '%s'"}, - {IDE_UTIL_FILE_ERR_WRITING_FILE, "File Handler. Error %s writing '%s'"}, - {IDE_UTIL_FILE_ERR_WRITING_NOTOPEN, - "File Handler. File '%s' not open for write"}, - {IDS_RESOURCES_ERR_STRING_NOT_FOUND, - "Resources. String (%d) not found in resources"}, - {IDS_RESOURCES_ERR_STRING_TABLE_INVALID, - "Resources. String resource table is not set up"}, - {IDS_MI_CLIENT_MSG, "Client message: \"%s\""}, - {IDS_LOG_MSG_CREATION_DATE, "Creation date %s time %s%s"}, - {IDS_LOG_MSG_FILE_LOGGER_PATH, "File logger path: %s%s"}, - {IDS_LOG_MSG_VERSION, "Version: %s%s"}, - {IDS_LOG_ERR_FILE_LOGGER_DISABLED, - "Log. File logger temporarily disabled due to file error '%s'"}, - {IDS_LOG_MEDIUM_ERR_INIT, "Log. Medium '%s' initialise failed. %s"}, - {IDS_LOG_MEDIUM_ERR_WRITE_ANY, - "Log. Failed to write log data to any medium."}, - {IDS_LOG_MEDIUM_ERR_WRITE_MEDIUMFAIL, - "Log. One or mediums failed writing log data."}, - {IDS_MEDIUMFILE_NAME, "File"}, - {IDS_MEDIUMFILE_ERR_INVALID_PATH, ""}, - {IDS_MEDIUMFILE_ERR_FILE_HEADER, ""}, - {IDS_MEDIUMFILE_NAME_LOG, "File medium. %s"}, - {IDE_OS_ERR_UNKNOWN, "Unknown OS error"}, - {IDE_OS_ERR_RETRIEVING, "Unabled to retrieve OS error message"}, - {IDS_DRIVERMGR_DRIVER_ERR_INIT, - "Driver Manager. Driver '%s' (ID:'%s') initialise failed. %s"}, - {IDE_MEDIUMSTDERR_NAME, "Stderr"}, - {IDE_MEDIUMSTDOUT_NAME, "Stdout"}, - {IDE_MI_APP_DESCRIPTION, - "Description:\nThe Machine Interface Driver (MI Driver) is a stand " - "alone executable\nthat either be used via " - "a client i.e. Eclipse or directly from the command\nline. It " - "processes MI commands, actions those commands " - "using the internal\ndebugger then forms MI response formatted text " - "which is returned to the\nclient."}, - {IDE_MI_APP_INFORMATION, - "Information:\nCurrent limitations. The MI Driver currently only " - "handles remote target\ndebugging. Local " - "debugging has not been implemented. The MI Driver has\nbeen designed " - "primarily to be used with Eclipse Juno " - "and a custom plugin.\nThe custom plugin is not necessary to operate " - "the MI Driver."}, - {IDE_MI_APP_ARG_USAGE, "\nMI driver usage:\n\n\tlldb-mi [--longOption] " - "[-s hortOption] [executable]\n\n[] = optional " - "argument."}, - {IDE_MI_APP_ARG_HELP, "-h\n--help\n\tPrints out usage information for " - "the MI debugger. Exit the MI\n\tDriver " - "immediately."}, - {IDE_MI_APP_ARG_VERSION, "--version\n\tPrints out GNU (gdb) version " - "information. Exit the MI " - "Driver\n\timmediately."}, - {IDE_MI_APP_ARG_VERSION_LONG, "--versionLong\n\tPrints out MI Driver " - "version information. Exit the MI " - "Driver\n\timmediately."}, - {IDE_MI_APP_ARG_INTERPRETER, "--interpreter\n\t This option is kept " - "for backward compatibility. This " - "executable always run in MI mode"}, - {IDE_MI_APP_ARG_EXECUTEABLE, "--executable\n\tUse the MI Driver in MI " - "mode for the debugging the specified " - "executable."}, - {IDE_MI_APP_ARG_SOURCE, "-s \n--source \n\t" - "Tells the debugger to read in and execute the " - "lldb commands in the\n\t" - "given file, after any file provided on the " - "command line has been\n\tloaded."}, - {IDE_MI_APP_ARG_APP_LOG, "--log\n\tUse this argument to tell the MI " - "Driver to update it's log\n\tfile '%s'."}, - {IDE_MI_APP_ARG_APP_LOG_DIR, - "--log-dir\n\tUse this argument to specify the directory the MI " - "Driver\n\twill place the log file in, i.e --log-dir=/tmp."}, - {IDE_MI_APP_ARG_EXAMPLE, "Example MI command:\n\t3-info-gdb-mi-command " - "gdb-set\n\t3^done,command={exists=\"true\"}"}, - {IDE_MI_APP_ARG_EXECUTABLE, "executable (NOT IMPLEMENTED)\n\tThe file " - "path to the executable i.e. '\"C:\\My " - "Dev\\foo.exe\"'."}, - {IDE_MI_APP_ARG_SYNCHRONOUS, "--synchronous\n\tBlock until each command " - "has finished executing.\n\tUsed for testing only."}, - {IDS_STDIN_ERR_INVALID_PROMPT, - "Stdin. Invalid prompt description '%s'"}, - {IDS_STDIN_ERR_THREAD_CREATION_FAILED, - "Stdin. Thread creation failed '%s'"}, - {IDS_STDIN_ERR_THREAD_DELETE, "Stdin. Thread failed to delete '%s'"}, - {IDS_STDIN_ERR_CHKING_BYTE_AVAILABLE, - "Stdin. Peeking on stdin stream '%s'"}, - {IDS_STDIN_INPUT_CTRL_CHARS, - "Stdin. Receive characters not handled as a command: "}, - {IDS_CMD_QUIT_HELP, - "MI Driver Command: quit\n\tExit the MI Driver application."}, - {IDS_THREADMGR_ERR_THREAD_ID_INVALID, - "Thread Mgr. Thread ID '%s' is not valid"}, - {IDS_THREADMGR_ERR_THREAD_FAIL_CREATE, - "Thread Mgr: Failed to create thread '%s'"}, - {IDS_THREADMGR_ERR_THREAD_ID_NOT_FOUND, - "Thread Mgr: Thread with ID '%s' not found"}, - {IDS_THREADMGR_ERR_THREAD_STILL_ALIVE, "Thread Mgr: The thread(s) are " - "still alive at Thread Mgr " - "shutdown: %s"}, - {IDS_FALLTHRU_DRIVER_CMD_RECEIVED, - "Fall Thru Driver. Received command '%s'. Is was %shandled"}, - {IDS_CMDFACTORY_ERR_INVALID_CMD_NAME, - "Command factory. MI command name '%s' is invalid"}, - {IDS_CMDFACTORY_ERR_INVALID_CMD_CR8FN, - "Command factory. Command creation function invalid for command '%s'. " - "Does function exist? Pointer assigned to it?"}, - {IDS_CMDFACTORY_ERR_CMD_NOT_REGISTERED, - "Command factory. Command '%s' not registered"}, - {IDS_CMDFACTORY_ERR_CMD_ALREADY_REGED, - "Command factory. Command '%s' by that name already registered"}, - {IDS_CMDMGR_ERR_CMD_FAILED_CREATE, - "Command manager. Command creation failed. %s"}, - {IDS_CMDMGR_ERR_CMD_INVOKER, "Command manager. %s "}, - {IDS_MI_INIT_ERR_LOG, "Log. Error occurred during initialisation %s"}, - {IDS_MI_INIT_ERR_RESOURCES, - "Resources. Error occurred during initialisation %s"}, - {IDS_MI_INIT_ERR_INIT, - "Driver. Error occurred during initialisation %s"}, - {IDS_MI_INIT_ERR_STREAMSTDIN, - "Stdin. Error occurred during initialisation %s"}, - {IDS_MI_INIT_ERR_STREAMSTDIN_OSHANDLER, "Stdin. The OS specific stdin " - "stream handler has not been " - "specified for this OS"}, - {IDS_MI_INIT_ERR_OS_STDIN_HANDLER, - "Stdin handler. Error occurred during initialisation %s"}, - {IDS_MI_INIT_ERR_STREAMSTDOUT, - "Stdout. Error occurred during initialisation %s"}, - {IDS_MI_INIT_ERR_STREAMSTDERR, - "Stderr. Error occurred during initialisation %s"}, - {IDS_MI_INIT_ERR_FALLTHRUDRIVER, - "Fall Through Driver. Error occurred during initialisation %s"}, - {IDS_MI_INIT_ERR_THREADMGR, - "Thread Mgr. Error occurred during initialisation %s"}, - {IDS_MI_INIT_ERR_CMDINTERPRETER, "Command interpreter. %s"}, - {IDS_MI_INIT_ERR_CMDMGR, "Command manager. %s"}, - {IDS_MI_INIT_ERR_CMDFACTORY, "Command factory. %s"}, - {IDS_MI_INIT_ERR_CMDINVOKER, "Command invoker. %s"}, - {IDS_MI_INIT_ERR_CMDMONITOR, "Command monitor. %s"}, - {IDS_MI_INIT_ERR_LLDBDEBUGGER, "LLDB Debugger. %s"}, - {IDS_MI_INIT_ERR_DRIVERMGR, "Driver manager. %s"}, - {IDS_MI_INIT_ERR_DRIVER, "Driver. %s"}, - {IDS_MI_INIT_ERR_OUTOFBANDHANDLER, "Out-of-band handler. %s "}, - {IDS_MI_INIT_ERR_DEBUGSESSIONINFO, "LLDB debug session info. %s "}, - {IDS_MI_INIT_ERR_THREADMANAGER, "Unable to init thread manager."}, - {IDS_MI_INIT_ERR_CLIENT_USING_DRIVER, - "Initialising the client to this driver failed."}, - {IDS_MI_INIT_ERR_LOCAL_DEBUG_SESSION, - "Initialising a local debug session failed."}, - {IDS_CODE_ERR_INVALID_PARAMETER_VALUE, - "Code. Invalid parameter passed to function '%s'"}, - {IDS_CODE_ERR_INVALID_PARAM_NULL_POINTER, - "Code. NULL pointer passes as a parameter to function '%s'"}, - {IDS_CODE_ERR_INVALID_ENUMERATION_VALUE, - "Code. Invalid enumeration value encountered in function '%s'"}, - { - IDS_LLDBDEBUGGER_ERR_INVALIDLISTENER, - "LLDB Debugger. LLDB Listener is not valid", - }, - { - IDS_LLDBDEBUGGER_ERR_INVALIDDEBUGGER, - "LLDB Debugger. LLDB Debugger is not valid", - }, - {IDS_LLDBDEBUGGER_ERR_CLIENTDRIVER, - "LLDB Debugger. CMIDriverBase derived driver needs to be set prior to " - "CMICmnLLDBDDebugger initialisation"}, - {IDS_LLDBDEBUGGER_ERR_STARTLISTENER, - "LLDB Debugger. Starting listening events for '%s' failed"}, - {IDS_LLDBDEBUGGER_ERR_THREADCREATIONFAIL, - "LLDB Debugger. Thread creation failed '%s'"}, - {IDS_LLDBDEBUGGER_ERR_THREAD_DELETE, - "LLDB Debugger. Thread failed to delete '%s'"}, - {IDS_LLDBDEBUGGER_ERR_INVALIDBROADCASTER, - "LLDB Debugger. Invalid SB broadcaster class name '%s' "}, - {IDS_LLDBDEBUGGER_ERR_INVALIDCLIENTNAME, - "LLDB Debugger. Invalid client name '%s' "}, - {IDS_LLDBDEBUGGER_ERR_CLIENTNOTREGISTERED, - "LLDB Debugger. Client name '%s' not registered for listening events"}, - {IDS_LLDBDEBUGGER_ERR_STOPLISTENER, "LLDB Debugger. Failure occurred " - "stopping event for client '%s' " - "SBBroadcaster '%s'"}, - {IDS_LLDBDEBUGGER_ERR_BROADCASTER_NAME, - "LLDB Debugger. Broadcaster's name '%s' is not valid"}, - {IDS_LLDBDEBUGGER_WRN_UNKNOWN_EVENT, - "LLDB Debugger. Unhandled event '%s'"}, - {IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT, - "LLDB Out-of-band. Handling event for '%s', an event enumeration '%d' " - "not recognised"}, - {IDS_LLDBOUTOFBAND_ERR_PROCESS_INVALID, - "LLDB Out-of-band. Invalid '%s' in '%s'"}, - {IDS_LLDBOUTOFBAND_ERR_BRKPT_NOTFOUND, "LLDB Out-of-band. %s. " - "Breakpoint information for " - "breakpoint ID %d not found"}, - {IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_GET, - "LLDB Out-of-band. %s. Failed to retrieve breakpoint information for " - "for breakpoint ID %d"}, - {IDS_LLDBOUTOFBAND_ERR_BRKPT_INFO_SET, "LLDB Out-of-band. %s. Failed " - "to set breakpoint information " - "for for breakpoint ID %d"}, - {IDS_LLDBOUTOFBAND_ERR_FORM_MI_RESPONSE, - "LLDB Out-of-band. %s. Failed to form the MI Out-of-band response"}, - {IDS_LLDBOUTOFBAND_ERR_FRAME_INFO_GET, - "LLDB Out-of-band. %s. Failed to retrieve frame information"}, - {IDS_LLDBOUTOFBAND_ERR_SETNEWDRIVERSTATE, - "LLDB Out-of-band. %s. Event handler tried to set new MI Driver " - "running state and failed. %s"}, - {IDS_LLDBOUTOFBAND_ERR_BRKPT_CNT_EXCEEDED, - "LLDB Out-of-band. '%s'. Number of valid breakpoint exceeded %d. " - "Cannot create new breakpoint with ID %d"}, - {IDS_DBGSESSION_ERR_SHARED_DATA_ADD, "LLDB debug session info. Failed " - "to add '%s' data to the shared " - "data command container"}, - {IDS_MI_SHTDWN_ERR_LOG, "Log. Error occurred during shutdown. %s"}, - {IDS_MI_SHUTDOWN_ERR, "Server shutdown failure. %s"}, - {IDE_MI_SHTDWN_ERR_RESOURCES, - "Resources. Error occurred during shutdown. %s"}, - {IDE_MI_SHTDWN_ERR_STREAMSTDIN, - "Stdin. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_OS_STDIN_HANDLER, - "Stdin handler. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_STREAMSTDOUT, - "Stdout. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_STREAMSTDERR, - "Stderr. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_THREADMGR, - "Thread Mgr. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_CMDINTERPRETER, - "Command interpreter. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_CMDMGR, - "Command manager. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_CMDFACTORY, - "Command factory. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_CMDMONITOR, - "Command invoker. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_CMDINVOKER, - "Command monitor. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_LLDBDEBUGGER, - "LLDB Debugger. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_DRIVERMGR, - "Driver manager. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_DRIVER, - "Driver. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_OUTOFBANDHANDLER, - "Out-of-band handler. Error occurred during shutdown. %s"}, - {IDS_MI_SHTDWN_ERR_DEBUGSESSIONINFO, - "LLDB debug session info. Error occurred during shutdown. %s"}, - {IDE_MI_SHTDWN_ERR_THREADMANAGER, "Unable to shutdown thread manager"}, - {IDS_DRIVER_ERR_PARSE_ARGS, - "Driver. Driver '%s'. Parse args error '%s'"}, - {IDS_DRIVER_ERR_PARSE_ARGS_UNKNOWN, - "Driver. Driver '%s'. Parse args error unknown"}, - {IDS_DRIVER_ERR_CURRENT_NOT_SET, - "Driver. Current working driver has not been set. Call " - "CMIDriverMgr::SetUseThisDriverToDoWork()"}, - {IDS_DRIVER_ERR_NON_REGISTERED, "Driver. No suitable drivers " - "registered with the CMIDriverMgr to " - "do work"}, - {IDS_DRIVER_SAY_DRIVER_USING, "Driver. Using driver '%s' internally"}, - {IDS_DRIVER_ERR_ID_INVALID, "Driver. Driver '%s' invalid ID '%s'"}, - {IDS_DRIVER_ERR_FALLTHRU_DRIVER_ERR, - "Driver. Fall through driver '%s' (ID:'%s') error '%s'"}, - {IDS_DRIVER_CMD_RECEIVED, - "Driver. Received command '%s'. It was %shandled%s"}, - {IDS_DRIVER_CMD_NOT_IN_FACTORY, - ". Command '%s' not in Command Factory"}, - { - IDS_DRIVER_ERR_DRIVER_STATE_ERROR, - "Driver. Driver running state error. Cannot go to next state from " - "present state as not allowed", - }, - {IDS_DRIVER_WAITING_STDIN_DATA, "Driver. Main thread suspended waiting " - "on Stdin Monitor to resume main " - "thread"}, - {IDS_DRIVER_ERR_MAINLOOP, "Driver. Error in do main loop. %s"}, - {IDS_DRIVER_ERR_LOCAL_DEBUG_NOT_IMPL, "Driver. --executable argument " - "given. Local debugging is not " - "implemented."}, - {IDS_DRIVER_ERR_LOCAL_DEBUG_INIT, "Driver. --executable argument " - "given. Initialising local debugging " - "failed."}, - {IDS_STDERR_ERR_NOT_ALL_DATA_WRITTEN, - "Stderr. Not all data was written to stream. The data '%s'"}, - {IDS_CMD_ARGS_ERR_OPTION_NOT_FOUND, - "Command Args. Option '%s' not found"}, - {IDS_CMD_ARGS_ERR_VALIDATION_MANDATORY, "Mandatory args not found: %s"}, - {IDS_CMD_ARGS_ERR_VALIDATION_INVALID, "Invalid args: %s"}, - {IDS_CMD_ARGS_ERR_VALIDATION_MAN_INVALID, - "Mandatory args not found: %s. Invalid args: %s"}, - {IDS_CMD_ARGS_ERR_VALIDATION_MISSING_INF, - "Args missing additional information: %s"}, - {IDS_CMD_ARGS_ERR_CONTEXT_NOT_ALL_EATTEN, - "Not all arguments or options were recognised: %s"}, - {IDS_CMD_ARGS_ERR_PREFIX_MSG, "Command Args. Validation failed. "}, - {IDS_VARIANT_ERR_USED_BASECLASS, "Variant container: Variant object " - "used the base class. See " - "CMIUtilVariant"}, - {IDS_VARIANT_ERR_MAP_KEY_INVALID, "Variant container: Invalid ID '%s'"}, - {IDS_WORD_INVALIDBRKTS, ""}, - {IDS_WORD_NONE, "None"}, - {IDS_WORD_NOT, "not"}, - {IDS_WORD_INVALIDEMPTY, ""}, - {IDS_WORD_INVALIDNULLPTR, ""}, - {IDS_WORD_UNKNOWNBRKTS, ""}, - {IDS_WORD_NOT_IMPLEMENTED, "Not implemented"}, - {IDS_WORD_NOT_IMPLEMENTED_BRKTS, ""}, - {IDS_WORD_UNKNOWNTYPE_BRKTS, ""}, - {IDS_WORD_ERR_MSG_NOT_IMPLEMENTED_BRKTS, - ""}, - {IDS_CMD_ERR_N_OPTIONS_REQUIRED, - "Command '%s'. Missing options, %d required"}, - {IDS_CMD_ERR_OPTION_NOT_FOUND, "Command '%s'. Option '%s' not found"}, - {IDS_CMD_ERR_ARGS, "Command '%s'. %s"}, - {IDS_CMD_WRN_ARGS_NOT_HANDLED, "Command '%s'. Warning the following " - "options not handled by the command: " - "%s"}, - {IDS_CMD_ERR_FNFAILED, "Command '%s'. Fn '%s' failed"}, - {IDS_CMD_ERR_SHARED_DATA_NOT_FOUND, - "Command '%s'. Shared data '%s' not found"}, - {IDS_CMD_ERR_LLDBPROCESS_DETACH, - "Command '%s'. Process detach failed. '%s'"}, - {IDS_CMD_ERR_LLDBPROCESS_DESTROY, - "Command '%s'. Process destroy failed. '%s'"}, - {IDS_CMD_ERR_SETWKDIR, - "Command '%s'. Failed to set working directory '%s'"}, - {IDS_CMD_ERR_INVALID_TARGET, - "Command '%s'. Target binary '%s' is invalid. %s"}, - {IDS_CMD_ERR_INVALID_TARGET_CURRENT, - "Command '%s'. Current SBTarget is invalid"}, - {IDS_CMD_ERR_INVALID_TARGET_TYPE, - "Command '%s'. Target type '%s' is not recognised"}, - {IDS_CMD_ERR_INVALID_TARGET_PLUGIN, - "Command '%s'. Target plugin is invalid. %s"}, - {IDS_CMD_ERR_CONNECT_TO_TARGET, - "Command '%s'. Error connecting to target: '%s'"}, - {IDS_CMD_ERR_INVALID_TARGETPLUGINCURRENT, - "Command '%s'. Current target plugin is invalid"}, - {IDS_CMD_ERR_NOT_IMPLEMENTED, "Command '%s'. Command not implemented"}, - {IDS_CMD_ERR_NOT_IMPLEMENTED_DEPRECATED, - "Command '%s'. Command not implemented as it has been deprecated"}, - {IDS_CMD_ERR_CREATE_TARGET, "Command '%s'. Create target failed: %s"}, - {IDS_CMD_ERR_BRKPT_LOCATION_FORMAT, - "Command '%s'. Incorrect format for breakpoint location '%s'"}, - {IDS_CMD_ERR_BRKPT_LOCATION_NOT_FOUND, - "Command '%s'. Breakpoint location '%s' not found"}, - {IDS_CMD_ERR_BRKPT_INVALID, "Command '%s'. Breakpoint '%s' invalid"}, - {IDS_CMD_ERR_BRKPT_CNT_EXCEEDED, "Command '%s'. Number of valid " - "breakpoint exceeded %d. Cannot " - "create new breakpoint '%s'"}, - {IDS_CMD_ERR_SOME_ERROR, "Command '%s'. Error: %s"}, - {IDS_CMD_ERR_THREAD_INVALID, "Command '%s'. Thread ID invalid"}, - {IDS_CMD_ERR_THREAD_FRAME_RANGE_INVALID, - "Command '%s'. Thread frame range invalid"}, - {IDS_CMD_ERR_FRAME_INVALID, "Command '%s'. Frame ID invalid"}, - {IDS_CMD_ERR_VARIABLE_DOESNOTEXIST, - "Command '%s'. Variable '%s' does not exist"}, - {IDS_CMD_ERR_VARIABLE_ENUM_INVALID, "Command '%s'. Invalid enumeration " - "for variable '%s' formatted " - "string '%s'"}, - {IDS_CMD_ERR_VARIABLE_EXPRESSIONPATH, - "Command '%s'. Failed to get expression for variable '%s'"}, - {IDS_CMD_ERR_VARIABLE_CREATION_FAILED, - "Failed to create variable object for '%s'"}, - {IDS_CMD_ERR_VARIABLE_CHILD_RANGE_INVALID, - "Command '%s'. Variable children range invalid"}, - {IDS_CMD_ERR_CMD_RUN_BUT_NO_ACTION, ""}, - {IDS_CMD_ERR_EVENT_HANDLED_BUT_NO_ACTION, - ""}, - {IDS_CMD_ERR_DISASM_ADDR_START_INVALID, - "Command '%s'. Invalid start value '%s'"}, - {IDS_CMD_ERR_DISASM_ADDR_END_INVALID, - "Command '%s'. Invalid end value '%s'"}, - {IDS_CMD_ERR_MEMORY_ALLOC_FAILURE, - "Command '%s'. Failed to allocate memory %d bytes"}, - {IDS_CMD_ERR_LLDB_ERR_NOT_READ_WHOLE_BLK, - "Command '%s'. LLDB unable to read entire memory block of %u bytes at " - "address 0x%016" PRIx64}, - {IDS_CMD_ERR_LLDB_ERR_READ_MEM_BYTES, "Command '%s'. Unable to read " - "memory block of %u bytes at " - "address 0x%016" PRIx64 ": %s "}, - {IDS_CMD_ERR_INVALID_PROCESS, - "Command '%s'. Invalid process during debug session"}, - {IDS_CMD_ERR_INVALID_PRINT_VALUES, - "Command '%s'. Unknown value for PRINT_VALUES: must be: 0 or " - "\"--no-values\", 1 or \"--all-values\", 2 or \"--simple-values\""}, - {IDS_CMD_ERR_INVALID_LOCATION_FORMAT, - "Command '%s'. Invalid location format '%s'"}, - {IDS_CMD_ERR_INVALID_FORMAT_TYPE, - "Command '%s'. Invalid var format type '%s'"}, - {IDS_CMD_ERR_BRKPT_INFO_OBJ_NOT_FOUND, - "Command '%s'. Breakpoint information for breakpoint ID %d not found"}, - {IDS_CMD_ERR_LLDB_ERR_WRITE_MEM_BYTES, "Command '%s'. Unable to write " - "memory block of %u bytes at " - "address 0x%016" PRIx64 ": %s "}, - {IDS_CMD_ERR_LLDB_ERR_NOT_WRITE_WHOLEBLK, - "Command '%s'. LLDB unable to write entire memory block of %u bytes " - "at address 0x%016" PRIX64}, - {IDS_CMD_ERR_SET_NEW_DRIVER_STATE, "Command '%s'. Command tried to set " - "new MI Driver running state and " - "failed. %s"}, - {IDS_CMD_ERR_INFO_PRINTFN_NOT_FOUND, - "The request '%s' was not recognised, not implemented"}, - {IDS_CMD_ERR_INFO_PRINTFN_FAILED, "The request '%s' failed."}, - {IDS_CMD_ERR_GDBSET_OPT_TARGETASYNC, - "'target-async' expects \"on\" or \"off\""}, - {IDS_CMD_ERR_GDBSET_OPT_BREAKPOINT, - "'breakpoint' expects \"pending on\" or \"pending off\""}, - {IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH, - "'solib-search-path' requires at least one argument"}, - {IDS_CMD_ERR_GDBSET_OPT_PRINT_BAD_ARGS, - "'print' expects option-name and \"on\" or \"off\""}, - {IDS_CMD_ERR_GDBSET_OPT_PRINT_UNKNOWN_OPTION, - "'print' error. The option '%s' not found"}, - {IDS_CMD_ERR_GDBSHOW_OPT_PRINT_BAD_ARGS, - "'print' expects option-name and \"on\" or \"off\""}, - {IDS_CMD_ERR_GDBSHOW_OPT_PRINT_UNKNOWN_OPTION, - "'print' error. The option '%s' not found"}, - {IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_BAD_ARGS, - "'breakpoint' expects option-name"}, - {IDS_CMD_ERR_GDBSHOW_OPT_BREAKPOINT_UNKNOWN_OPTION, - "'breakpoint' error. The option '%s' not found"}, - {IDS_CMD_ERR_EXPR_INVALID, "Failed to evaluate expression: %s"}, - {IDS_CMD_ERR_ATTACH_FAILED, - "Command '%s'. Attach to process failed: %s"}, - {IDS_CMD_ERR_ATTACH_BAD_ARGS, - "Command '%s'. Must specify either a PID or a Name"}}; - -//++ -// Details: CMICmnResources constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnResources::CMICmnResources() : m_nResourceId2TextDataSize(0) { - // Do not use this constructor, use Initialize() -} - -//++ -// Details: CMICmnResources destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnResources::~CMICmnResources() { - // Do not use this destructor, use Shutdown() -} - -//++ -// Details: Initialize the resources and set locality for the server. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnResources::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - m_bInitialized = ReadResourceStringData(); - - return m_bInitialized; -} - -//++ -// Details: Release resources for *this object. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnResources::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - // Tear down resource explicitly - m_mapRscrIdToTextData.clear(); - - m_bInitialized = false; - - return MIstatus::success; -} - -//++ -// Details: Initialize the resources and set locality for the server. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnResources::ReadResourceStringData() { - m_nResourceId2TextDataSize = - sizeof ms_pResourceId2TextData / sizeof ms_pResourceId2TextData[0]; - for (MIuint i = 0; i < m_nResourceId2TextDataSize; i++) { - const SRsrcTextData *pRscrData = &ms_pResourceId2TextData[i]; - MapPairRscrIdToTextData_t pr(pRscrData->id, pRscrData->pTextData); - m_mapRscrIdToTextData.insert(pr); - } - - return MIstatus::success; -} - -//++ -// Details: Retrieve the corresponding text assigned to the resource ID. -// Type: Method. -// Args: vResourceId - (R) MI resource ID. -// Return: CMIUtilString - Resource text. -// Throws: None. -//-- -CMIUtilString CMICmnResources::GetString(const MIuint vResourceId) const { - CMIUtilString str; - const bool bFound = GetStringFromResource(vResourceId, str); - MIunused(bFound); - assert(bFound); - - return str; -} - -//++ -// Details: Determine the MI resource ID existings. -// Type: Method. -// Args: vResourceId - (R) MI resource ID. -// Return: True - Exists. -// False - Not found. -// Throws: None. -//-- -bool CMICmnResources::HasString(const MIuint vResourceId) const { - CMIUtilString str; - return GetStringFromResource(vResourceId, str); -} - -//++ -// Details: Retrieve the resource text data for the given resource ID. If a -// resource ID -// cannot be found and error is given returning the ID of the resource -// that -// cannot be located. -// Type: Method. -// Args: vResourceId - (R) MI resource ID. -// vrwResourceString - (W) Text. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnResources::GetStringFromResource( - const MIuint vResourceId, CMIUtilString &vrwResourceString) const { - MapRscrIdToTextData_t::const_iterator it = - m_mapRscrIdToTextData.find(vResourceId); - if (it == m_mapRscrIdToTextData.end()) { - // Check this is a static variable init that needs this before we are ready - if (!m_bInitialized) { - (const_cast(this))->Initialize(); - it = m_mapRscrIdToTextData.find(vResourceId); - if (it == m_mapRscrIdToTextData.end()) { - vrwResourceString = MIRSRC(IDS_RESOURCES_ERR_STRING_TABLE_INVALID); - return MIstatus::failure; - } - } - - if (it == m_mapRscrIdToTextData.end()) { - vrwResourceString = CMIUtilString::Format( - MIRSRC(IDS_RESOURCES_ERR_STRING_NOT_FOUND), vResourceId); - return MIstatus::failure; - } - } - - const MIuint nRsrcId((*it).first); - MIunused(nRsrcId); - const char *pRsrcData((*it).second); - - // Return result - vrwResourceString = pRsrcData; - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MICmnStreamStderr.h b/lldb/tools/lldb-mi/MICmnStreamStderr.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnStreamStderr.h +++ /dev/null @@ -1,61 +0,0 @@ -//===-- MICmnStreamStderr.h -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" -#include "MIUtilString.h" -#include "MIUtilThreadBaseStd.h" - -//++ -//============================================================================ -// Details: MI common code class. The MI driver requires this object. -// CMICmnStreamStderr sets up and tears downs stderr for the driver. -// -// Singleton class. -//-- -class CMICmnStreamStderr : public CMICmnBase, - public MI::ISingleton { - friend class MI::ISingleton; - - // Statics: -public: - static bool TextToStderr(const CMIUtilString &vrTxt); - static bool LLDBMsgToConsole(const CMIUtilString &vrTxt); - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - // - bool Lock(); - bool Unlock(); - bool Write(const CMIUtilString &vText, const bool vbSendToLog = true); - bool WriteLLDBMsg(const CMIUtilString &vText, const bool vbSendToLog = true); - - // Methods: -private: - /* ctor */ CMICmnStreamStderr(); - /* ctor */ CMICmnStreamStderr(const CMICmnStreamStderr &); - void operator=(const CMICmnStreamStderr &); - // - bool WritePriv(const CMIUtilString &vText, - const CMIUtilString &vTxtForLogFile, - const bool vbSendToLog = true); - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmnStreamStderr() override; - - // Attributes: -private: - CMIUtilThreadMutex m_mutex; // Mutex object for sync during Write() -}; diff --git a/lldb/tools/lldb-mi/MICmnStreamStderr.cpp b/lldb/tools/lldb-mi/MICmnStreamStderr.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnStreamStderr.cpp +++ /dev/null @@ -1,249 +0,0 @@ -//===-- MICmnStreamStderr.cpp ------------------------------------*- C++ -//-*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnStreamStderr.h" -#include "MICmnLog.h" -#include "MICmnResources.h" -#include "MIDriver.h" - -//++ -// Details: CMICmnStreamStderr constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnStreamStderr::CMICmnStreamStderr() {} - -//++ -// Details: CMICmnStreamStderr destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnStreamStderr::~CMICmnStreamStderr() { Shutdown(); } - -//++ -// Details: Initialize resources for *this stderr stream. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStderr::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - bool bOk = MIstatus::success; - -#ifdef _MSC_VER -// Debugging / I/O issues with client. -// This is only required on Windows if you do not use ::flush(stderr). MI uses -// ::flush(stderr) -// It trys to ensure the process attached to the stderr steam gets ALL the data. -//::setbuf( stderr, NULL ); -#endif // _MSC_VER - - m_bInitialized = bOk; - - return MIstatus::success; -} - -//++ -// Details: Release resources for *this stderr stream. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStderr::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - ClrErrorDescription(); - - m_bInitialized = false; - - return MIstatus::success; -} - -//++ -// Details: Write text data to stderr. Prefix the message with "MI:". The text -// data does -// not need to include a carriage line return as this is added to the -// text. The -// function also then passes the text data into the CMICmnLog logger. -// Type: Method. -// Args: vText - (R) Text data. -// vbSendToLog - (R) True = Yes send to the Log file too, false = do -// not. (Dflt = true) -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStderr::Write(const CMIUtilString &vText, - const bool vbSendToLog /* = true */) { - if (vText.length() == 0) - return MIstatus::failure; - - const CMIUtilString strPrefixed(CMIUtilString::Format( - "%s: %s", CMIDriver::Instance().GetAppNameShort().c_str(), - vText.c_str())); - - return WritePriv(strPrefixed, vText, vbSendToLog); -} - -//++ -// Details: Write an LLDB text message to stderr. -// The text data does not need to include a carriage line return as -// this is added -// to the text. The function also then passes the text data into the -// CMICmnLog -// logger. -// Type: Method. -// Args: vText - (R) Text data. -// vbSendToLog - (R) True = Yes send to the Log file too, false = do -// not. (Dflt = true) -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStderr::WriteLLDBMsg(const CMIUtilString &vText, - const bool vbSendToLog /* = true */) { - if (vText.length() == 0) - return MIstatus::failure; - - const CMIUtilString strPrefixed( - CMIUtilString::Format("LLDB: %s", vText.c_str())); - - return WritePriv(vText, strPrefixed, vbSendToLog); -} - -//++ -// Details: Write text data to stderr. The text data does not need to -// include a carriage line return as this is added to the text. The -// function also -// then passes the text data into the CMICmnLog logger. -// Type: Method. -// Args: vText - (R) Text data. May be prefixed with MI app's short -// name. -// vTxtForLogFile - (R) Text data. -// vbSendToLog - (R) True = Yes send to the Log file too, false = -// do not. (Dflt = true) -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStderr::WritePriv(const CMIUtilString &vText, - const CMIUtilString &vTxtForLogFile, - const bool vbSendToLog /* = true */) { - if (vText.length() == 0) - return MIstatus::failure; - - bool bOk = MIstatus::success; - { - // Grab the stderr thread lock while we print - CMIUtilThreadLock _lock(m_mutex); - - // Send this text to stderr - const MIint status = ::fputs(vText.c_str(), stderr); - if (status == EOF) { - const CMIUtilString errMsg(CMIUtilString::Format( - MIRSRC(IDS_STDERR_ERR_NOT_ALL_DATA_WRITTEN), vText.c_str())); - SetErrorDescription(errMsg); - bOk = MIstatus::failure; - } else { - ::fprintf(stderr, "\n"); - ::fflush(stderr); - } - - // Send this text to the log - if (bOk && vbSendToLog) - bOk &= m_pLog->WriteLog(vTxtForLogFile); - } - - return bOk; -} - -//++ -// Details: Lock the availability of the stream stderr. Other users of *this -// stream will -// be stalled until it is available (Unlock()). -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStderr::Lock() { - m_mutex.Lock(); - return MIstatus::success; -} - -//++ -// Details: Release a previously locked stderr. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStderr::Unlock() { - m_mutex.Unlock(); - return MIstatus::success; -} - -//++ -// Details: Take MI Driver text message and send to the stderr stream. Also -// output to the -// MI Log file. -// Type: Static method. -// Args: vrTxt - (R) Text. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnStreamStderr::TextToStderr(const CMIUtilString &vrTxt) { - const bool bLock = CMICmnStreamStderr::Instance().Lock(); - const bool bOk = bLock && CMICmnStreamStderr::Instance().Write(vrTxt); - bLock &&CMICmnStreamStderr::Instance().Unlock(); - - return bOk; -} - -//++ -// Details: Take an LLDB message and send to the stderr stream. The message is -// not always -// an error message. The user has typed a command in to the Eclipse -// console (by- -// passing Eclipse) and this is the result message from LLDB back to -// the user. -// Also output to the MI Log file. -// Type: Static method. -// Args: vrTxt - (R) Text. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnStreamStderr::LLDBMsgToConsole(const CMIUtilString &vrTxt) { - const bool bLock = CMICmnStreamStderr::Instance().Lock(); - const bool bOk = bLock && CMICmnStreamStderr::Instance().WriteLLDBMsg(vrTxt); - bLock &&CMICmnStreamStderr::Instance().Unlock(); - - return bOk; -} diff --git a/lldb/tools/lldb-mi/MICmnStreamStdin.h b/lldb/tools/lldb-mi/MICmnStreamStdin.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnStreamStdin.h +++ /dev/null @@ -1,60 +0,0 @@ -//===-- MICmnStreamStdin.h --------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" -#include "MIUtilString.h" -#include "MIUtilThreadBaseStd.h" - -//++ -//============================================================================ -// Details: MI common code class. Used to handle stream data from Stdin. -// Singleton class using the Visitor pattern. A driver using the -// interface -// provide can receive callbacks when a new line of data is received. -// Each line is determined by a carriage return. -// A singleton class. -//-- -class CMICmnStreamStdin : public CMICmnBase, - public MI::ISingleton { - // Give singleton access to private constructors - friend MI::ISingleton; - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - // - const CMIUtilString &GetPrompt() const; - bool SetPrompt(const CMIUtilString &vNewPrompt); - void SetEnablePrompt(const bool vbYes); - bool GetEnablePrompt() const; - const char *ReadLine(CMIUtilString &vwErrMsg); - - // Methods: -private: - /* ctor */ CMICmnStreamStdin(); - /* ctor */ CMICmnStreamStdin(const CMICmnStreamStdin &); - void operator=(const CMICmnStreamStdin &); - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmnStreamStdin() override; - - // Attributes: -private: - CMIUtilString m_strPromptCurrent; // Command line prompt as shown to the user - bool m_bShowPrompt; // True = Yes prompt is shown/output to the user (stdout), - // false = no prompt - static const int m_constBufferSize = 2048; - char *m_pCmdBuffer; -}; diff --git a/lldb/tools/lldb-mi/MICmnStreamStdin.cpp b/lldb/tools/lldb-mi/MICmnStreamStdin.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnStreamStdin.cpp +++ /dev/null @@ -1,218 +0,0 @@ -//===-- MICmnStreamStdin.cpp ------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third Party Headers -#ifdef _MSC_VER -#include -#endif -#include - -// In-house headers: -#include "MICmnLog.h" -#include "MICmnResources.h" -#include "MICmnStreamStdin.h" -#include "MICmnStreamStdout.h" -#include "MIDriver.h" -#include "MIUtilSingletonHelper.h" - -//++ -// Details: CMICmnStreamStdin constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnStreamStdin::CMICmnStreamStdin() - : m_strPromptCurrent("(gdb)"), m_bShowPrompt(true), m_pCmdBuffer(nullptr) {} - -//++ -// Details: CMICmnStreamStdin destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnStreamStdin::~CMICmnStreamStdin() { Shutdown(); } - -//++ -// Details: Initialize resources for *this Stdin stream. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStdin::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - - // Note initialisation order is important here as some resources depend on - // previous - MI::ModuleInit(IDS_MI_INIT_ERR_LOG, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); - - if (bOk) { - m_pCmdBuffer = new char[m_constBufferSize]; - } else { - CMIUtilString strInitError(CMIUtilString::Format( - MIRSRC(IDS_MI_INIT_ERR_STREAMSTDIN), errMsg.c_str())); - SetErrorDescription(strInitError); - - return MIstatus::failure; - } - m_bInitialized = bOk; - - return MIstatus::success; -} - -//++ -// Details: Release resources for *this Stdin stream. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStdin::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - m_bInitialized = false; - - ClrErrorDescription(); - - if (m_pCmdBuffer != nullptr) { - delete[] m_pCmdBuffer; - m_pCmdBuffer = nullptr; - } - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - - MI::ModuleShutdown(IDE_MI_SHTDWN_ERR_RESOURCES, bOk, errMsg); - MI::ModuleShutdown(IDS_MI_SHTDWN_ERR_LOG, bOk, errMsg); - - if (!bOk) { - SetErrorDescriptionn(MIRSRC(IDE_MI_SHTDWN_ERR_STREAMSTDIN), errMsg.c_str()); - } - - return MIstatus::success; -} - -//++ -// Details: Validate and set the text that forms the prompt on the command line. -// Type: Method. -// Args: vNewPrompt - (R) Text description. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStdin::SetPrompt(const CMIUtilString &vNewPrompt) { - if (vNewPrompt.empty()) { - const CMIUtilString msg(CMIUtilString::Format( - MIRSRC(IDS_STDIN_ERR_INVALID_PROMPT), vNewPrompt.c_str())); - CMICmnStreamStdout::Instance().Write(msg); - return MIstatus::failure; - } - - m_strPromptCurrent = vNewPrompt; - - return MIstatus::success; -} - -//++ -// Details: Retrieve the command line prompt text currently being used. -// Type: Method. -// Args: None. -// Return: const CMIUtilString & - Functional failed. -// Throws: None. -//-- -const CMIUtilString &CMICmnStreamStdin::GetPrompt() const { - return m_strPromptCurrent; -} - -//++ -// Details: Set whether to display optional command line prompt. The prompt is -// output to -// stdout. Disable it when this may interfere with the client reading -// stdout as -// input and it tries to interpret the prompt text to. -// Type: Method. -// Args: vbYes - (R) True = Yes prompt is shown/output to the user -// (stdout), false = no prompt. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -void CMICmnStreamStdin::SetEnablePrompt(const bool vbYes) { - m_bShowPrompt = vbYes; -} - -//++ -// Details: Get whether to display optional command line prompt. The prompt is -// output to -// stdout. Disable it when this may interfere with the client reading -// stdout as -// input and it tries to interpret the prompt text to. -// Type: Method. -// Args: None. -// Return: bool - True = Yes prompt is shown/output to the user (stdout), false -// = no prompt. -// Throws: None. -//-- -bool CMICmnStreamStdin::GetEnablePrompt() const { return m_bShowPrompt; } - -//++ -// Details: Wait on new line of data from stdin stream (completed by '\n' or -// '\r'). -// Type: Method. -// Args: vwErrMsg - (W) Empty string ok or error description. -// Return: char * - text buffer pointer or NULL on failure. -// Throws: None. -//-- -const char *CMICmnStreamStdin::ReadLine(CMIUtilString &vwErrMsg) { - vwErrMsg.clear(); - - // Read user input - const char *pText = ::fgets(&m_pCmdBuffer[0], m_constBufferSize, stdin); - if (pText == nullptr) { -#ifdef _MSC_VER - // Was Ctrl-C hit? - // On Windows, Ctrl-C gives an ERROR_OPERATION_ABORTED as error on the - // command-line. - // The end-of-file indicator is also set, so without this check we will exit - // next if statement. - if (::GetLastError() == ERROR_OPERATION_ABORTED) - return nullptr; -#endif - if (::feof(stdin)) { - const bool bForceExit = true; - CMIDriver::Instance().SetExitApplicationFlag(bForceExit); - } else if (::ferror(stdin) != 0) - vwErrMsg = ::strerror(errno); - return nullptr; - } - - // Strip off new line characters - for (char *pI = m_pCmdBuffer; *pI != '\0'; pI++) { - if ((*pI == '\n') || (*pI == '\r')) { - *pI = '\0'; - break; - } - } - - return pText; -} diff --git a/lldb/tools/lldb-mi/MICmnStreamStdout.h b/lldb/tools/lldb-mi/MICmnStreamStdout.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnStreamStdout.h +++ /dev/null @@ -1,62 +0,0 @@ -//===-- MICmnStreamStdout.h -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnBase.h" -#include "MIUtilSingletonBase.h" -#include "MIUtilString.h" -#include "MIUtilThreadBaseStd.h" - -//++ -//============================================================================ -// Details: MI common code class. The MI driver requires this object. -// CMICmnStreamStdout sets up and tears downs stdout for the driver. -// -// Singleton class. -//-- -class CMICmnStreamStdout : public CMICmnBase, - public MI::ISingleton { - friend class MI::ISingleton; - - // Statics: -public: - static bool TextToStdout(const CMIUtilString &vrTxt); - static bool WritePrompt(); - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - // - bool Lock(); - bool Unlock(); - bool Write(const CMIUtilString &vText, const bool vbSendToLog = true); - bool WriteMIResponse(const CMIUtilString &vText, - const bool vbSendToLog = true); - - // Methods: -private: - /* ctor */ CMICmnStreamStdout(); - /* ctor */ CMICmnStreamStdout(const CMICmnStreamStdout &); - void operator=(const CMICmnStreamStdout &); - // - bool WritePriv(const CMIUtilString &vText, - const CMIUtilString &vTxtForLogFile, - const bool vbSendToLog = true); - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmnStreamStdout() override; - - // Attributes: -private: - CMIUtilThreadMutex m_mutex; // Mutex object for sync during writing to stream -}; diff --git a/lldb/tools/lldb-mi/MICmnStreamStdout.cpp b/lldb/tools/lldb-mi/MICmnStreamStdout.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnStreamStdout.cpp +++ /dev/null @@ -1,230 +0,0 @@ -//===-- MICmnStreamStdout.cpp -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnStreamStdout.h" -#include "MICmnLog.h" -#include "MICmnResources.h" -#include "MIDriver.h" - -//++ -// Details: CMICmnStreamStdout constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnStreamStdout::CMICmnStreamStdout() {} - -//++ -// Details: CMICmnStreamStdout destructor. -// Type: Overridable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnStreamStdout::~CMICmnStreamStdout() { Shutdown(); } - -//++ -// Details: Initialize resources for *this Stdout stream. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStdout::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - bool bOk = MIstatus::success; - -#ifdef _MSC_VER -// Debugging / I/O issues with client. -// This is only required on Windows if you do not use ::flush(stdout). MI uses -// ::flush(stdout) -// It trys to ensure the process attached to the stdout steam gets ALL the data. -//::setbuf( stdout, NULL ); -#endif // _MSC_VER - - m_bInitialized = bOk; - - return MIstatus::success; -} - -//++ -// Details: Release resources for *this Stdout stream. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStdout::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - ClrErrorDescription(); - - m_bInitialized = false; - - return MIstatus::success; -} - -//++ -// Details: Write an MI format type response to stdout. The text data does not -// need to -// include a carriage line return as this is added to the text. The -// function also -// then passes the text data into the CMICmnLog logger. -// Type: Method. -// Args: vText - (R) MI formatted text. -// vbSendToLog - (R) True = Yes send to the Log file too, false = do -// not. (Dflt = true) -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStdout::WriteMIResponse(const CMIUtilString &vText, - const bool vbSendToLog /* = true */) { - return WritePriv(vText, vText, vbSendToLog); -} - -//++ -// Details: Write text data to stdout. The text data does not need to -// include a carriage line return as this is added to the text. The -// function also -// then passes the text data into the CMICmnLog logger. -// Type: Method. -// Args: vText - (R) Text data. -// vbSendToLog - (R) True = Yes send to the Log file too, false = do -// not. (Dflt = true) -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStdout::Write(const CMIUtilString &vText, - const bool vbSendToLog /* = true */) { - if (vText.length() == 0) - return MIstatus::failure; - - const CMIUtilString strPrefixed(CMIUtilString::Format( - "%s: %s", CMIDriver::Instance().GetAppNameShort().c_str(), - vText.c_str())); - - return WritePriv(strPrefixed, vText, vbSendToLog); -} - -//++ -// Details: Write text data to stdout. The text data does not need to -// include a carriage line return as this is added to the text. The -// function also -// then passes the text data into the CMICmnLog logger. -// Type: Method. -// Args: vText - (R) Text data prefixed with MI app's short name. -// vTxtForLogFile - (R) Text data. -// vbSendToLog - (R) True = Yes send to the Log file too, false = -// do not. (Dflt = true) -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStdout::WritePriv(const CMIUtilString &vText, - const CMIUtilString &vTxtForLogFile, - const bool vbSendToLog /* = true */) { - if (vText.length() == 0) - return MIstatus::failure; - - bool bOk = MIstatus::success; - { - // Grab the stdout thread lock while we print - CMIUtilThreadLock _lock(m_mutex); - - // Send this text to stdout - const MIint status = ::fputs(vText.c_str(), stdout); - if (status == EOF) - // Don't call the CMICmnBase::SetErrorDescription() because it will cause - // a stack overflow: - // CMICmnBase::SetErrorDescription -> CMICmnStreamStdout::Write -> - // CMICmnStreamStdout::WritePriv -> CMICmnBase::SetErrorDescription - bOk = MIstatus::failure; - else { - ::fprintf(stdout, "\n"); - ::fflush(stdout); - } - - // Send this text to the log - if (bOk && vbSendToLog) - bOk &= m_pLog->WriteLog(vTxtForLogFile); - } - - return bOk; -} - -//++ -// Details: Lock the availability of the stream stdout. Other users of *this -// stream will -// be stalled until it is available (Unlock()). -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStdout::Lock() { - m_mutex.Lock(); - return MIstatus::success; -} - -//++ -// Details: Release a previously locked stdout. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnStreamStdout::Unlock() { - m_mutex.Unlock(); - return MIstatus::success; -} - -//++ -// Details: Take a text data and send to the stdout stream. Also output to the -// MI Log -// file. -// Type: Static method. -// Args: vrTxt - (R) Text. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMICmnStreamStdout::TextToStdout(const CMIUtilString &vrTxt) { - const bool bSendToLog = true; - return CMICmnStreamStdout::Instance().WriteMIResponse(vrTxt, bSendToLog); -} - -//++ -// Details: Write prompt to stdout if it's enabled. -// Type: Static method. -// Args: None. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMICmnStreamStdout::WritePrompt() { - const CMICmnStreamStdin &rStdinMan = CMICmnStreamStdin::Instance(); - if (rStdinMan.GetEnablePrompt()) - return TextToStdout(rStdinMan.GetPrompt()); - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MICmnThreadMgrStd.h b/lldb/tools/lldb-mi/MICmnThreadMgrStd.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnThreadMgrStd.h +++ /dev/null @@ -1,123 +0,0 @@ -//===-- MICmnThreadMgrStd.h -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers: -#include - -// In-house headers: -#include "MICmnBase.h" -#include "MICmnResources.h" -#include "MIUtilSingletonBase.h" -#include "MIUtilThreadBaseStd.h" - -//++ -//============================================================================ -// Details: MI's worker thread (active thread) manager. -// The manager creates threads and behalf of clients. Client are -// responsible for their threads and can delete them when necessary. -// This manager will stop and delete all threads on *this manager's -// shutdown. -// Singleton class. -//-- -class CMICmnThreadMgrStd : public CMICmnBase, - public MI::ISingleton { - friend MI::ISingleton; - - // Methods: -public: - bool Initialize() override; - bool Shutdown() override; - bool ThreadAllTerminate(); // Ask all threads to stop (caution) - template // Ask the thread manager to start and stop threads on - // our behalf - bool ThreadStart(T &vrwObject); - - // Typedef: -private: - typedef std::vector ThreadList_t; - - // Methods: -private: - /* ctor */ CMICmnThreadMgrStd(); - /* ctor */ CMICmnThreadMgrStd(const CMICmnThreadMgrStd &); - void operator=(const CMICmnThreadMgrStd &); - // - bool AddThread(const CMIUtilThreadActiveObjBase & - vrObj); // Add a thread for monitoring by the threadmanager - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMICmnThreadMgrStd() override; - - // Attributes: -private: - CMIUtilThreadMutex m_mutex; - ThreadList_t m_threadList; -}; - -//++ -// Details: Given a thread object start its (worker) thread to do work. The -// object is -// added to the *this manager for housekeeping and deletion of all -// thread objects. -// Type: Template method. -// Args: vrwThreadObj - (RW) A CMIUtilThreadActiveObjBase derived -// object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -template bool CMICmnThreadMgrStd::ThreadStart(T &vrwThreadObj) { - bool bOk = MIstatus::success; - - // Grab a reference to the base object type - CMIUtilThreadActiveObjBase &rObj = - static_cast(vrwThreadObj); - - // Add to the thread managers internal database - bOk &= AddThread(rObj); - if (!bOk) { - const CMIUtilString errMsg( - CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), - vrwThreadObj.ThreadGetName().c_str())); - SetErrorDescription(errMsg); - return MIstatus::failure; - } - - // Grab a reference on behalf of the caller - bOk &= vrwThreadObj.Acquire(); - if (!bOk) { - const CMIUtilString errMsg( - CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), - vrwThreadObj.ThreadGetName().c_str())); - SetErrorDescription(errMsg); - return MIstatus::failure; - } - - // Thread is already started - // This call must come after the reference count increment - if (vrwThreadObj.ThreadIsActive()) { - // Early exit on thread already running condition - return MIstatus::success; - } - - // Start the thread running - bOk &= vrwThreadObj.ThreadExecute(); - if (!bOk) { - const CMIUtilString errMsg( - CMIUtilString::Format(MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), - vrwThreadObj.ThreadGetName().c_str())); - SetErrorDescription(errMsg); - return MIstatus::failure; - } - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MICmnThreadMgrStd.cpp b/lldb/tools/lldb-mi/MICmnThreadMgrStd.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MICmnThreadMgrStd.cpp +++ /dev/null @@ -1,145 +0,0 @@ -//===-- MICmnThreadMgrStd.cpp -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MICmnThreadMgrStd.h" -#include "MICmnLog.h" -#include "MICmnResources.h" -#include "MIUtilSingletonHelper.h" - -//++ -// Details: CMICmnThreadMgr constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnThreadMgrStd::CMICmnThreadMgrStd() {} - -//++ -// Details: CMICmnThreadMgr destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMICmnThreadMgrStd::~CMICmnThreadMgrStd() { Shutdown(); } - -//++ -// Details: Initialise resources for *this thread manager. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnThreadMgrStd::Initialize() { - m_clientUsageRefCnt++; - - if (m_bInitialized) - return MIstatus::success; - - bool bOk = MIstatus::success; - - ClrErrorDescription(); - CMIUtilString errMsg; - - // Note initialisation order is important here as some resources depend on - // previous - MI::ModuleInit(IDS_MI_INIT_ERR_LOG, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); - - m_bInitialized = bOk; - - if (!bOk) { - CMIUtilString strInitError(CMIUtilString::Format( - MIRSRC(IDS_MI_INIT_ERR_THREADMGR), errMsg.c_str())); - SetErrorDescription(strInitError); - return MIstatus::failure; - } - - return bOk; -} - -//++ -// Details: Release resources for *this thread manager. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnThreadMgrStd::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - m_bInitialized = false; - - ClrErrorDescription(); - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - - // Tidy up - ThreadAllTerminate(); - - // Note shutdown order is important here - MI::ModuleShutdown(IDE_MI_SHTDWN_ERR_RESOURCES, bOk, errMsg); - MI::ModuleShutdown(IDS_MI_SHTDWN_ERR_LOG, bOk, errMsg); - - if (!bOk) { - SetErrorDescriptionn(MIRSRC(IDS_MI_SHUTDOWN_ERR), errMsg.c_str()); - } - - return bOk; -} - -//++ -// Details: Ask the thread manager to kill all threads and wait until they have -// died -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnThreadMgrStd::ThreadAllTerminate() { - ThreadList_t::const_iterator it = m_threadList.begin(); - for (; it != m_threadList.end(); ++it) { - // If the thread is still running - CMIUtilThreadActiveObjBase *pThread = *it; - if (pThread->ThreadIsActive()) { - // Ask this thread to kill itself - pThread->ThreadKill(); - - // Wait for this thread to die - pThread->ThreadJoin(); - } - } - - return MIstatus::success; -} - -//++ -// Details: Add a thread object to *this manager's list of thread objects. The -// list to -// used to manage thread objects centrally. -// Type: Method. -// Args: vrObj - (R) A thread object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMICmnThreadMgrStd::AddThread(const CMIUtilThreadActiveObjBase &vrObj) { - m_threadList.push_back(const_cast(&vrObj)); - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MIDataTypes.h b/lldb/tools/lldb-mi/MIDataTypes.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIDataTypes.h +++ /dev/null @@ -1,60 +0,0 @@ -//===-- MIDataTypes.h -------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: Common global switches, macros, etc. -// -// This file contains common data types required by applications -// generally. If supported by the compiler, this file should be -// #include'd as part of the project's PCH (precompiled header). - -#pragma once - -// Windows headers: -#ifdef _WIN32 - -// Debugging: -#ifdef _DEBUG -#include -#endif // _DEBUG - -#endif // _WIN32 - -// Common definitions: - -// Function return status -namespace MIstatus { -const bool success = true; -const bool failure = false; -} - -// Use to avoid "unused parameter" compiler warnings: -#define MIunused(x) (void)x; - -// Portability issues -#ifdef _WIN64 -typedef unsigned __int64 size_t; -typedef __int64 MIint; -typedef unsigned __int64 MIuint; -#else -#ifdef _WIN32 -typedef unsigned int size_t; -typedef int MIint; -typedef unsigned int MIuint; -#else -typedef int MIint; -typedef unsigned int MIuint; - -#define MAX_PATH 4096 -#endif // _WIN32 -#endif // _WIN64 - -// Common types: - -// Fundamentals: -typedef long long MIint64; // 64bit signed integer. -typedef unsigned long long MIuint64; // 64bit unsigned integer. diff --git a/lldb/tools/lldb-mi/MIDriver.h b/lldb/tools/lldb-mi/MIDriver.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIDriver.h +++ /dev/null @@ -1,180 +0,0 @@ -//===-- MIDriver.h ----------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers -#include - -// In-house headers: -#include "MICmdData.h" -#include "MICmnBase.h" -#include "MICmnConfig.h" -#include "MICmnStreamStdin.h" -#include "MIDriverBase.h" -#include "MIDriverMgr.h" -#include "MIUtilSingletonBase.h" - -// Declarations: -class CMICmnLLDBDebugger; -class CMICmnStreamStdout; - -//++ -//============================================================================ -// Details: MI driver implementation class. A singleton class derived from -// LLDB SBBroadcaster class. Register the instance of *this class with -// the CMIDriverMgr. The CMIDriverMgr sets the driver(s) of to start -// work depending on the one selected to work. A driver can if not able -// to handle an instruction or 'command' can pass that command onto -// another driver object registered with the Driver Manager. -//-- -class CMIDriver : public CMICmnBase, - public CMIDriverMgr::IDriver, - public CMIDriverBase, - public MI::ISingleton { - friend class MI::ISingleton; - - // Enumerations: -public: - //++ ---------------------------------------------------------------------- - // Details: The MI Driver has a running state which is used to help determine - // which specific action(s) it should take or not allow. - // The driver when operational and not shutting down alternates - // between eDriverState_RunningNotDebugging and - // eDriverState_RunningDebugging. eDriverState_RunningNotDebugging - // is normally set when a breakpoint is hit or halted. - // eDriverState_RunningDebugging is normally set when "exec-continue" - // or "exec-run" is issued. - //-- - enum DriverState_e { - eDriverState_NotRunning = 0, // The MI Driver is not operating - eDriverState_Initialising, // The MI Driver is setting itself up - eDriverState_RunningNotDebugging, // The MI Driver is operational acting on - // any MI commands sent to it - eDriverState_RunningDebugging, // The MI Driver is currently overseeing an - // inferior program that is running - eDriverState_ShuttingDown, // The MI Driver is tearing down resources and - // about exit - eDriverState_count // Always last - }; - - // Methods: -public: - // MI system - bool Initialize() override; - bool Shutdown() override; - - // MI state - bool GetExitApplicationFlag() const; - DriverState_e GetCurrentDriverState() const; - bool SetDriverStateRunningNotDebugging(); - bool SetDriverStateRunningDebugging(); - void SetDriverDebuggingArgExecutable(); - bool IsDriverDebuggingArgExecutable() const; - - // MI information about itself - const CMIUtilString &GetAppNameShort() const; - const CMIUtilString &GetAppNameLong() const; - const CMIUtilString &GetVersionDescription() const; - - // MI do work - bool WriteMessageToLog(const CMIUtilString &vMessage); - bool SetEnableFallThru(const bool vbYes); - bool GetEnableFallThru() const; - bool HaveExecutableFileNamePathOnCmdLine() const; - const CMIUtilString &GetExecutableFileNamePathOnCmdLine() const; - - // Overridden: -public: - // From CMIDriverMgr::IDriver - bool DoInitialize() override; - bool DoShutdown() override; - bool DoMainLoop() override; - lldb::SBError DoParseArgs(const int argc, const char *argv[], FILE *vpStdOut, - bool &vwbExiting) override; - CMIUtilString GetError() const override; - const CMIUtilString &GetName() const override; - lldb::SBDebugger &GetTheDebugger() override; - bool GetDriverIsGDBMICompatibleDriver() const override; - bool SetId(const CMIUtilString &vId) override; - const CMIUtilString &GetId() const override; - // From CMIDriverBase - void SetExitApplicationFlag(const bool vbForceExit) override; - bool DoFallThruToAnotherDriver(const CMIUtilString &vCmd, - CMIUtilString &vwErrMsg) override; - bool SetDriverToFallThruTo(const CMIDriverBase &vrOtherDriver) override; - FILE *GetStdin() const override; - FILE *GetStdout() const override; - FILE *GetStderr() const override; - const CMIUtilString &GetDriverName() const override; - const CMIUtilString &GetDriverId() const override; - void DeliverSignal(int signal) override; - - // Typedefs: -private: - typedef std::queue QueueStdinLine_t; - - // Methods: -private: - /* ctor */ CMIDriver(); - /* ctor */ CMIDriver(const CMIDriver &); - void operator=(const CMIDriver &); - - lldb::SBError ParseArgs(const int argc, const char *argv[], FILE *vpStdOut, - bool &vwbExiting); - bool DoAppQuit(); - bool InterpretCommand(const CMIUtilString &vTextLine); - bool InterpretCommandThisDriver(const CMIUtilString &vTextLine, - bool &vwbCmdYesValid); - CMIUtilString - WrapCLICommandIntoMICommand(const CMIUtilString &vTextLine) const; - bool InterpretCommandFallThruDriver(const CMIUtilString &vTextLine, - bool &vwbCmdYesValid); - bool ExecuteCommand(const SMICmdData &vCmdData); - bool StartWorkerThreads(); - bool StopWorkerThreads(); - bool InitClientIDEToMIDriver() const; - bool InitClientIDEEclipse() const; - bool LocalDebugSessionStartupExecuteCommands(); - bool ExecuteCommandFile(const bool vbAsyncMode); - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMIDriver() override; - - // Attributes: -private: - static const CMIUtilString ms_constAppNameShort; - static const CMIUtilString ms_constAppNameLong; - static const CMIUtilString ms_constMIVersion; - // - bool m_bFallThruToOtherDriverEnabled; // True = yes fall through, false = do - // not pass on command - CMIUtilThreadMutex m_threadMutex; - bool m_bDriverIsExiting; // True = yes, driver told to quit, false = continue - // working - void *m_handleMainThread; // *this driver is run by the main thread - CMICmnStreamStdin &m_rStdin; - CMICmnLLDBDebugger &m_rLldbDebugger; - CMICmnStreamStdout &m_rStdOut; - DriverState_e m_eCurrentDriverState; - bool m_bHaveExecutableFileNamePathOnCmdLine; // True = yes, executable given - // as one of the parameters to - // the MI Driver, false = not - // found - CMIUtilString m_strCmdLineArgExecuteableFileNamePath; - bool m_bDriverDebuggingArgExecutable; // True = the MI Driver (MI mode) is - // debugging executable passed as - // argument, - // false = running via a client (e.g. Eclipse) - bool m_bHaveCommandFileNamePathOnCmdLine; // True = file with initial commands - // given as one of the parameters to - // the MI Driver, false = not found - CMIUtilString m_strCmdLineArgCommandFileNamePath; -}; diff --git a/lldb/tools/lldb-mi/MIDriver.cpp b/lldb/tools/lldb-mi/MIDriver.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIDriver.cpp +++ /dev/null @@ -1,1318 +0,0 @@ -//===-- MIDriver.cpp --------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers: -#include "lldb/API/SBError.h" -#include -#include -#include - -// In-house headers: -#include "MICmdArgValFile.h" -#include "MICmdArgValString.h" -#include "MICmdMgr.h" -#include "MICmnConfig.h" -#include "MICmnLLDBDebugSessionInfo.h" -#include "MICmnLLDBDebugger.h" -#include "MICmnLog.h" -#include "MICmnMIResultRecord.h" -#include "MICmnMIValueConst.h" -#include "MICmnResources.h" -#include "MICmnStreamStderr.h" -#include "MICmnStreamStdout.h" -#include "MICmnThreadMgrStd.h" -#include "MIDriver.h" -#include "MIUtilDebug.h" -#include "MIUtilSingletonHelper.h" - -// Instantiations: -#if _DEBUG -const CMIUtilString CMIDriver::ms_constMIVersion = - MIRSRC(IDS_MI_VERSION_DESCRIPTION_DEBUG); -#else -const CMIUtilString CMIDriver::ms_constMIVersion = - MIRSRC(IDS_MI_VERSION_DESCRIPTION); // Matches version in resources file -#endif // _DEBUG -const CMIUtilString - CMIDriver::ms_constAppNameShort(MIRSRC(IDS_MI_APPNAME_SHORT)); -const CMIUtilString CMIDriver::ms_constAppNameLong(MIRSRC(IDS_MI_APPNAME_LONG)); - -//++ -// Details: CMIDriver constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIDriver::CMIDriver() - : m_bFallThruToOtherDriverEnabled(false), m_bDriverIsExiting(false), - m_handleMainThread(nullptr), m_rStdin(CMICmnStreamStdin::Instance()), - m_rLldbDebugger(CMICmnLLDBDebugger::Instance()), - m_rStdOut(CMICmnStreamStdout::Instance()), - m_eCurrentDriverState(eDriverState_NotRunning), - m_bHaveExecutableFileNamePathOnCmdLine(false), - m_bDriverDebuggingArgExecutable(false), - m_bHaveCommandFileNamePathOnCmdLine(false) {} - -//++ -// Details: CMIDriver destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIDriver::~CMIDriver() {} - -//++ -// Details: Set whether *this driver (the parent) is enabled to pass a command -// to its -// fall through (child) driver to interpret the command and do work -// instead -// (if *this driver decides it can't handle the command). -// Type: Method. -// Args: vbYes - (R) True = yes fall through, false = do not pass on -// command. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::SetEnableFallThru(const bool vbYes) { - m_bFallThruToOtherDriverEnabled = vbYes; - return MIstatus::success; -} - -//++ -// Details: Get whether *this driver (the parent) is enabled to pass a command -// to its -// fall through (child) driver to interpret the command and do work -// instead -// (if *this driver decides it can't handle the command). -// Type: Method. -// Args: None. -// Return: bool - True = yes fall through, false = do not pass on command. -// Throws: None. -//-- -bool CMIDriver::GetEnableFallThru() const { - return m_bFallThruToOtherDriverEnabled; -} - -//++ -// Details: Retrieve MI's application name of itself. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - Text description. -// Throws: None. -//-- -const CMIUtilString &CMIDriver::GetAppNameShort() const { - return ms_constAppNameShort; -} - -//++ -// Details: Retrieve MI's application name of itself. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - Text description. -// Throws: None. -//-- -const CMIUtilString &CMIDriver::GetAppNameLong() const { - return ms_constAppNameLong; -} - -//++ -// Details: Retrieve MI's version description of itself. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - Text description. -// Throws: None. -//-- -const CMIUtilString &CMIDriver::GetVersionDescription() const { - return ms_constMIVersion; -} - -//++ -// Details: Initialize setup *this driver ready for use. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::Initialize() { - m_eCurrentDriverState = eDriverState_Initialising; - m_clientUsageRefCnt++; - - ClrErrorDescription(); - - if (m_bInitialized) - return MIstatus::success; - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - - // Initialize all of the modules we depend on - MI::ModuleInit(IDS_MI_INIT_ERR_LOG, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_STREAMSTDOUT, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_STREAMSTDERR, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_THREADMANAGER, bOk, - errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_STREAMSTDIN, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_CMDMGR, bOk, errMsg); - bOk &= m_rLldbDebugger.SetDriver(*this); - MI::ModuleInit(IDS_MI_INIT_ERR_LLDBDEBUGGER, bOk, errMsg); - - m_bExitApp = false; - - m_bInitialized = bOk; - - if (!bOk) { - const CMIUtilString msg = - CMIUtilString::Format(MIRSRC(IDS_MI_INIT_ERR_DRIVER), errMsg.c_str()); - SetErrorDescription(msg); - return MIstatus::failure; - } - - m_eCurrentDriverState = eDriverState_RunningNotDebugging; - - return bOk; -} - -//++ -// Details: Unbind detach or release resources used by *this driver. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::Shutdown() { - if (--m_clientUsageRefCnt > 0) - return MIstatus::success; - - if (!m_bInitialized) - return MIstatus::success; - - m_eCurrentDriverState = eDriverState_ShuttingDown; - - ClrErrorDescription(); - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - - // Shutdown all of the modules we depend on - MI::ModuleShutdown(IDS_MI_INIT_ERR_LLDBDEBUGGER, bOk, - errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_CMDMGR, bOk, errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_STREAMSTDIN, bOk, - errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_THREADMANAGER, bOk, - errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_STREAMSTDERR, bOk, - errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_STREAMSTDOUT, bOk, - errMsg); - MI::ModuleShutdown(IDS_MI_INIT_ERR_LOG, bOk, errMsg); - - if (!bOk) { - SetErrorDescriptionn(MIRSRC(IDS_MI_SHUTDOWN_ERR), errMsg.c_str()); - } - - m_eCurrentDriverState = eDriverState_NotRunning; - - return bOk; -} - -//++ -// Details: Work function. Client (the driver's user) is able to append their -// own message -// in to the MI's Log trace file. -// Type: Method. -// Args: vMessage - (R) Client's text message. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::WriteMessageToLog(const CMIUtilString &vMessage) { - CMIUtilString msg; - msg = CMIUtilString::Format(MIRSRC(IDS_MI_CLIENT_MSG), vMessage.c_str()); - return m_pLog->Write(msg, CMICmnLog::eLogVerbosity_ClientMsg); -} - -//++ -// Details: CDriverMgr calls *this driver initialize setup ready for use. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::DoInitialize() { return CMIDriver::Instance().Initialize(); } - -//++ -// Details: CDriverMgr calls *this driver to unbind detach or release resources -// used by -// *this driver. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::DoShutdown() { return CMIDriver::Instance().Shutdown(); } - -//++ -// Details: Retrieve the name for *this driver. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString & - Driver name. -// Throws: None. -//-- -const CMIUtilString &CMIDriver::GetName() const { - const CMIUtilString &rName = GetAppNameLong(); - const CMIUtilString &rVsn = GetVersionDescription(); - static CMIUtilString strName = - CMIUtilString::Format("%s %s", rName.c_str(), rVsn.c_str()); - - return strName; -} - -//++ -// Details: Retrieve *this driver's last error condition. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString - Text description. -// Throws: None. -//-- -CMIUtilString CMIDriver::GetError() const { return GetErrorDescription(); } - -//++ -// Details: Call *this driver to return it's debugger. -// Type: Overridden. -// Args: None. -// Return: lldb::SBDebugger & - LLDB debugger object reference. -// Throws: None. -//-- -lldb::SBDebugger &CMIDriver::GetTheDebugger() { - return m_rLldbDebugger.GetTheDebugger(); -} - -//++ -// Details: Specify another driver *this driver can call should this driver not -// be able -// to handle the client data input. DoFallThruToAnotherDriver() makes -// the call. -// Type: Overridden. -// Args: vrOtherDriver - (R) Reference to another driver object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::SetDriverToFallThruTo(const CMIDriverBase &vrOtherDriver) { - m_pDriverFallThru = const_cast(&vrOtherDriver); - - return m_pDriverFallThru->SetDriverParent(*this); -} - -//++ -// Details: Proxy function CMIDriverMgr IDriver interface implementation. *this -// driver's -// implementation called from here to match the existing function name -// of the -// original LLDB driver class (the extra indirection is not necessarily -// required). -// Check the arguments that were passed to this program to make sure -// they are -// valid and to get their argument values (if any). -// Type: Overridden. -// Args: argc - (R) An integer that contains the count of arguments -// that follow in -// argv. The argc parameter is always greater than -// or equal to 1. -// argv - (R) An array of null-terminated strings representing -// command-line -// arguments entered by the user of the program. By -// convention, -// argv[0] is the command with which the program is -// invoked. -// vpStdOut - (R) Pointer to a standard output stream. -// vwbExiting - (W) True = *this want to exit, Reasons: help, -// invalid arg(s), -// version information only. -// False = Continue to work, start debugger i.e. -// Command -// interpreter. -// Return: lldb::SBError - LLDB current error status. -// Throws: None. -//-- -lldb::SBError CMIDriver::DoParseArgs(const int argc, const char *argv[], - FILE *vpStdOut, bool &vwbExiting) { - return ParseArgs(argc, argv, vpStdOut, vwbExiting); -} - -//++ -// Details: Check the arguments that were passed to this program to make sure -// they are -// valid and to get their argument values (if any). The following are -// options -// that are only handled by *this driver: -// --executable -// --source or -s -// --synchronous -// The application's options --interpreter and --executable in code act -// very similar. -// The --executable is necessary to differentiate whether the MI Driver -// is being -// used by a client (e.g. Eclipse) or from the command line. Eclipse -// issues the option -// --interpreter and also passes additional arguments which can be -// interpreted as an -// executable if called from the command line. Using --executable tells -// the MI Driver -// it is being called from the command line and to prepare to launch -// the executable -// argument for a debug session. Using --interpreter on the command -// line does not -// issue additional commands to initialise a debug session. -// Option --synchronous disables an asynchronous mode in the lldb-mi driver. -// Type: Overridden. -// Args: argc - (R) An integer that contains the count of arguments -// that follow in -// argv. The argc parameter is always greater than -// or equal to 1. -// argv - (R) An array of null-terminated strings representing -// command-line -// arguments entered by the user of the program. By -// convention, -// argv[0] is the command with which the program is -// invoked. -// vpStdOut - (R) Pointer to a standard output stream. -// vwbExiting - (W) True = *this want to exit, Reasons: help, -// invalid arg(s), -// version information only. -// False = Continue to work, start debugger i.e. -// Command -// interpreter. -// Return: lldb::SBError - LLDB current error status. -// Throws: None. -//-- -lldb::SBError CMIDriver::ParseArgs(const int argc, const char *argv[], - FILE *vpStdOut, bool &vwbExiting) { - lldb::SBError errStatus; - const bool bHaveArgs(argc >= 2); - - // *** Add any args handled here to GetHelpOnCmdLineArgOptions() *** - - // CODETAG_MIDRIVE_CMD_LINE_ARG_HANDLING - // Look for the command line options - bool bHaveExecutableFileNamePath = false; - bool bHaveExecutableLongOption = false; - - if (bHaveArgs) { - // Search right to left to look for filenames - for (MIint i = argc - 1; i > 0; i--) { - const CMIUtilString strArg(argv[i]); - const CMICmdArgValFile argFile; - - // Check for a filename - if (argFile.IsFilePath(strArg) || - CMICmdArgValString(true, false, true).IsStringArg(strArg)) { - // Is this the command file for the '-s' or '--source' options? - const CMIUtilString strPrevArg(argv[i - 1]); - if (strPrevArg == "-s" || strPrevArg == "--source") { - m_strCmdLineArgCommandFileNamePath = strArg; - m_bHaveCommandFileNamePathOnCmdLine = true; - i--; // skip '-s' on the next loop - continue; - } - // Else, must be the executable - bHaveExecutableFileNamePath = true; - m_strCmdLineArgExecuteableFileNamePath = strArg; - m_bHaveExecutableFileNamePathOnCmdLine = true; - } - // Report error if no command file was specified for the '-s' or - // '--source' options - else if (strArg == "-s" || strArg == "--source") { - vwbExiting = true; - const CMIUtilString errMsg = CMIUtilString::Format( - MIRSRC(IDS_CMD_ARGS_ERR_VALIDATION_MISSING_INF), strArg.c_str()); - errStatus.SetErrorString(errMsg.c_str()); - break; - } - // This argument is also checked for in CMIDriverMgr::ParseArgs() - else if (strArg == "--executable") // Used to specify that - // there is executable - // argument also on the - // command line - { // See fn description. - bHaveExecutableLongOption = true; - } else if (strArg == "--synchronous") { - CMICmnLLDBDebugSessionInfo::Instance().GetDebugger().SetAsync(false); - } - } - } - - if (bHaveExecutableFileNamePath && bHaveExecutableLongOption) { - SetDriverDebuggingArgExecutable(); - } - - return errStatus; -} - -//++ -// Details: A client can ask if *this driver is GDB/MI compatible. -// Type: Overridden. -// Args: None. -// Return: True - GBD/MI compatible LLDB front end. -// False - Not GBD/MI compatible LLDB front end. -// Throws: None. -//-- -bool CMIDriver::GetDriverIsGDBMICompatibleDriver() const { return true; } - -//++ -// Details: Start worker threads for the driver. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::StartWorkerThreads() { - bool bOk = MIstatus::success; - - // Grab the thread manager - CMICmnThreadMgrStd &rThreadMgr = CMICmnThreadMgrStd::Instance(); - - // Start the event polling thread - if (bOk && !rThreadMgr.ThreadStart(m_rLldbDebugger)) { - const CMIUtilString errMsg = CMIUtilString::Format( - MIRSRC(IDS_THREADMGR_ERR_THREAD_FAIL_CREATE), - CMICmnThreadMgrStd::Instance().GetErrorDescription().c_str()); - SetErrorDescription(errMsg); - return MIstatus::failure; - } - - return bOk; -} - -//++ -// Details: Stop worker threads for the driver. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::StopWorkerThreads() { - CMICmnThreadMgrStd &rThreadMgr = CMICmnThreadMgrStd::Instance(); - return rThreadMgr.ThreadAllTerminate(); -} - -//++ -// Details: Call this function puts *this driver to work. -// This function is used by the application's main thread. -// Type: Overridden. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::DoMainLoop() { - if (!InitClientIDEToMIDriver()) // Init Eclipse IDE - { - SetErrorDescriptionn(MIRSRC(IDS_MI_INIT_ERR_CLIENT_USING_DRIVER)); - return MIstatus::failure; - } - - if (!StartWorkerThreads()) - return MIstatus::failure; - - bool bOk = MIstatus::success; - - if (HaveExecutableFileNamePathOnCmdLine()) { - if (!LocalDebugSessionStartupExecuteCommands()) { - SetErrorDescription(MIRSRC(IDS_MI_INIT_ERR_LOCAL_DEBUG_SESSION)); - bOk = MIstatus::failure; - } - } - - // App is not quitting currently - m_bExitApp = false; - - // Handle source file - if (m_bHaveCommandFileNamePathOnCmdLine) { - const bool bAsyncMode = false; - ExecuteCommandFile(bAsyncMode); - } - - // While the app is active - while (bOk && !m_bExitApp) { - CMIUtilString errorText; - const char *pCmd = m_rStdin.ReadLine(errorText); - if (pCmd != nullptr) { - CMIUtilString lineText(pCmd); - if (!lineText.empty()) { - // Check that the handler thread is alive (otherwise we stuck here) - assert(CMICmnLLDBDebugger::Instance().ThreadIsActive()); - - { - // Lock Mutex before processing commands so that we don't disturb an - // event - // being processed - CMIUtilThreadLock lock( - CMICmnLLDBDebugSessionInfo::Instance().GetSessionMutex()); - bOk = InterpretCommand(lineText); - } - - // Draw prompt if desired - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - - // Wait while the handler thread handles incoming events - CMICmnLLDBDebugger::Instance().WaitForHandleEvent(); - } - } - } - - // Signal that the application is shutting down - DoAppQuit(); - - // Close and wait for the workers to stop - StopWorkerThreads(); - - return MIstatus::success; -} - -//++ -// Details: Set things in motion, set state etc that brings *this driver (and -// the -// application) to a tidy shutdown. -// This function is used by the application's main thread. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::DoAppQuit() { - bool bYesQuit = true; - - // Shutdown stuff, ready app for exit - { - CMIUtilThreadLock lock(m_threadMutex); - m_bDriverIsExiting = true; - } - - return bYesQuit; -} - -//++ -// Details: *this driver passes text commands to a fall through driver is it -// does not -// understand them (the LLDB driver). -// This function is used by the application's main thread. -// Type: Method. -// Args: vTextLine - (R) Text data representing a possible command. -// vwbCmdYesValid - (W) True = Command valid, false = command not -// handled. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::InterpretCommandFallThruDriver(const CMIUtilString &vTextLine, - bool &vwbCmdYesValid) { - MIunused(vTextLine); - MIunused(vwbCmdYesValid); - - // ToDo: Implement when less urgent work to be done or decide remove as not - // required - // bool bOk = MIstatus::success; - // bool bCmdNotUnderstood = true; - // if( bCmdNotUnderstood && GetEnableFallThru() ) - //{ - // CMIUtilString errMsg; - // bOk = DoFallThruToAnotherDriver( vStdInBuffer, errMsg ); - // if( !bOk ) - // { - // errMsg = errMsg.StripCREndOfLine(); - // errMsg = errMsg.StripCRAll(); - // const CMIDriverBase * pOtherDriver = GetDriverToFallThruTo(); - // const char * pName = pOtherDriver->GetDriverName().c_str(); - // const char * pId = pOtherDriver->GetDriverId().c_str(); - // const CMIUtilString msg( CMIUtilString::Format( MIRSRC( - // IDS_DRIVER_ERR_FALLTHRU_DRIVER_ERR ), pName, pId, errMsg.c_str() ) - //); - // m_pLog->WriteMsg( msg ); - // } - //} - // - // vwbCmdYesValid = bOk; - // CMIUtilString strNot; - // if( vwbCmdYesValid) - // strNot = CMIUtilString::Format( "%s ", MIRSRC( IDS_WORD_NOT ) ); - // const CMIUtilString msg( CMIUtilString::Format( MIRSRC( - // IDS_FALLTHRU_DRIVER_CMD_RECEIVED ), vTextLine.c_str(), strNot.c_str() ) ); - // m_pLog->WriteLog( msg ); - - return MIstatus::success; -} - -//++ -// Details: Retrieve the name for *this driver. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString & - Driver name. -// Throws: None. -//-- -const CMIUtilString &CMIDriver::GetDriverName() const { return GetName(); } - -//++ -// Details: Get the unique ID for *this driver. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString & - Text description. -// Throws: None. -//-- -const CMIUtilString &CMIDriver::GetDriverId() const { return GetId(); } - -//++ -// Details: This function allows *this driver to call on another driver to -// perform work -// should this driver not be able to handle the client data input. -// SetDriverToFallThruTo() specifies the fall through to driver. -// Check the error message if the function returns a failure. -// Type: Overridden. -// Args: vCmd - (R) Command instruction to interpret. -// vwErrMsg - (W) Status description on command failing. -// Return: MIstatus::success - Command succeeded. -// MIstatus::failure - Command failed. -// Throws: None. -//-- -bool CMIDriver::DoFallThruToAnotherDriver(const CMIUtilString &vCmd, - CMIUtilString &vwErrMsg) { - bool bOk = MIstatus::success; - - CMIDriverBase *pOtherDriver = GetDriverToFallThruTo(); - if (pOtherDriver == nullptr) - return bOk; - - return pOtherDriver->DoFallThruToAnotherDriver(vCmd, vwErrMsg); -} - -//++ -// Details: *this driver provides a file stream to other drivers on which *this -// driver -// write's out to and they read as expected input. *this driver is -// passing -// through commands to the (child) pass through assigned driver. -// Type: Overrdidden. -// Args: None. -// Return: FILE * - Pointer to stream. -// Throws: None. -//-- -FILE *CMIDriver::GetStdin() const { - // Note this fn is called on CMIDriverMgr register driver so stream has to be - // available before *this driver has been initialized! Flaw? - - // This very likely to change later to a stream that the pass thru driver - // will read and we write to give it 'input' - return stdin; -} - -//++ -// Details: *this driver provides a file stream to other pass through assigned -// drivers -// so they know what to write to. -// Type: Overidden. -// Args: None. -// Return: FILE * - Pointer to stream. -// Throws: None. -//-- -FILE *CMIDriver::GetStdout() const { - // Note this fn is called on CMIDriverMgr register driver so stream has to be - // available before *this driver has been initialized! Flaw? - - // Do not want to pass through driver to write to stdout - return nullptr; -} - -//++ -// Details: *this driver provides a error file stream to other pass through -// assigned drivers -// so they know what to write to. -// Type: Overidden. -// Args: None. -// Return: FILE * - Pointer to stream. -// Throws: None. -//-- -FILE *CMIDriver::GetStderr() const { - // Note this fn is called on CMIDriverMgr register driver so stream has to be - // available before *this driver has been initialized! Flaw? - - // This very likely to change later to a stream that the pass thru driver - // will write to and *this driver reads from to pass on the CMICmnLog object - return stderr; -} - -//++ -// Details: Set a unique ID for *this driver. It cannot be empty. -// Type: Overridden. -// Args: vId - (R) Text description. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::SetId(const CMIUtilString &vId) { - if (vId.empty()) { - SetErrorDescriptionn(MIRSRC(IDS_DRIVER_ERR_ID_INVALID), GetName().c_str(), - vId.c_str()); - return MIstatus::failure; - } - - m_strDriverId = vId; - return MIstatus::success; -} - -//++ -// Details: Get the unique ID for *this driver. -// Type: Overridden. -// Args: None. -// Return: CMIUtilString & - Text description. -// Throws: None. -//-- -const CMIUtilString &CMIDriver::GetId() const { return m_strDriverId; } - -//++ -// Details: Interpret the text data and match against current commands to see if -// there -// is a match. If a match then the command is issued and actioned on. -// The -// text data if not understood by *this driver is past on to the Fall -// Thru -// driver. -// This function is used by the application's main thread. -// Type: Method. -// Args: vTextLine - (R) Text data representing a possible command. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::InterpretCommand(const CMIUtilString &vTextLine) { - const bool bNeedToRebroadcastStopEvent = - m_rLldbDebugger.CheckIfNeedToRebroadcastStopEvent(); - bool bCmdYesValid = false; - bool bOk = InterpretCommandThisDriver(vTextLine, bCmdYesValid); - if (bOk && !bCmdYesValid) - bOk = InterpretCommandFallThruDriver(vTextLine, bCmdYesValid); - - if (bNeedToRebroadcastStopEvent) - m_rLldbDebugger.RebroadcastStopEvent(); - - return bOk; -} - -//++ -// Details: Helper function for CMIDriver::InterpretCommandThisDriver. -// Convert a CLI command to MI command (just wrap any CLI command -// into "-interpreter-exec command \"\""). -// Type: Method. -// Args: vTextLine - (R) Text data representing a possible command. -// Return: CMIUtilString - The original MI command or converted CLI command. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -CMIUtilString -CMIDriver::WrapCLICommandIntoMICommand(const CMIUtilString &vTextLine) const { - // Tokens contain following digits - static const CMIUtilString digits("0123456789"); - - // Consider an algorithm on the following example: - // 001-file-exec-and-symbols "/path/to/file" - // - // 1. Skip a command token - // For example: - // 001-file-exec-and-symbols "/path/to/file" - // 001target create "/path/to/file" - // ^ -- command starts here (in both cases) - // Also possible case when command not found: - // 001 - // ^ -- i.e. only tokens are present (or empty string at all) - const size_t nCommandOffset = vTextLine.find_first_not_of(digits); - - // 2. Check if command is empty - // For example: - // 001-file-exec-and-symbols "/path/to/file" - // 001target create "/path/to/file" - // ^ -- command not empty (in both cases) - // or: - // 001 - // ^ -- command wasn't found - const bool bIsEmptyCommand = (nCommandOffset == CMIUtilString::npos); - - // 3. Check and exit if it isn't a CLI command - // For example: - // 001-file-exec-and-symbols "/path/to/file" - // 001 - // ^ -- it isn't CLI command (in both cases) - // or: - // 001target create "/path/to/file" - // ^ -- it's CLI command - const bool bIsCliCommand = - !bIsEmptyCommand && (vTextLine.at(nCommandOffset) != '-'); - if (!bIsCliCommand) - return vTextLine; - - // 4. Wrap CLI command to make it MI-compatible - // - // 001target create "/path/to/file" - // ^^^ -- token - const std::string vToken(vTextLine.begin(), - vTextLine.begin() + nCommandOffset); - // 001target create "/path/to/file" - // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -- CLI command - const CMIUtilString vCliCommand(std::string(vTextLine, nCommandOffset)); - - // 5. Escape special characters and embed the command in a string - // Result: it looks like -- target create \"/path/to/file\". - const std::string vShieldedCliCommand(vCliCommand.AddSlashes()); - - // 6. Turn the CLI command into an MI command, as in: - // 001-interpreter-exec command "target create \"/path/to/file\"" - // ^^^ -- token - // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ -- wrapper - // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -- shielded - // CLI command - return CMIUtilString::Format("%s-interpreter-exec command \"%s\"", - vToken.c_str(), vShieldedCliCommand.c_str()); -} - -//++ -// Details: Interpret the text data and match against current commands to see if -// there -// is a match. If a match then the command is issued and actioned on. -// If a -// command cannot be found to match then vwbCmdYesValid is set to false -// and -// nothing else is done here. -// This function is used by the application's main thread. -// Type: Method. -// Args: vTextLine - (R) Text data representing a possible command. -// vwbCmdYesValid - (W) True = Command valid, false = command not -// handled. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::InterpretCommandThisDriver(const CMIUtilString &vTextLine, - bool &vwbCmdYesValid) { - // Convert any CLI commands into MI commands - const CMIUtilString vMITextLine(WrapCLICommandIntoMICommand(vTextLine)); - - vwbCmdYesValid = false; - bool bCmdNotInCmdFactor = false; - SMICmdData cmdData; - CMICmdMgr &rCmdMgr = CMICmdMgr::Instance(); - if (!rCmdMgr.CmdInterpret(vMITextLine, vwbCmdYesValid, bCmdNotInCmdFactor, - cmdData)) - return MIstatus::failure; - - if (vwbCmdYesValid) { - // For debugging only - // m_pLog->WriteLog( cmdData.strMiCmdAll.c_str() ); - - return ExecuteCommand(cmdData); - } - - // Check for escape character, may be cursor control characters - // This code is not necessary for application operation, just want to keep - // tabs on what - // has been given to the driver to try and interpret. - if (vMITextLine.at(0) == 27) { - CMIUtilString logInput(MIRSRC(IDS_STDIN_INPUT_CTRL_CHARS)); - for (MIuint i = 0; i < vMITextLine.length(); i++) { - logInput += CMIUtilString::Format("%d ", vMITextLine.at(i)); - } - m_pLog->WriteLog(logInput); - return MIstatus::success; - } - - // Write to the Log that a 'command' was not valid. - // Report back to the MI client via MI result record. - CMIUtilString strNotInCmdFactory; - if (bCmdNotInCmdFactor) - strNotInCmdFactory = CMIUtilString::Format( - MIRSRC(IDS_DRIVER_CMD_NOT_IN_FACTORY), cmdData.strMiCmd.c_str()); - const CMIUtilString strNot( - CMIUtilString::Format("%s ", MIRSRC(IDS_WORD_NOT))); - const CMIUtilString msg(CMIUtilString::Format( - MIRSRC(IDS_DRIVER_CMD_RECEIVED), vMITextLine.c_str(), strNot.c_str(), - strNotInCmdFactory.c_str())); - const CMICmnMIValueConst vconst = CMICmnMIValueConst(msg); - const CMICmnMIValueResult valueResult("msg", vconst); - const CMICmnMIResultRecord miResultRecord( - cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, - valueResult); - const bool bOk = m_rStdOut.WriteMIResponse(miResultRecord.GetString()); - - // Proceed to wait for or execute next command - return bOk; -} - -//++ -// Details: Having previously had the potential command validated and found -// valid now -// get the command executed. -// This function is used by the application's main thread. -// Type: Method. -// Args: vCmdData - (RW) Command meta data. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriver::ExecuteCommand(const SMICmdData &vCmdData) { - CMICmdMgr &rCmdMgr = CMICmdMgr::Instance(); - return rCmdMgr.CmdExecute(vCmdData); -} - -//++ -// Details: Set the MI Driver's exit application flag. The application checks -// this flag -// after every stdin line is read so the exit may not be instantaneous. -// If vbForceExit is false the MI Driver queries its state and -// determines if is -// should exit or continue operating depending on that running state. -// This is related to the running state of the MI driver. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIDriver::SetExitApplicationFlag(const bool vbForceExit) { - if (vbForceExit) { - CMIUtilThreadLock lock(m_threadMutex); - m_bExitApp = true; - return; - } - - // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM - // Did we receive a SIGINT from the client during a running debug program, if - // so then SIGINT is not to be taken as meaning kill the MI driver application - // but halt the inferior program being debugged instead - if (m_eCurrentDriverState == eDriverState_RunningDebugging) { - InterpretCommand("-exec-interrupt"); - return; - } - - m_bExitApp = true; -} - -//++ -// Details: Get the MI Driver's exit exit application flag. -// This is related to the running state of the MI driver. -// Type: Method. -// Args: None. -// Return: bool - True = MI Driver is shutting down, false = MI driver is -// running. -// Throws: None. -//-- -bool CMIDriver::GetExitApplicationFlag() const { return m_bExitApp; } - -//++ -// Details: Get the current running state of the MI Driver. -// Type: Method. -// Args: None. -// Return: DriverState_e - The current running state of the application. -// Throws: None. -//-- -CMIDriver::DriverState_e CMIDriver::GetCurrentDriverState() const { - return m_eCurrentDriverState; -} - -//++ -// Details: Set the current running state of the MI Driver to running and -// currently not in -// a debug session. -// Type: Method. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Return: DriverState_e - The current running state of the application. -// Throws: None. -//-- -bool CMIDriver::SetDriverStateRunningNotDebugging() { - // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM - - if (m_eCurrentDriverState == eDriverState_RunningNotDebugging) - return MIstatus::success; - - // Driver cannot be in the following states to set - // eDriverState_RunningNotDebugging - switch (m_eCurrentDriverState) { - case eDriverState_NotRunning: - case eDriverState_Initialising: - case eDriverState_ShuttingDown: { - SetErrorDescription(MIRSRC(IDS_DRIVER_ERR_DRIVER_STATE_ERROR)); - return MIstatus::failure; - } - case eDriverState_RunningDebugging: - case eDriverState_RunningNotDebugging: - break; - case eDriverState_count: - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_CODE_ERR_INVALID_ENUMERATION_VALUE), - "SetDriverStateRunningNotDebugging()")); - return MIstatus::failure; - } - - // Driver must be in this state to set eDriverState_RunningNotDebugging - if (m_eCurrentDriverState != eDriverState_RunningDebugging) { - SetErrorDescription(MIRSRC(IDS_DRIVER_ERR_DRIVER_STATE_ERROR)); - return MIstatus::failure; - } - - m_eCurrentDriverState = eDriverState_RunningNotDebugging; - - return MIstatus::success; -} - -//++ -// Details: Set the current running state of the MI Driver to running and -// currently not in -// a debug session. The driver's state must in the state running and in -// a -// debug session to set this new state. -// Type: Method. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Return: DriverState_e - The current running state of the application. -// Throws: None. -//-- -bool CMIDriver::SetDriverStateRunningDebugging() { - // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM - - if (m_eCurrentDriverState == eDriverState_RunningDebugging) - return MIstatus::success; - - // Driver cannot be in the following states to set - // eDriverState_RunningDebugging - switch (m_eCurrentDriverState) { - case eDriverState_NotRunning: - case eDriverState_Initialising: - case eDriverState_ShuttingDown: { - SetErrorDescription(MIRSRC(IDS_DRIVER_ERR_DRIVER_STATE_ERROR)); - return MIstatus::failure; - } - case eDriverState_RunningDebugging: - case eDriverState_RunningNotDebugging: - break; - case eDriverState_count: - SetErrorDescription( - CMIUtilString::Format(MIRSRC(IDS_CODE_ERR_INVALID_ENUMERATION_VALUE), - "SetDriverStateRunningDebugging()")); - return MIstatus::failure; - } - - // Driver must be in this state to set eDriverState_RunningDebugging - if (m_eCurrentDriverState != eDriverState_RunningNotDebugging) { - SetErrorDescription(MIRSRC(IDS_DRIVER_ERR_DRIVER_STATE_ERROR)); - return MIstatus::failure; - } - - m_eCurrentDriverState = eDriverState_RunningDebugging; - - return MIstatus::success; -} - -//++ -// Details: Prepare the client IDE so it will start working/communicating with -// *this MI -// driver. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMIDriver::InitClientIDEToMIDriver() const { - // Put other IDE init functions here - return InitClientIDEEclipse(); -} - -//++ -// Details: The IDE Eclipse when debugging locally expects "(gdb)\n" character -// sequence otherwise it refuses to communicate and times out. This -// should be -// sent to Eclipse before anything else. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMIDriver::InitClientIDEEclipse() const { - return CMICmnStreamStdout::WritePrompt(); -} - -//++ -// Details: Ask *this driver whether it found an executable in the MI Driver's -// list of -// arguments which to open and debug. If so instigate commands to set -// up a debug -// session for that executable. -// Type: Method. -// Args: None. -// Return: bool - True = True = Yes executable given as one of the parameters -// to the MI -// Driver. -// False = not found. -// Throws: None. -//-- -bool CMIDriver::HaveExecutableFileNamePathOnCmdLine() const { - return m_bHaveExecutableFileNamePathOnCmdLine; -} - -//++ -// Details: Retrieve from *this driver executable file name path to start a -// debug session -// with (if present see HaveExecutableFileNamePathOnCmdLine()). -// Type: Method. -// Args: None. -// Return: CMIUtilString & - Executeable file name path or empty string. -// Throws: None. -//-- -const CMIUtilString &CMIDriver::GetExecutableFileNamePathOnCmdLine() const { - return m_strCmdLineArgExecuteableFileNamePath; -} - -//++ -// Details: Execute commands (by injecting them into the stdin line queue -// container) and -// other code to set up the MI Driver such that is can take the -// executable -// argument passed on the command and create a debug session for it. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functionality succeeded. -// MIstatus::failure - Functionality failed. -// Throws: None. -//-- -bool CMIDriver::LocalDebugSessionStartupExecuteCommands() { - const CMIUtilString strCmd(CMIUtilString::Format( - "-file-exec-and-symbols \"%s\"", - m_strCmdLineArgExecuteableFileNamePath.AddSlashes().c_str())); - bool bOk = CMICmnStreamStdout::TextToStdout(strCmd); - bOk = bOk && InterpretCommand(strCmd); - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - return bOk; -} - -//++ -// Details: Set the MI Driver into "its debugging an executable passed as an -// argument" -// mode as against running via a client like Eclipse. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIDriver::SetDriverDebuggingArgExecutable() { - m_bDriverDebuggingArgExecutable = true; -} - -//++ -// Details: Retrieve the MI Driver state indicating if it is operating in "its -// debugging -// an executable passed as an argument" mode as against running via a -// client -// like Eclipse. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -bool CMIDriver::IsDriverDebuggingArgExecutable() const { - return m_bDriverDebuggingArgExecutable; -} - -//++ -// Details: Execute commands from command source file in specified mode, and -// set exit-flag if needed. -// Type: Method. -// Args: vbAsyncMode - (R) True = execute commands in asynchronous -// mode, false = otherwise. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -bool CMIDriver::ExecuteCommandFile(const bool vbAsyncMode) { - std::ifstream ifsStartScript(m_strCmdLineArgCommandFileNamePath.c_str()); - if (!ifsStartScript.is_open()) { - const CMIUtilString errMsg( - CMIUtilString::Format(MIRSRC(IDS_UTIL_FILE_ERR_OPENING_FILE_UNKNOWN), - m_strCmdLineArgCommandFileNamePath.c_str())); - SetErrorDescription(errMsg.c_str()); - const bool bForceExit = true; - SetExitApplicationFlag(bForceExit); - return MIstatus::failure; - } - - // Switch lldb to synchronous mode - CMICmnLLDBDebugSessionInfo &rSessionInfo( - CMICmnLLDBDebugSessionInfo::Instance()); - const bool bAsyncSetting = rSessionInfo.GetDebugger().GetAsync(); - rSessionInfo.GetDebugger().SetAsync(vbAsyncMode); - - // Execute commands from file - bool bOk = MIstatus::success; - CMIUtilString strCommand; - while (!m_bExitApp && std::getline(ifsStartScript, strCommand)) { - // Print command - bOk = CMICmnStreamStdout::TextToStdout(strCommand); - - // Skip if it's a comment or empty line - if (strCommand.empty() || strCommand[0] == '#') - continue; - - // Execute if no error - if (bOk) { - CMIUtilThreadLock lock(rSessionInfo.GetSessionMutex()); - bOk = InterpretCommand(strCommand); - } - - // Draw the prompt after command will be executed (if enabled) - bOk = bOk && CMICmnStreamStdout::WritePrompt(); - - // Exit if there is an error - if (!bOk) { - const bool bForceExit = true; - SetExitApplicationFlag(bForceExit); - break; - } - - // Wait while the handler thread handles incoming events - CMICmnLLDBDebugger::Instance().WaitForHandleEvent(); - } - - // Switch lldb back to initial mode - rSessionInfo.GetDebugger().SetAsync(bAsyncSetting); - - return bOk; -} - -//++ -// Details: Gets called when lldb-mi gets a signal. Stops the process if it was -// SIGINT. -// -// Type: Method. -// Args: signal that was delivered -// Return: None. -// Throws: None. -//-- -void CMIDriver::DeliverSignal(int signal) { - if (signal == SIGINT && - (m_eCurrentDriverState == eDriverState_RunningDebugging)) - InterpretCommand("-exec-interrupt"); -} diff --git a/lldb/tools/lldb-mi/MIDriverBase.h b/lldb/tools/lldb-mi/MIDriverBase.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIDriverBase.h +++ /dev/null @@ -1,67 +0,0 @@ -//===-- MIDriverBase.h ------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers: -#include "lldb/API/SBBroadcaster.h" -#include "lldb/API/SBDebugger.h" - -// In-house headers: -#include "MIUtilString.h" - -// Declarations: -namespace lldb { -class SBBroadcaster; -} - -//++ -//============================================================================ -// Details: MI driver base implementation class. This class has been created so -// not have to edit the lldb::SBBroadcaster class code. Functionality -// and attributes need to be common to the LLDB Driver class and the -// MI Driver class (derived from lldb::SBBroadcaster) so they can call -// upon each other for functionality fall through and allow the -// CDriverMgr to manage either (any) driver to be operated on. -// Each driver instance (the CMIDriver, LLDB::Driver) has its own -// LLDB::SBDebugger object. -//-- -class CMIDriverBase { - // Methods: -public: - /* ctor */ CMIDriverBase(); - - CMIDriverBase *GetDriverToFallThruTo() const; - CMIDriverBase *GetDriversParent() const; - - // Overrideable: -public: - /* dtor */ virtual ~CMIDriverBase(); - - virtual bool DoFallThruToAnotherDriver(const CMIUtilString &vCmd, - CMIUtilString &vwErrMsg); - virtual bool SetDriverToFallThruTo(const CMIDriverBase &vrOtherDriver); - virtual bool SetDriverParent(const CMIDriverBase &vrOtherDriver); - virtual const CMIUtilString &GetDriverName() const = 0; - virtual const CMIUtilString &GetDriverId() const = 0; - virtual void SetExitApplicationFlag(const bool vbForceExit); - - // MI provide information for the pass through (child) assigned driver - virtual FILE *GetStdin() const; - virtual FILE *GetStdout() const; - virtual FILE *GetStderr() const; - - // Attributes: -protected: - CMIDriverBase *m_pDriverFallThru; // Child driver to use should *this driver - // not be able to handle client input - CMIDriverBase *m_pDriverParent; // The parent driver who passes work to *this - // driver to do work - CMIUtilString m_strDriverId; - bool m_bExitApp; // True = Yes, exit application, false = continue execution -}; diff --git a/lldb/tools/lldb-mi/MIDriverBase.cpp b/lldb/tools/lldb-mi/MIDriverBase.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIDriverBase.cpp +++ /dev/null @@ -1,179 +0,0 @@ -//===-- MIDriverBase.cpp ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers: -#include "lldb/API/SBBroadcaster.h" -#include "lldb/API/SBEvent.h" - -// In-house headers: -#include "MIDriverBase.h" - -//++ -// Details: CMIDriverBase constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIDriverBase::CMIDriverBase() - : m_pDriverFallThru(nullptr), m_pDriverParent(nullptr), m_bExitApp(false) {} - -//++ -// Details: CMIDriverBase destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIDriverBase::~CMIDriverBase() { m_pDriverFallThru = nullptr; } - -//++ -// Details: This function allows *this driver to call on another driver to -// perform work -// should this driver not be able to handle the client data input. -// Type: Overrideable. -// Check the error message if the function returns a failure. -// Type: Overridden. -// Args: vCmd - (R) Command instruction to interpret. -// vwErrMsg - (W) Status description on command failing. -// Return: MIstatus::success - Command succeeded. -// MIstatus::failure - Command failed. -// Throws: None. -//-- -bool CMIDriverBase::DoFallThruToAnotherDriver(const CMIUtilString &vCmd, - CMIUtilString &vwErrMsg) { - // Do nothing - override and implement. Use m_pDriverFallThru. - return MIstatus::success; -} - -//++ -// Details: This function allows *this driver to call on another driver to -// perform work -// should this driver not be able to handle the client data input. -// Type: Overrideable. -// Args: vrOtherDriver - (R) Reference to another driver object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriverBase::SetDriverToFallThruTo(const CMIDriverBase &vrOtherDriver) { - MIunused(vrOtherDriver); - - // Do nothing - override and implement. Set m_pDriverFallThru. - - return MIstatus::success; -} - -//++ -// Details: This function allows *this driver to call functionality on the -// parent driver -// ask for information for example. -// Type: Overrideable. -// Args: vrOtherDriver - (R) Reference to another driver object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriverBase::SetDriverParent(const CMIDriverBase &vrOtherDriver) { - MIunused(vrOtherDriver); - - // Do nothing - override and implement. Set m_pDriverParent. - - return MIstatus::success; -} - -//++ -// Details: Retrieve the parent driver to *this driver if one assigned. If -// assigned *this -// is the pass through driver that the parent driver passes work to. -// Type: Method. -// Args: None. -// Return: CMIDriverBase * - Pointer to a driver object. -// - NULL = there is not parent to *this driver. -// Throws: None. -//-- -CMIDriverBase *CMIDriverBase::GetDriversParent() const { - return m_pDriverParent; -} - -//++ -// Details: Retrieve the pointer to the other fall through driver *this driver -// is using -// (or not using). -// Type: Method. -// Args: None. -// Return: CMIDriverBase * - Pointer to other driver. -// - NULL if no driver set. -// Throws: None. -//-- -CMIDriverBase *CMIDriverBase::GetDriverToFallThruTo() const { - return m_pDriverFallThru; -} - -//++ -// Details: *this driver provides a file stream to other drivers on which *this -// driver -// write's out to and they read as expected input. *this driver is -// passing -// through commands to the (child) pass through assigned driver. -// Type: Overrideable. -// Args: None. -// Return: FILE * - Pointer to stream. -// Throws: None. -//-- -FILE *CMIDriverBase::GetStdin() const { - // Do nothing - override and implement - return nullptr; -} - -//++ -// Details: *this driver provides a file stream to other pass through assigned -// drivers -// so they know what to write to. -// Type: Overrideable. -// Args: None. -// Return: FILE * - Pointer to stream. -// Throws: None. -//-- -FILE *CMIDriverBase::GetStdout() const { - // Do nothing - override and implement - return nullptr; -} - -//++ -// Details: *this driver provides a error file stream to other pass through -// assigned drivers -// so they know what to write to. -// Type: Overrideable. -// Args: None. -// Return: FILE * - Pointer to stream. -// Throws: None. -//-- -FILE *CMIDriverBase::GetStderr() const { - // Do nothing - override and implement - return nullptr; -} - -//++ -// Details: Set the MI Driver's exit application flag. The application checks -// this flag -// after every stdin line is read so the exit may not be instantaneous. -// If vbForceExit is false the MI Driver queries its state and -// determines if is -// should exit or continue operating depending on that running state. -// Type: Overrideable. -// Args: vbForceExit - (R) True = Do not query, set state to exit, false = -// query if can/should exit right now. -// Return: None. -// Throws: None. -//-- -void CMIDriverBase::SetExitApplicationFlag(const bool vbForceExit) { - MIunused(vbForceExit); - - // Do nothing - override and implement -} diff --git a/lldb/tools/lldb-mi/MIDriverMain.cpp b/lldb/tools/lldb-mi/MIDriverMain.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIDriverMain.cpp +++ /dev/null @@ -1,194 +0,0 @@ -//===-- MIDriverMain.cpp ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Overview: Defines the entry point for the console application. -// The MI application (project name MI) runs in two modes: -// An LLDB native driver mode where it acts no different from the -// LLDB driver. -// The other mode is the MI when it finds on the command line -// the --interpreter option. Command line argument --help on its -// own will give -// help for the LLDB driver. If entered with --interpreter then MI -// help will -// provided. -// To implement new MI commands derive a new command class from the -// command base -// class. To enable the new command for interpretation add the new -// command class -// to the command factory. The files of relevance are: -// MICmdCommands.cpp -// MICmdBase.h / .cpp -// MICmdCmd.h / .cpp - -// Third party headers: -#include "lldb/API/SBHostOS.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/Support/PrettyStackTrace.h" -#include "llvm/Support/Signals.h" -#include -#include -#include - -// In house headers: -#include "MICmnConfig.h" -#include "MICmnResources.h" -#include "MICmnStreamStdin.h" -#include "MIDriver.h" -#include "MIDriverMgr.h" -#include "MIUtilDebug.h" -#include "Platform.h" - -#if defined(_MSC_VER) -#pragma warning( \ - once : 4530) // Warning C4530: C++ exception handler used, but unwind - // semantics are not enabled. Specify /EHsc -#endif // _MSC_VER - -// CODETAG_IOR_SIGNALS -//++ -// Details: The SIGINT signal is sent to a process by its controlling terminal -// when a -// user wishes to interrupt the process. This is typically initiated by -// pressing -// Control-C, but on some systems, the "delete" character or "break" -// key can be -// used. -// Be aware this function may be called on another thread besides the -// main thread. -// Type: Function. -// Args: vSigno - (R) Signal number. -// Return: None. -// Throws: None. -//-- -void sigint_handler(int vSigno) { -#ifdef _WIN32 // Restore handler as it is not persistent on Windows - signal(SIGINT, sigint_handler); -#endif - static std::atomic_flag g_interrupt_sent = ATOMIC_FLAG_INIT; - CMIDriverMgr &rDriverMgr = CMIDriverMgr::Instance(); - lldb::SBDebugger *pDebugger = rDriverMgr.DriverGetTheDebugger(); - if (pDebugger != nullptr) { - if (!g_interrupt_sent.test_and_set()) { - pDebugger->DispatchInputInterrupt(); - g_interrupt_sent.clear(); - } - } - - // Send signal to driver so that it can take suitable action - rDriverMgr.DeliverSignal(vSigno); -} - -//++ -// Details: Init the MI driver system. Initialize the whole driver system which -// includes -// both the original LLDB driver and the MI driver. -// Type: Function. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool DriverSystemInit() { - bool bOk = MIstatus::success; - CMIDriver &rMIDriver = CMIDriver::Instance(); - CMIDriverMgr &rDriverMgr = CMIDriverMgr::Instance(); - bOk = rDriverMgr.Initialize(); - - // Register MIDriver first as it needs to initialize and be ready - // for the Driver to get information from MIDriver when it initializes - // (LLDB Driver is registered with the Driver Manager in MI's Initialize()) - bOk = bOk && - rDriverMgr.RegisterDriver(rMIDriver, "MIDriver"); // Will be main driver - - return bOk; -} - -//++ -// Details: Shutdown the debugger system. Release / terminate resources external -// to -// specifically the MI driver. -// Type: Function. -// Args: vbAppExitOk - (R) True = No problems, false = App exiting with -// problems (investigate!). -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool DriverSystemShutdown(const bool vbAppExitOk) { - bool bOk = MIstatus::success; - - // *** Order is important here *** - CMIDriverMgr::Instance().Shutdown(); - return bOk; -} - -//++ -// Details: MI's application start point of execution. The application runs in -// two modes. -// An LLDB native driver mode where it acts no different from the LLDB -// driver. -// The other mode is the MI when it finds on the command line -// the --interpreter option. Command line argument --help on its own -// will give -// help for the LLDB driver. If entered with --interpreter then -// application -// help will provided. -// Type: Method. -// Args: argc - (R) An integer that contains the count of arguments that -// follow in -// argv. The argc parameter is always greater than or -// equal to 1. -// argv - (R) An array of null-terminated strings representing -// command-line -// arguments entered by the user of the program. By -// convention, -// argv[0] is the command with which the program is -// invoked. -// Return: int - 0 = Normal exit, program success. -// >0 = Program success with status i.e. Control-C signal -// status -// <0 = Program failed. -// -1 = Program failed reason not specified here, see MI log -// file. -// -1000 = Program failed did not initialize successfully. -// Throws: None. -//-- -int main(int argc, char const *argv[]) { -#if MICONFIG_DEBUG_SHOW_ATTACH_DBG_DLG - CMIUtilDebug::WaitForDbgAttachInfinteLoop(); -#endif // MICONFIG_DEBUG_SHOW_ATTACH_DBG_DLG - - llvm::StringRef ToolName = argv[0]; - llvm::sys::PrintStackTraceOnErrorSignal(ToolName); - llvm::PrettyStackTraceProgram X(argc, argv); - - // *** Order is important here *** - bool bOk = DriverSystemInit(); - if (!bOk) { - DriverSystemShutdown(bOk); - return -1000; - } - - // CODETAG_IOR_SIGNALS - signal(SIGINT, sigint_handler); - - bool bExiting = false; - CMIDriverMgr &rDriverMgr = CMIDriverMgr::Instance(); - bOk = bOk && rDriverMgr.ParseArgs(argc, argv, bExiting); - if (bOk && !bExiting) - bOk = rDriverMgr.DriverParseArgs(argc, argv, stdout, bExiting); - if (bOk && !bExiting) - bOk = rDriverMgr.DriverMainLoop(); - - // Logger and other resources shutdown now - DriverSystemShutdown(bOk); - - const int appResult = bOk ? 0 : -1; - - return appResult; -} diff --git a/lldb/tools/lldb-mi/MIDriverMgr.h b/lldb/tools/lldb-mi/MIDriverMgr.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIDriverMgr.h +++ /dev/null @@ -1,128 +0,0 @@ -//===-- MIDriverMgr.h -------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers: -#include "lldb/API/SBDebugger.h" -#include - -// In-house headers: -#include "MICmnBase.h" -#include "MICmnLog.h" -#include "MIUtilSingletonBase.h" -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI Driver Manager. Register lldb::SBBroadcaster derived Driver type -// objects with *this manager. The manager does not own driver objects -// registered with it and so will not delete when this manager is -// shutdown. The Driver flagged as "use this one" will be set as -// current -// driver and will be the one that is used. Other drivers are not -// operated. A Driver can call another Driver should it not handle a -// command. -// It also initializes other resources as part it's setup such as the -// Logger and Resources objects (explicit indicate *this object -// requires -// those objects (modules/components) to support it's own -// functionality). -// The Driver manager is the first object instantiated as part of the -// MI code base. It is also the first thing to interpret the command -// line arguments passed to the executable. Bases on options it -// understands the manage will set up the appropriate driver or give -// help information. Other options are passed on to the driver chosen -// to do work. -// Each driver instance (the CMIDriver, LLDB::Driver) has its own -// LLDB::SBDebugger. -// Singleton class. -//-- -class CMIDriverMgr : public CMICmnBase, public MI::ISingleton { - friend MI::ISingleton; - - // Class: -public: - //++ - // Description: Driver deriver objects need this interface to work with - // *this manager. - //-- - class IDriver { - public: - virtual bool DoInitialize() = 0; - virtual bool DoShutdown() = 0; - virtual bool DoMainLoop() = 0; - virtual lldb::SBError DoParseArgs(const int argc, const char *argv[], - FILE *vpStdOut, bool &vwbExiting) = 0; - virtual CMIUtilString GetError() const = 0; - virtual const CMIUtilString &GetName() const = 0; - virtual lldb::SBDebugger &GetTheDebugger() = 0; - virtual bool GetDriverIsGDBMICompatibleDriver() const = 0; - virtual bool SetId(const CMIUtilString &vId) = 0; - virtual const CMIUtilString &GetId() const = 0; - virtual void DeliverSignal(int signal) = 0; - - // Not part of the interface, ignore - /* dtor */ virtual ~IDriver() {} - }; - - // Methods: -public: - // MI system - bool Initialize() override; - bool Shutdown() override; - // - CMIUtilString GetAppVersion() const; - bool RegisterDriver(const IDriver &vrADriver, - const CMIUtilString &vrDriverID); - bool UnregisterDriver(const IDriver &vrADriver); - bool SetUseThisDriverToDoWork( - const IDriver &vrADriver); // Specify working main driver - IDriver *GetUseThisDriverToDoWork() const; - bool ParseArgs(const int argc, const char *argv[], bool &vwbExiting); - IDriver *GetDriver(const CMIUtilString &vrDriverId) const; - // - // MI Proxy fn to current specified working driver - bool DriverMainLoop(); - bool DriverParseArgs(const int argc, const char *argv[], FILE *vpStdOut, - bool &vwbExiting); - CMIUtilString DriverGetError() const; - CMIUtilString DriverGetName() const; - lldb::SBDebugger *DriverGetTheDebugger(); - void DeliverSignal(int signal); - - // Typedef: -private: - typedef std::map MapDriverIdToDriver_t; - typedef std::pair MapPairDriverIdToDriver_t; - - // Methods: -private: - /* ctor */ CMIDriverMgr(); - /* ctor */ CMIDriverMgr(const CMIDriverMgr &); - void operator=(const CMIDriverMgr &); - // - bool HaveDriverAlready(const IDriver &vrMedium) const; - bool UnregisterDriverAll(); - IDriver *GetFirstMIDriver() const; - IDriver *GetFirstNonMIDriver() const; - CMIUtilString GetHelpOnCmdLineArgOptions() const; - - // Overridden: -private: - // From CMICmnBase - /* dtor */ ~CMIDriverMgr() override; - - // Attributes: -private: - MapDriverIdToDriver_t m_mapDriverIdToDriver; - IDriver *m_pDriverCurrent; // This driver is used by this manager to do work. - // It is the main driver. - bool m_bInMi2Mode; // True = --interpreter entered on the cmd line, false = - // operate LLDB driver (non GDB) -}; diff --git a/lldb/tools/lldb-mi/MIDriverMgr.cpp b/lldb/tools/lldb-mi/MIDriverMgr.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIDriverMgr.cpp +++ /dev/null @@ -1,727 +0,0 @@ -//===-- MIDriverMgr.cpp -----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third Party Headers: -#include "lldb/API/SBError.h" - -// In-house headers: -#include "MICmnLog.h" -#include "MICmnLogMediumFile.h" -#include "MICmnResources.h" -#include "MICmnStreamStdout.h" -#include "MIDriver.h" -#include "MIDriverMgr.h" -#include "MIUtilSingletonHelper.h" - -//++ -// Details: CMIDriverMgr constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIDriverMgr::CMIDriverMgr() : m_pDriverCurrent(nullptr), m_bInMi2Mode(false) {} - -//++ -// Details: CMIDriverMgr destructor. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIDriverMgr::~CMIDriverMgr() { Shutdown(); } - -//++ -// Details: Initialize *this manager. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriverMgr::Initialize() { - m_clientUsageRefCnt++; - - ClrErrorDescription(); - - if (m_bInitialized) - return MIstatus::success; - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - - // Note initialisation order is important here as some resources depend on - // previous - MI::ModuleInit(IDS_MI_INIT_ERR_LOG, bOk, errMsg); - MI::ModuleInit(IDS_MI_INIT_ERR_RESOURCES, bOk, errMsg); - - m_bInitialized = bOk; - - if (!bOk) { - CMIUtilString strInitError(CMIUtilString::Format( - MIRSRC(IDS_MI_INIT_ERR_DRIVERMGR), errMsg.c_str())); - SetErrorDescription(strInitError); - return MIstatus::failure; - } - - return bOk; -} - -//++ -// Details: Unbind detach or release resources used by this server in general -// common -// functionality shared between versions of any server interfaces -// implemented. -// Type: Method. -// Args: vbAppExitOk - (R) True = No problems, false = App exiting with -// problems (investigate!). -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriverMgr::Shutdown() { - // Do not want a ref counter because this function needs to be called how ever - // this - // application stops running - // if( --m_clientUsageRefCnt > 0 ) - // return MIstatus::success; - - ClrErrorDescription(); - - if (!m_bInitialized) - return MIstatus::success; - - m_bInitialized = false; - - bool bOk = MIstatus::success; - CMIUtilString errMsg; - - // Tidy up - UnregisterDriverAll(); - - // Note shutdown order is important here - MI::ModuleShutdown(IDE_MI_SHTDWN_ERR_RESOURCES, bOk, errMsg); - MI::ModuleShutdown(IDS_MI_SHTDWN_ERR_LOG, bOk, errMsg); - - if (!bOk) { - SetErrorDescriptionn(MIRSRC(IDS_MI_SHTDWN_ERR_DRIVERMGR), errMsg.c_str()); - } - - return bOk; -} -//++ -// Details: Unregister all the Driver registered with *this manager. The manager -// also -// deletes -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriverMgr::UnregisterDriverAll() { - MapDriverIdToDriver_t::const_iterator it = m_mapDriverIdToDriver.begin(); - while (it != m_mapDriverIdToDriver.end()) { - IDriver *pDriver = (*it).second; - pDriver->DoShutdown(); - - // Next - ++it; - } - - m_mapDriverIdToDriver.clear(); - m_pDriverCurrent = nullptr; - - return MIstatus::success; -} - -//++ -// Details: Register a driver with *this Driver Manager. Call -// SetUseThisDriverToDoWork() -// inform the manager which driver is the one to the work. The manager -// calls -// the driver's init function which must be successful in order to -// complete the -// registration. -// Type: Method. -// Args: vrDriver - (R) The driver to register. -// vrDriverID - (R) The driver's ID to lookup by. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriverMgr::RegisterDriver(const IDriver &vrDriver, - const CMIUtilString &vrDriverID) { - if (HaveDriverAlready(vrDriver)) - return MIstatus::success; - - IDriver *pDriver = const_cast(&vrDriver); - if (!pDriver->SetId(vrDriverID)) - return MIstatus::failure; - if (!pDriver->DoInitialize()) { - SetErrorDescriptionn(MIRSRC(IDS_DRIVERMGR_DRIVER_ERR_INIT), - pDriver->GetName().c_str(), vrDriverID.c_str(), - pDriver->GetError().c_str()); - return MIstatus::failure; - } - - MapPairDriverIdToDriver_t pr(vrDriverID, pDriver); - m_mapDriverIdToDriver.insert(pr); - - return MIstatus::success; -} - -//++ -// Details: Query the Driver Manager to see if *this manager has the driver -// already -// registered. -// Type: Method. -// Args: vrDriver - (R) The driver to query. -// Return: True - registered. -// False - not registered. -// Throws: None. -//-- -bool CMIDriverMgr::HaveDriverAlready(const IDriver &vrDriver) const { - MapDriverIdToDriver_t::const_iterator it = m_mapDriverIdToDriver.begin(); - while (it != m_mapDriverIdToDriver.end()) { - const IDriver *pDrvr = (*it).second; - if (pDrvr == &vrDriver) - return true; - - // Next - ++it; - } - - return false; -} - -//++ -// Details: Unregister a driver from the Driver Manager. Call the -// SetUseThisDriverToDoWork() -// function to define another driver to do work if the one being -// unregistered did -// the work previously. -// Type: Method. -// Args: vrDriver - (R) The driver to unregister. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriverMgr::UnregisterDriver(const IDriver &vrDriver) { - const IDriver *pDrvr = nullptr; - MapDriverIdToDriver_t::const_iterator it = m_mapDriverIdToDriver.begin(); - while (it != m_mapDriverIdToDriver.end()) { - pDrvr = (*it).second; - if (pDrvr == &vrDriver) - break; - - // Next - ++it; - } - m_mapDriverIdToDriver.erase(it); - - if (m_pDriverCurrent == pDrvr) - m_pDriverCurrent = nullptr; - - return MIstatus::success; -} - -//++ -// Details: Specify the driver to do work. The Driver Manager drives this -// driver. Any -// previous driver doing work is not called anymore (so be sure the -// previous -// driver is in a tidy state before stopping it working). -// Type: Method. -// Args: vrADriver - (R) A lldb::SBBroadcaster/IDriver derived object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriverMgr::SetUseThisDriverToDoWork(const IDriver &vrADriver) { - m_pDriverCurrent = const_cast(&vrADriver); - - const CMIUtilString msg( - CMIUtilString::Format(MIRSRC(IDS_DRIVER_SAY_DRIVER_USING), - m_pDriverCurrent->GetName().c_str())); - m_pLog->Write(msg, CMICmnLog::eLogVerbosity_Log); - - m_bInMi2Mode = m_pDriverCurrent->GetDriverIsGDBMICompatibleDriver(); - - return MIstatus::success; -} - -//++ -// Details: Ask *this manager which driver is currently doing the work. -// Type: Method. -// Args: None. -// Return: IDriver * - Pointer to a driver, NULL if there is no current working -// driver. -// Throws: None. -//-- -CMIDriverMgr::IDriver *CMIDriverMgr::GetUseThisDriverToDoWork() const { - return m_pDriverCurrent; -} - -//++ -// Details: Call this function puts *this driver to work. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriverMgr::DriverMainLoop() { - if (m_pDriverCurrent != nullptr) { - if (!m_pDriverCurrent->DoMainLoop()) { - const CMIUtilString errMsg( - CMIUtilString::Format(MIRSRC(IDS_DRIVER_ERR_MAINLOOP), - m_pDriverCurrent->GetError().c_str())); - CMICmnStreamStdout::Instance().Write(errMsg, true); - return MIstatus::failure; - } - } else { - const CMIUtilString errMsg(MIRSRC(IDS_DRIVER_ERR_CURRENT_NOT_SET)); - CMICmnStreamStdout::Instance().Write(errMsg, true); - return MIstatus::failure; - } - - return MIstatus::success; -} - -//++ -// Details: Get the current driver to validate executable command line -// arguments. -// Type: Method. -// Args: argc - (R) An integer that contains the count of arguments -// that follow in -// argv. The argc parameter is always greater than -// or equal to 1. -// argv - (R) An array of null-terminated strings representing -// command-line -// arguments entered by the user of the program. By -// convention, -// argv[0] is the command with which the program is -// invoked. -// vpStdOut - (R) Point to a standard output stream. -// vwbExiting - (W) True = *this want to exit, false = continue to -// work. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIDriverMgr::DriverParseArgs(const int argc, const char *argv[], - FILE *vpStdOut, bool &vwbExiting) { - if (m_pDriverCurrent == nullptr) { - const CMIUtilString errMsg(MIRSRC(IDS_DRIVER_ERR_CURRENT_NOT_SET)); - CMICmnStreamStdout::Instance().Write(errMsg, true); - return MIstatus::failure; - } - - const lldb::SBError error( - m_pDriverCurrent->DoParseArgs(argc, argv, vpStdOut, vwbExiting)); - bool bOk = !error.Fail(); - if (!bOk) { - CMIUtilString errMsg; - const char *pErrorCstr = error.GetCString(); - if (pErrorCstr != nullptr) - errMsg = CMIUtilString::Format(MIRSRC(IDS_DRIVER_ERR_PARSE_ARGS), - m_pDriverCurrent->GetName().c_str(), - pErrorCstr); - else - errMsg = CMIUtilString::Format(MIRSRC(IDS_DRIVER_ERR_PARSE_ARGS_UNKNOWN), - m_pDriverCurrent->GetName().c_str()); - - bOk = CMICmnStreamStdout::Instance().Write(errMsg, true); - } - - return bOk; -} - -//++ -// Details: Retrieve the current driver's last error condition. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Text description. -// Throws: None. -//-- -CMIUtilString CMIDriverMgr::DriverGetError() const { - if (m_pDriverCurrent != nullptr) - return m_pDriverCurrent->GetError(); - else { - const CMIUtilString errMsg(MIRSRC(IDS_DRIVER_ERR_CURRENT_NOT_SET)); - CMICmnStreamStdout::Instance().Write(errMsg, true); - } - - return CMIUtilString(); -} - -//++ -// Details: Retrieve the current driver's name. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Driver name. -// Empty string = no current working driver specified. -// Throws: None. -//-- -CMIUtilString CMIDriverMgr::DriverGetName() const { - if (m_pDriverCurrent != nullptr) - return m_pDriverCurrent->GetName(); - else { - const CMIUtilString errMsg(MIRSRC(IDS_DRIVER_ERR_CURRENT_NOT_SET)); - CMICmnStreamStdout::Instance().Write(errMsg, true); - } - - return CMIUtilString(); -} - -//++ -// Details: Retrieve the current driver's debugger object. -// Type: Method. -// Args: None. -// Return: lldb::SBDebugger * - Ptr to driver's debugger object. -// - NULL = no current working driver specified. -// Throws: None. -//-- -lldb::SBDebugger *CMIDriverMgr::DriverGetTheDebugger() { - lldb::SBDebugger *pDebugger = nullptr; - if (m_pDriverCurrent != nullptr) - pDebugger = &m_pDriverCurrent->GetTheDebugger(); - else { - const CMIUtilString errMsg(MIRSRC(IDS_DRIVER_ERR_CURRENT_NOT_SET)); - CMICmnStreamStdout::Instance().Write(errMsg, true); - } - - return pDebugger; -} - -//++ -// Details: Check the arguments given on the command line. The main purpose of -// this -// function is to check for the presence of the --interpreter option. -// Having -// this option present tells *this manager to set the CMIDriver to do -// work. If -// not use the LLDB driver. The following are options that are only -// handled by -// the CMIDriverMgr are: -// --help or -h -// --interpreter -// --version -// --versionLong -// --log -// --executable -// --log-dir -// The above arguments are not handled by any driver object except for -// --executable. -// The options --interpreter and --executable in code act very similar. -// The -// --executable is necessary to differentiate whither the MI Driver is -// being using -// by a client i.e. Eclipse or from the command line. Eclipse issues -// the option -// --interpreter and also passes additional arguments which can be -// interpreted as an -// executable if called from the command line. Using --executable tells -// the MI -// Driver is being called the command line and that the executable -// argument is indeed -// a specified executable an so actions commands to set up the -// executable for a -// debug session. Using --interpreter on the command line does not -// action additional -// commands to initialise a debug session and so be able to launch the -// process. The directory -// where the log file is created is specified using --log-dir. -// Type: Method. -// Args: argc - (R) An integer that contains the count of arguments -// that follow in -// argv. The argc parameter is always greater than -// or equal to 1. -// argv - (R) An array of null-terminated strings representing -// command-line -// arguments entered by the user of the program. By -// convention, -// argv[0] is the command with which the program is -// invoked. -// vwbExiting - (W) True = *this want to exit, Reasons: help, -// invalid arg(s), -// version information only. -// False = Continue to work, start debugger i.e. -// Command -// interpreter. -// Return: lldb::SBError - LLDB current error status. -// Throws: None. -//-- -bool CMIDriverMgr::ParseArgs(const int argc, const char *argv[], - bool &vwbExiting) { - bool bOk = MIstatus::success; - - vwbExiting = false; - - // Print MI application path to the Log file - const CMIUtilString appPath( - CMIUtilString::Format(MIRSRC(IDS_MI_APP_FILEPATHNAME), argv[0])); - bOk = m_pLog->Write(appPath, CMICmnLog::eLogVerbosity_Log); - - // Print application arguments to the Log file - const bool bHaveArgs(argc >= 2); - CMIUtilString strArgs(MIRSRC(IDS_MI_APP_ARGS)); - if (!bHaveArgs) { - strArgs += MIRSRC(IDS_WORD_NONE); - bOk = bOk && m_pLog->Write(strArgs, CMICmnLog::eLogVerbosity_Log); - } else { - for (MIint i = 1; i < argc; i++) { - strArgs += CMIUtilString::Format("%d:'%s' ", i, - CMIUtilString::WithNullAsEmpty(argv[i])); - } - bOk = bOk && m_pLog->Write(strArgs, CMICmnLog::eLogVerbosity_Log); - } - - // Look for the command line options - bool bHaveArgInterpret = false; - bool bHaveArgVersion = false; - bool bHaveArgVersionLong = false; - bool bHaveArgLog = false; - bool bHaveArgLogDir = false; - bool bHaveArgHelp = false; - CMIUtilString strLogDir; - - bHaveArgInterpret = true; - if (bHaveArgs) { - // CODETAG_MIDRIVE_CMD_LINE_ARG_HANDLING - for (MIint i = 1; i < argc; i++) { - // *** Add args to help in GetHelpOnCmdLineArgOptions() *** - const CMIUtilString strArg(argv[i]); - - // Argument "--executable" is also check for in CMIDriver::ParseArgs() - if (("--interpreter" == strArg) || // Given by the client such as Eclipse - ("--executable" == strArg)) // Used to specify that there - // is executable argument also - // on the command line - { // See fn description. - bHaveArgInterpret = true; - } - if ("--version" == strArg) { - bHaveArgVersion = true; - } - if ("--versionLong" == strArg) { - bHaveArgVersionLong = true; - } - if ("--log" == strArg) { - bHaveArgLog = true; - } - if (0 == strArg.compare(0, 10, "--log-dir=")) { - strLogDir = strArg.substr(10, CMIUtilString::npos); - bHaveArgLogDir = true; - } - if (("--help" == strArg) || ("-h" == strArg)) { - bHaveArgHelp = true; - } - } - } - - if (bHaveArgLog) { - CMICmnLog::Instance().SetEnabled(true); - } - - if (bHaveArgLogDir) { - bOk = bOk && CMICmnLogMediumFile::Instance().SetDirectory(strLogDir); - } - - // Todo: Remove this output when MI is finished. It is temporary to persuade - // Eclipse plugin to work. - // Eclipse reads this literally and will not work unless it gets this - // exact version text. - // Handle --version option (ignore the --interpreter option if present) - if (bHaveArgVersion) { - vwbExiting = true; - bOk = bOk && - CMICmnStreamStdout::Instance().WriteMIResponse( - MIRSRC(IDE_MI_VERSION_GDB)); - return bOk; - } - - // Todo: Make this the --version when the above --version version is removed - // Handle --versionlong option (ignore the --interpreter option if present) - if (bHaveArgVersionLong) { - vwbExiting = true; - bOk = - bOk && CMICmnStreamStdout::Instance().WriteMIResponse(GetAppVersion()); - return bOk; - } - - // Both '--help' and '--interpreter' means give help for MI only. Without - // '--interpreter' help the LLDB driver is working and so help is for that. - if (bHaveArgHelp && bHaveArgInterpret) { - vwbExiting = true; - bOk = bOk && - CMICmnStreamStdout::Instance().WriteMIResponse( - GetHelpOnCmdLineArgOptions()); - return bOk; - } - - // This makes the assumption that there is at least one MI compatible - // driver registered and one LLDB driver registered and the CMIDriver - // is the first one found. - // ToDo: Implement a better solution that handle any order, any number - // of drivers. Or this 'feature' may be removed if deemed not required. - IDriver *pLldbDriver = GetFirstNonMIDriver(); - IDriver *pMi2Driver = GetFirstMIDriver(); - if (bHaveArgInterpret && (pMi2Driver != nullptr)) - bOk = bOk && SetUseThisDriverToDoWork(*pMi2Driver); - else if (pLldbDriver != nullptr) - bOk = bOk && SetUseThisDriverToDoWork(*pLldbDriver); - else { - if (bOk) { - vwbExiting = true; - const CMIUtilString msg(MIRSRC(IDS_DRIVER_ERR_NON_REGISTERED)); - bOk = bOk && CMICmnStreamStdout::Instance().WriteMIResponse(msg); - } - } - - return bOk; -} - -//++ -// Details: Return formatted application version and name information. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Text data. -// Throws: None. -//-- -CMIUtilString CMIDriverMgr::GetAppVersion() const { - const CMIUtilString strProj(MIRSRC(IDS_PROJNAME)); - const CMIUtilString strVsn(CMIDriver::Instance().GetVersionDescription()); - const CMIUtilString strGdb(MIRSRC(IDE_MI_VERSION_GDB)); - const CMIUtilString strVrsnInfo(CMIUtilString::Format( - "%s\n%s\n%s", strProj.c_str(), strVsn.c_str(), strGdb.c_str())); - - return strVrsnInfo; -} - -//++ -// Details: Return formatted help information on all the MI command line -// options. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Text data. -// Throws: None. -//-- -CMIUtilString CMIDriverMgr::GetHelpOnCmdLineArgOptions() const { - const CMIUtilString pHelp[] = { - MIRSRC(IDE_MI_APP_DESCRIPTION), MIRSRC(IDE_MI_APP_INFORMATION), - MIRSRC(IDE_MI_APP_ARG_USAGE), MIRSRC(IDE_MI_APP_ARG_HELP), - MIRSRC(IDE_MI_APP_ARG_VERSION), MIRSRC(IDE_MI_APP_ARG_VERSION_LONG), - MIRSRC(IDE_MI_APP_ARG_INTERPRETER), MIRSRC(IDE_MI_APP_ARG_SOURCE), - MIRSRC(IDE_MI_APP_ARG_EXECUTEABLE), - MIRSRC(IDE_MI_APP_ARG_SYNCHRONOUS), - CMIUtilString::Format( - MIRSRC(IDE_MI_APP_ARG_APP_LOG), - CMICmnLogMediumFile::Instance().GetFileName().c_str()), - MIRSRC(IDE_MI_APP_ARG_APP_LOG_DIR), MIRSRC(IDE_MI_APP_ARG_EXECUTABLE), - MIRSRC(IDS_CMD_QUIT_HELP), MIRSRC(IDE_MI_APP_ARG_EXAMPLE)}; - const MIuint nHelpItems = sizeof pHelp / sizeof pHelp[0]; - CMIUtilString strHelp; - for (MIuint i = 0; i < nHelpItems; i++) { - strHelp += pHelp[i]; - strHelp += "\n\n"; - } - - return strHelp; -} - -//++ -// Details: Search the registered drivers and return the first driver which says -// it is -// GDB/MI compatible i.e. the CMIDriver class. -// Type: Method. -// Args: None. -// Return: IDriver * - Ptr to driver, NULL = no driver found. -// Throws: None. -//-- -CMIDriverMgr::IDriver *CMIDriverMgr::GetFirstMIDriver() const { - IDriver *pDriver = nullptr; - MapDriverIdToDriver_t::const_iterator it = m_mapDriverIdToDriver.begin(); - while (it != m_mapDriverIdToDriver.end()) { - const CMIUtilString &rDrvId = (*it).first; - MIunused(rDrvId); - IDriver *pDvr = (*it).second; - if (pDvr->GetDriverIsGDBMICompatibleDriver()) { - pDriver = pDvr; - break; - } - - // Next - ++it; - } - - return pDriver; -} - -//++ -// Details: Search the registered drivers and return the first driver which says -// it is -// not GDB/MI compatible i.e. the LLDB Driver class. -// Type: Method. -// Args: None. -// Return: IDriver * - Ptr to driver, NULL = no driver found. -// Throws: None. -//-- -CMIDriverMgr::IDriver *CMIDriverMgr::GetFirstNonMIDriver() const { - IDriver *pDriver = nullptr; - MapDriverIdToDriver_t::const_iterator it = m_mapDriverIdToDriver.begin(); - while (it != m_mapDriverIdToDriver.end()) { - const CMIUtilString &rDrvId = (*it).first; - MIunused(rDrvId); - IDriver *pDvr = (*it).second; - if (!pDvr->GetDriverIsGDBMICompatibleDriver()) { - pDriver = pDvr; - break; - } - - // Next - ++it; - } - - return pDriver; -} - -//++ -// Details: Search the registered drivers and return driver with the specified -// ID. -// Type: Method. -// Args: vrDriverId - (R) ID of a driver. -// Return: IDriver * - Ptr to driver, NULL = no driver found. -// Throws: None. -//-- -CMIDriverMgr::IDriver * -CMIDriverMgr::GetDriver(const CMIUtilString &vrDriverId) const { - MapDriverIdToDriver_t::const_iterator it = - m_mapDriverIdToDriver.find(vrDriverId); - if (it == m_mapDriverIdToDriver.end()) - return nullptr; - - IDriver *pDriver = (*it).second; - - return pDriver; -} - -//++ -// Details: Gets called when lldb-mi gets a signal. Passed signal to current -// driver. -// -// Type: Method. -// Args: signal that was delivered -// Return: None. -// Throws: None. -//-- -void CMIDriverMgr::DeliverSignal(int signal) { - if (m_pDriverCurrent != nullptr) - m_pDriverCurrent->DeliverSignal(signal); -} diff --git a/lldb/tools/lldb-mi/MIExtensions.txt b/lldb/tools/lldb-mi/MIExtensions.txt deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIExtensions.txt +++ /dev/null @@ -1,104 +0,0 @@ -# -file-exec-and-symbols now takes two new (optional) options: - -Synopsis - - -file-exec-and-symbols [-p ] [-r ] - -Specify the executable file to be debugged. This file is the one from which the symbol table is also read. -When debugging remote targets specify a remote-file for execution and a file from which symbols are read. -The optional platform is the name of the platform, e.g., "remote-ios" or "ios-simulator". The remote-file -is the on-device path to the exe. - -# -data-info-line - -Synopsis - - -data-info-line *
- -data-info-line : - -Provides information about a source line. The input can be
like 0x12345678 or : -where file is a name of source file and line is the line number. As a result the command returns the following -fields: - start - address of the first instruction which refers to that source line - end - address of the last instruction which refers to that source line - file - the file name - line - the line number -The last two fields are useful in case you have specified a source line using its address. - -Example: - -data-info-line *0x100000f80 - ^done,start="0x0000000100000f80",end="0x0000000100000f94",file="/Users/IliaK/p/hello.cpp",line="15" - - -data-info-line hello.cpp:15 - ^done,start="0x0000000100000f80",end="0x0000000100000f94",file="/Users/IliaK/p/hello.cpp",line="15" - -# -data-read-memory-bytes - -Synopsis - - -data-read-memory-bytes [--thread ] [--frame ] [-o ]
- -Where: - - `address` - An expression specifying the start of the memory range to read. - `count` - Number of bytes to read. - `byte-offset` - Relative offset in bytes from `address` where reading should start. - `thread-id` - Integer identifier of the thread within which the expression should be evaluated, - if this option is omitted the currently selected thread will be used. - This option is not in the MI specification but is implemented by GDB. - `frame-index` - Index of the frame within which the expression should be evaluated, - if this option is omitted the currently selected frame will be used. - This option is not in the MI specification but is implemented by GDB. - -Reads a block of memory from the specified range. - -Note that currently this command works in an all-or-nothing fashion where it either reads the entire -block of memory successfully and returns it as a single block, or it returns an error. This doesn't -quite match up with the MI specification that says that subsets of the specified range may be -returned as individual blocks if only some of the memory within the specified range is accessible. - -The result record for this command may contain one or more tuples representing the blocks of memory -that were read, where each tuple has the following fields: - - `begin` - The start of the address range for this block (in hex notation). - `end` - The end of the address range for this block (in hex notation). - `offset` - Offset of this block from `address` (that was passed in as an argument). - `contents` - The actual data in this block (in hex notation). - -Example: - - (gdb) - -data-read-memory-bytes &array 4 - ^done,memory=[{begin="0x00007fffffffeccc",offset="0x0000000000000000",end="0x00007fffffffecd0",contents="01020304"}] - (gdb) - -# =library-loaded notification - -The =library-loaded notification has 4 extra fields: - symbols-loaded - indicates that there are symbols for the loaded library - symbols-path - if symbols are exist then it contains a path for symbols of the loaded library - loaded_addr - contains an address of the loaded library or "-" if address isn't resolved yet - size - contains the size in bytes of the section loaded at 'loaded_addr' - -For example: - =library-loaded,id="/Users/IliaK/p/hello",target-name="/Users/IliaK/p/hello",host-name="/Users/IliaK/p/hello",symbols-loaded="1",symbols-path="/Users/IliaK/p/hello.dSYM/Contents/Resources/DWARF/hello",loaded_addr="-",size="4096" - =library-loaded,id="/usr/lib/dyld",target-name="/usr/lib/dyld",host-name="/usr/lib/dyld",symbols-loaded="0",loaded_addr="0x00007fff5fc00000",size="4096" - -# -target-attach - -Synopsis - -Additional syntax provided by lldb-mi: - -target-attach -n [--waitfor] - -Attach to an executable. Using -n allows specifying an executable name to attach to. -Using this with --watifor can do a deffered attach. The flags -n and --waitfor match the syntax of lldb proper's 'process attach' command. diff --git a/lldb/tools/lldb-mi/MIReadMe.txt b/lldb/tools/lldb-mi/MIReadMe.txt deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIReadMe.txt +++ /dev/null @@ -1,37 +0,0 @@ -======================================================================== - The MI Driver - LLDB Machine Interface V2 (MI) Project Overview -======================================================================== - -The MI Driver is a stand alone executable that either be used via a -client i.e. Eclipse or directly from the command line. - -For help information on using the MI driver type at the command line: - - lldb-mi --interpreter --help - -A blog about the MI Driver is available on CodePlay's website. Although it may not be -completely accurate after the recent changes in lldb-mi. -http://www.codeplay.com/portal/lldb-mi-driver---part-1-introduction - -In MI mode and invoked with --log option, lldb-mi generates lldb-mi-log.txt -This file keeps a history of the MI Driver's activity for one session. It is -used to aid the debugging of the MI Driver. It also gives warnings about -command's which do not support certain argument or options. - -Note any command or text sent to the MI Driver in MI mode that is not a command -registered in the MI Driver's Command Factory will be rejected and an error message -will be generated. - -All the files prefix with MI are specifically for the MI driver code only. -File MIDriverMain.cpp contains the executables main() function. - -========================================================================= -Current limitations: -1. Not all commands and their options have been implemented. Please see -the source code for details. -2. LLDB-MI may have additional arguments not used in GDB MI. Please see -MIExtensions.txt - -========================================================================= -The MI Driver build configuration: -MICmnConfig.h defines various preprocessor build options. diff --git a/lldb/tools/lldb-mi/MIUtilDateTimeStd.h b/lldb/tools/lldb-mi/MIUtilDateTimeStd.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilDateTimeStd.h +++ /dev/null @@ -1,40 +0,0 @@ -//===-- MIUtilDateTimeStd.h -------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers -#include - -// In-house headers: -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI common code utility class. Used to retrieve system local date -// time. -//-- -class CMIUtilDateTimeStd { - // Methods: -public: - /* ctor */ CMIUtilDateTimeStd(); - - CMIUtilString GetDate(); - CMIUtilString GetTime(); - CMIUtilString GetDateTimeLogFilename(); - - // Overrideable: -public: - // From CMICmnBase - /* dtor */ virtual ~CMIUtilDateTimeStd(); - - // Attributes: -private: - std::time_t m_rawTime; - char m_pScratch[16]; -}; diff --git a/lldb/tools/lldb-mi/MIUtilDateTimeStd.cpp b/lldb/tools/lldb-mi/MIUtilDateTimeStd.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilDateTimeStd.cpp +++ /dev/null @@ -1,84 +0,0 @@ -//===-- MIUtilDateTimeStd.cpp -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MIUtilDateTimeStd.h" -#include "MICmnResources.h" - -//++ -// Details: CMIUtilDateTimeStd constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilDateTimeStd::CMIUtilDateTimeStd() {} - -//++ -// Details: CMIUtilDateTimeStd destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilDateTimeStd::~CMIUtilDateTimeStd() {} - -//++ -// Details: Retrieve system local current date. Format is MM/DD/YYYY. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Text description. -// Throws: None. -//-- -CMIUtilString CMIUtilDateTimeStd::GetDate() { - CMIUtilString strDate(MIRSRC(IDS_WORD_INVALIDBRKTS)); - - std::time(&m_rawTime); - const std::tm *pTi = std::localtime(&m_rawTime); - if (std::strftime(&m_pScratch[0], sizeof(m_pScratch), "%d/%m/%y", pTi) > 0) - strDate = m_pScratch; - - return strDate; -} - -//++ -// Details: Retrieve system local current time. Format is HH:MM:SS 24 hour -// clock. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Text description. -// Throws: None. -//-- -CMIUtilString CMIUtilDateTimeStd::GetTime() { - std::time(&m_rawTime); - const std::tm *pTi = std::localtime(&m_rawTime); - const CMIUtilString seconds(CMIUtilString::Format("%d", pTi->tm_sec)); - const CMIUtilString zero((seconds.length() == 1) ? "0" : ""); - const CMIUtilString strTime(CMIUtilString::Format( - "%d:%d:%s%s", pTi->tm_hour, pTi->tm_min, zero.c_str(), seconds.c_str())); - - return strTime; -} - -//++ -// Details: Retrieve system local current date and time in yyyy-MM-dd--HH-mm-ss -// format for log file names. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Text description. -// Throws: None. -//-- -CMIUtilString CMIUtilDateTimeStd::GetDateTimeLogFilename() { - std::time(&m_rawTime); - const std::tm *pTi = std::localtime(&m_rawTime); - const CMIUtilString strTime(CMIUtilString::Format( - "%d%02d%02d%02d%02d%02d", pTi->tm_year + 1900, pTi->tm_mon, pTi->tm_mday, - pTi->tm_hour, pTi->tm_min, pTi->tm_sec)); - - return strTime; -} diff --git a/lldb/tools/lldb-mi/MIUtilDebug.h b/lldb/tools/lldb-mi/MIUtilDebug.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilDebug.h +++ /dev/null @@ -1,79 +0,0 @@ -//===-- MIUtilDebug.h -------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -#define MI_USE_DEBUG_TRACE_FN // Undefine to compile out fn trace code - -// In-house headers: -#include "MIUtilString.h" - -// Declarations: -class CMICmnLog; - -//++ -//============================================================================ -// Details: MI debugging aid utility class. -//-- -class CMIUtilDebug { - // Statics: -public: - static void WaitForDbgAttachInfinteLoop(); - - // Methods: -public: - /* ctor */ CMIUtilDebug(); - - // Overrideable: -public: - // From CMICmnBase - /* dtor */ virtual ~CMIUtilDebug(); -}; - -//++ -//============================================================================ -// Details: MI debug utility class. Used to indicate the current function -// depth in the call stack. It uses the CMIlCmnLog logger to output -// the current fn trace information. -// Use macro MI_TRACEFN( "Some fn name" ) and implement the scope of -// the functions you wish to build up a trace off. -// Use preprocessor definition MI_USE_DEBUG_TRACE_FN to turn off or on -// tracing code. -//-- -class CMIUtilDebugFnTrace { - // Methods: -public: - /* ctor */ CMIUtilDebugFnTrace(const CMIUtilString &vFnName); - - // Overrideable: -public: - // From CMICmnBase - /* dtor */ virtual ~CMIUtilDebugFnTrace(); - - // Attributes: -private: - const CMIUtilString m_strFnName; - - static CMICmnLog &ms_rLog; - static MIuint ms_fnDepthCnt; // Increment count as fn depth increases, - // decrement count as fn stack pops off -}; - -//++ -//============================================================================ -// Details: Take the given text and send it to the server's Logger to output to -// the -// trace file. -// Type: Compile preprocess. -// Args: x - (R) Message (may be seen by user). -//-- -#ifdef MI_USE_DEBUG_TRACE_FN -#define MI_TRACEFN(x) CMIUtilDebugFnTrace __MITrace(x) -#else -#define MI_TRACEFN(x) -#endif // MI_USE_DEBUG_TRACE_FN diff --git a/lldb/tools/lldb-mi/MIUtilDebug.cpp b/lldb/tools/lldb-mi/MIUtilDebug.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilDebug.cpp +++ /dev/null @@ -1,91 +0,0 @@ -//===-- MIUtilDebug.cpp -----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers: -#ifdef _WIN32 -#include -#endif - -// In-house headers: -#include "MICmnLog.h" -#include "MIDriver.h" -#include "MIUtilDebug.h" - -//++ -// Details: CMIUtilDebug constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilDebug::CMIUtilDebug() {} - -//++ -// Details: CMIUtilDebug destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilDebug::~CMIUtilDebug() {} - -//++ -// Details: Temporarily stall the process/application to give the programmer the -// opportunity to attach a debugger. How to use: Put a break in the -// programmer -// where you want to visit, run the application then attach your -// debugger to the -// application. Hit the debugger's pause button and the debugger should -// should -// show this loop. Change the i variable value to break out of the loop -// and -// visit your break point. -// Type: Static method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIUtilDebug::WaitForDbgAttachInfinteLoop() { - MIuint i = 0; - while (i == 0) { - const std::chrono::milliseconds time(100); - std::this_thread::sleep_for(time); - } -} - - -// Instantiations: -CMICmnLog &CMIUtilDebugFnTrace::ms_rLog = CMICmnLog::Instance(); -MIuint CMIUtilDebugFnTrace::ms_fnDepthCnt = 0; - -//++ -// Details: CMIUtilDebugFnTrace constructor. -// Type: Method. -// Args: vFnName - (R) The text to insert into the log. -// Return: None. -// Throws: None. -//-- -CMIUtilDebugFnTrace::CMIUtilDebugFnTrace(const CMIUtilString &vFnName) - : m_strFnName(vFnName) { - const CMIUtilString txt( - CMIUtilString::Format("%d>%s", ++ms_fnDepthCnt, m_strFnName.c_str())); - ms_rLog.Write(txt, CMICmnLog::eLogVerbosity_FnTrace); -} - -//++ -// Details: CMIUtilDebugFnTrace destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilDebugFnTrace::~CMIUtilDebugFnTrace() { - const CMIUtilString txt( - CMIUtilString::Format("%d<%s", ms_fnDepthCnt--, m_strFnName.c_str())); - ms_rLog.Write(txt, CMICmnLog::eLogVerbosity_FnTrace); -} diff --git a/lldb/tools/lldb-mi/MIUtilFileStd.h b/lldb/tools/lldb-mi/MIUtilFileStd.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilFileStd.h +++ /dev/null @@ -1,48 +0,0 @@ -//===-- MIUtilFileStd.h -----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MICmnBase.h" -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI common code utility class. File handling. -//-- -class CMIUtilFileStd : public CMICmnBase { - // Static: -public: - static char GetSlash(); - - // Methods: -public: - /* ctor */ CMIUtilFileStd(); - // - bool CreateWrite(const CMIUtilString &vFileNamePath, bool &vwrbNewCreated); - bool Write(const CMIUtilString &vData); - bool Write(const char *vpData, const MIuint vCharCnt); - void Close(); - bool IsOk() const; - bool IsFileExist(const CMIUtilString &vFileNamePath) const; - const CMIUtilString &GetLineReturn() const; - static CMIUtilString StripOffFileName(const CMIUtilString &vDirectoryPath); - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMIUtilFileStd() override; - - // Attributes: -private: - CMIUtilString m_fileNamePath; - FILE *m_pFileHandle; - CMIUtilString m_constCharNewLine; - bool m_bFileError; // True = have a file error ATM, false = all ok -}; diff --git a/lldb/tools/lldb-mi/MIUtilFileStd.cpp b/lldb/tools/lldb-mi/MIUtilFileStd.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilFileStd.cpp +++ /dev/null @@ -1,282 +0,0 @@ -//===-- MIUtilFileStd.cpp ---------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers -#include -#include -#include -#include - -// In-house headers: -#include "MICmnResources.h" -#include "MIUtilFileStd.h" -#include "lldb/Host/FileSystem.h" - -#include "llvm/Support/ConvertUTF.h" -#include "llvm/Support/Errno.h" - -//++ -// Details: CMIUtilFileStd constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilFileStd::CMIUtilFileStd() - : m_fileNamePath(CMIUtilString()), m_pFileHandle(nullptr) -#if defined(_MSC_VER) - , - m_constCharNewLine("\r\n") -#else - , - m_constCharNewLine("\n") -#endif // #if defined( _MSC_VER ) - , - m_bFileError(false) { -} - -//++ -// Details: CMIUtilFileStd destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilFileStd::~CMIUtilFileStd() { Close(); } - -//++ -// Details: Open file for writing. On the first call to this function after -// *this object -// is created the file is either created or replace, from then on open -// only opens -// an existing file. -// Type: Method. -// Args: vFileNamePath - (R) File name path. -// vwrbNewCreated - (W) True - file recreated, false - file appended -// too. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilFileStd::CreateWrite(const CMIUtilString &vFileNamePath, - bool &vwrbNewCreated) { - // Reset - m_bFileError = false; - vwrbNewCreated = false; - - if (vFileNamePath.empty()) { - m_bFileError = true; - SetErrorDescription(MIRSRC(IDS_UTIL_FILE_ERR_INVALID_PATHNAME)); - return MIstatus::failure; - } - - // File is already open so exit - if (m_pFileHandle != nullptr) - return MIstatus::success; - -#if !defined(_MSC_VER) - // Open with 'write' and 'binary' mode - m_pFileHandle = llvm::sys::RetryAfterSignal(nullptr, ::fopen, - vFileNamePath.c_str(), "wb"); -#else - // Open a file with exclusive write and shared read permissions - std::wstring path; - if (llvm::ConvertUTF8toWide(vFileNamePath.c_str(), path)) - m_pFileHandle = ::_wfsopen(path.c_str(), L"wb", _SH_DENYWR); - else { - errno = EINVAL; - m_pFileHandle = nullptr; - } -#endif // !defined( _MSC_VER ) - - if (m_pFileHandle == nullptr) { - m_bFileError = true; - SetErrorDescriptionn(MIRSRC(IDS_UTIL_FILE_ERR_OPENING_FILE), - strerror(errno), vFileNamePath.c_str()); - return MIstatus::failure; - } - - vwrbNewCreated = true; - m_fileNamePath = vFileNamePath; - - return MIstatus::success; -} - -//++ -// Details: Write data to existing opened file. -// Type: Method. -// Args: vData - (R) Text data. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilFileStd::Write(const CMIUtilString &vData) { - if (vData.size() == 0) - return MIstatus::success; - - if (m_bFileError) - return MIstatus::failure; - - if (m_pFileHandle == nullptr) { - m_bFileError = true; - SetErrorDescriptionn(MIRSRC(IDE_UTIL_FILE_ERR_WRITING_NOTOPEN), - m_fileNamePath.c_str()); - return MIstatus::failure; - } - - // Get the string size - MIuint size = vData.size(); - if (::fwrite(vData.c_str(), 1, size, m_pFileHandle) == size) { - // Flush the data to the file - ::fflush(m_pFileHandle); - return MIstatus::success; - } - - // Not all of the data has been transferred - m_bFileError = true; - SetErrorDescriptionn(MIRSRC(IDE_UTIL_FILE_ERR_WRITING_FILE), - m_fileNamePath.c_str()); - return MIstatus::failure; -} - -//++ -// Details: Write data to existing opened file. -// Type: Method. -// Args: vData - (R) Text data. -// vCharCnt - (R) Text data length. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilFileStd::Write(const char *vpData, const MIuint vCharCnt) { - if (vCharCnt == 0) - return MIstatus::success; - - if (m_bFileError) - return MIstatus::failure; - - if (m_pFileHandle == nullptr) { - m_bFileError = true; - SetErrorDescriptionn(MIRSRC(IDE_UTIL_FILE_ERR_WRITING_NOTOPEN), - m_fileNamePath.c_str()); - return MIstatus::failure; - } - - if (::fwrite(vpData, 1, vCharCnt, m_pFileHandle) == vCharCnt) { - // Flush the data to the file - ::fflush(m_pFileHandle); - return MIstatus::success; - } - - // Not all of the data has been transferred - m_bFileError = true; - SetErrorDescriptionn(MIRSRC(IDE_UTIL_FILE_ERR_WRITING_FILE), - m_fileNamePath.c_str()); - return MIstatus::failure; -} - -//++ -// Details: Close existing opened file. Note Close() must must an open! -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIUtilFileStd::Close() { - if (m_pFileHandle == nullptr) - return; - - ::fclose(m_pFileHandle); - m_pFileHandle = nullptr; - // m_bFileError = false; Do not reset as want to remain until next attempt at - // open or create -} - -//++ -// Details: Retrieve state of whether the file is ok. -// Type: Method. -// Args: None. -// Return: True - file ok. -// False - file has a problem. -// Throws: None. -//-- -bool CMIUtilFileStd::IsOk() const { return !m_bFileError; } - -//++ -// Details: Status on a file existing already. -// Type: Method. -// Args: vFileNamePath. -// Return: True - Exists. -// False - Not found. -// Throws: None. -//-- -bool CMIUtilFileStd::IsFileExist(const CMIUtilString &vFileNamePath) const { - if (vFileNamePath.empty()) - return false; - - FILE *pTmp = nullptr; - pTmp = llvm::sys::RetryAfterSignal(nullptr, ::fopen, - vFileNamePath.c_str(), "wb"); - if (pTmp != nullptr) { - ::fclose(pTmp); - return true; - } - - return false; -} - -//++ -// Details: Retrieve the file current carriage line return characters used. -// Type: Method. -// Args: None. -// Return: CMIUtilString & - Text. -// Throws: None. -//-- -const CMIUtilString &CMIUtilFileStd::GetLineReturn() const { - return m_constCharNewLine; -} - -//++ -// Details: Given a file name directory path, strip off the filename and return -// the path. -// It look for either backslash or forward slash. -// Type: Method. -// Args: vDirectoryPath - (R) Text directory path. -// Return: CMIUtilString - Directory path. -// Throws: None. -//-- -CMIUtilString -CMIUtilFileStd::StripOffFileName(const CMIUtilString &vDirectoryPath) { - const size_t nPos = vDirectoryPath.rfind('\\'); - size_t nPos2 = vDirectoryPath.rfind('/'); - if ((nPos == std::string::npos) && (nPos2 == std::string::npos)) - return vDirectoryPath; - - if (nPos > nPos2) - nPos2 = nPos; - - const CMIUtilString strPath(vDirectoryPath.substr(0, nPos2).c_str()); - return strPath; -} - -//++ -// Details: Return either backslash or forward slash appropriate to the OS this -// application -// is running on. -// Type: Static method. -// Args: None. -// Return: char - '/' or '\' character. -// Throws: None. -//-- -char CMIUtilFileStd::GetSlash() { -#if !defined(_MSC_VER) - return '/'; -#else - return '\\'; -#endif // !defined( _MSC_VER ) -} diff --git a/lldb/tools/lldb-mi/MIUtilMapIdToVariant.h b/lldb/tools/lldb-mi/MIUtilMapIdToVariant.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilMapIdToVariant.h +++ /dev/null @@ -1,129 +0,0 @@ -//===-- MIUtilMapIdToVariant.h ----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers: -#include - -// In-house headers: -#include "MICmnBase.h" -#include "MICmnResources.h" -#include "MIUtilString.h" -#include "MIUtilVariant.h" - -//++ -//============================================================================ -// Details: MI common code utility class. Map type container that hold general -// object types (by being a variant wrapper) -// objects by ID. -//-- -class CMIUtilMapIdToVariant : public CMICmnBase { - // Methods: -public: - /* ctor */ CMIUtilMapIdToVariant(); - - template bool Add(const CMIUtilString &vId, const T &vData); - void Clear(); - template - bool Get(const CMIUtilString &vId, T &vrwData, bool &vrwbFound) const; - bool HaveAlready(const CMIUtilString &vId) const; - bool IsEmpty() const; - bool Remove(const CMIUtilString &vId); - - // Overridden: -public: - // From CMICmnBase - /* dtor */ ~CMIUtilMapIdToVariant() override; - - // Typedefs: -private: - typedef std::map MapKeyToVariantValue_t; - typedef std::pair MapPairKeyToVariantValue_t; - - // Methods: -private: - bool IsValid(const CMIUtilString &vId) const; - - // Attributes: - MapKeyToVariantValue_t m_mapKeyToVariantValue; -}; - -//++ -// Details: Add to *this container a data object of general type identified by -// an ID. -// If the data with that ID already exists in the container it is -// replace with -// the new data specified. -// Type: Method. -// Args: T - The data object's variable type. -// vId - (R) Unique ID i.e. GUID. -// vData - (R) The general data object to be stored of some type. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -template -bool CMIUtilMapIdToVariant::Add(const CMIUtilString &vId, const T &vData) { - if (!IsValid(vId)) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_VARIANT_ERR_MAP_KEY_INVALID), vId.c_str())); - return MIstatus::failure; - } - - const bool bOk = HaveAlready(vId) ? Remove(vId) : MIstatus::success; - if (bOk) { - CMIUtilVariant data; - data.Set(vData); - MapPairKeyToVariantValue_t pr(vId, data); - m_mapKeyToVariantValue.insert(pr); - } - - return bOk; -} - -//++ -// Details: Retrieve a data object from *this container identified by the -// specified ID. -// Type: Method. -// Args: T - The data object's variable type. -// vId - (R) Unique ID i.e. GUID. -// vrwData - (W) Copy of the data object held. -// vrwbFound - (W) True = data found, false = data not found. -// Return: MIstatus::success - Function succeeded. -// MIstatus::failure - Function failed. -// Throws: None. -//-- -template -bool CMIUtilMapIdToVariant::Get(const CMIUtilString &vId, T &vrwData, - bool &vrwbFound) const { - vrwbFound = false; - - if (!IsValid(vId)) { - SetErrorDescription(CMIUtilString::Format( - MIRSRC(IDS_VARIANT_ERR_MAP_KEY_INVALID), vId.c_str())); - return MIstatus::failure; - } - - const MapKeyToVariantValue_t::const_iterator it = - m_mapKeyToVariantValue.find(vId); - if (it != m_mapKeyToVariantValue.end()) { - const CMIUtilVariant &rData = (*it).second; - const T *pDataObj = rData.Get(); - if (pDataObj != nullptr) { - vrwbFound = true; - vrwData = *pDataObj; - return MIstatus::success; - } else { - SetErrorDescription(MIRSRC(IDS_VARIANT_ERR_USED_BASECLASS)); - return MIstatus::failure; - } - } - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MIUtilMapIdToVariant.cpp b/lldb/tools/lldb-mi/MIUtilMapIdToVariant.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilMapIdToVariant.cpp +++ /dev/null @@ -1,99 +0,0 @@ -//===-- MIUtilMapIdToVariant.cpp --------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MIUtilMapIdToVariant.h" - -//++ -// Details: CMIUtilMapIdToVariant constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilMapIdToVariant::CMIUtilMapIdToVariant() {} - -//++ -// Details: CMIUtilMapIdToVariant destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilMapIdToVariant::~CMIUtilMapIdToVariant() {} - -//++ -// Details: Remove at the data from *this container. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIUtilMapIdToVariant::Clear() { m_mapKeyToVariantValue.clear(); } - -//++ -// Details: Check an ID is present already in *this container. -// Type: Method. -// Args: vId - (R) Unique ID i.e. GUID. -// Return: True - registered. -// False - not found. -// Throws: None. -//-- -bool CMIUtilMapIdToVariant::HaveAlready(const CMIUtilString &vId) const { - const MapKeyToVariantValue_t::const_iterator it = - m_mapKeyToVariantValue.find(vId); - return it != m_mapKeyToVariantValue.end(); -} - -//++ -// Details: Determine if *this container is currently holding any data. -// Type: Method. -// Args: None. -// Return: bool - True - Yes empty, false - one or more data object present. -// Throws: None. -//-- -bool CMIUtilMapIdToVariant::IsEmpty() const { - return m_mapKeyToVariantValue.empty(); -} - -//++ -// Details: Check the ID is valid to be registered. -// Type: Method. -// Args: vId - (R) Unique ID i.e. GUID. -// Return: True - valid. -// False - not valid. -// Throws: None. -//-- -bool CMIUtilMapIdToVariant::IsValid(const CMIUtilString &vId) const { - bool bValid = true; - - if (vId.empty()) - bValid = false; - - return bValid; -} - -//++ -// Details: Remove from *this contain a data object specified by ID. The data -// object -// when removed also calls its destructor should it have one. -// Type: Method. -// Args: vId - (R) Unique ID i.e. GUID. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilMapIdToVariant::Remove(const CMIUtilString &vId) { - const MapKeyToVariantValue_t::const_iterator it = - m_mapKeyToVariantValue.find(vId); - if (it != m_mapKeyToVariantValue.end()) { - m_mapKeyToVariantValue.erase(it); - } - - return MIstatus::success; -} diff --git a/lldb/tools/lldb-mi/MIUtilSingletonBase.h b/lldb/tools/lldb-mi/MIUtilSingletonBase.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilSingletonBase.h +++ /dev/null @@ -1,52 +0,0 @@ -//===-- MIUtilSingletonBase.h -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -namespace MI { - -// MI::ISingleton base class usage: -// -// class CMIDerivedClass -// : public MI::ISingleton< CMIDerivedClass > -// { -// friend MI::ISingleton< CMIDerivedClass >; -// -// // Overridden: -// public: -// // From MI::ISingleton -// bool Initialize() override; -// bool Shutdown() override; -// }; - -//++ -//============================================================================ -// Details: Base class for the singleton pattern. -// Gotchas: Derived class must specify MI::ISingleton<> as a friend class. -//-- -template class ISingleton { - // Statics: -public: - // Return an instance of the derived class - static T &Instance() { - // This will fail if the derived class has not - // declared itself to be a friend of MI::ISingleton - static T instance; - - return instance; - } - - // Overrideable: -public: - virtual bool Initialize() = 0; - virtual bool Shutdown() = 0; - // - /* dtor */ virtual ~ISingleton() {} -}; - -} // namespace MI diff --git a/lldb/tools/lldb-mi/MIUtilSingletonHelper.h b/lldb/tools/lldb-mi/MIUtilSingletonHelper.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilSingletonHelper.h +++ /dev/null @@ -1,81 +0,0 @@ -//===-- MIUtilSingletonHelper.h ---------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In house headers: -#include "MICmnResources.h" -#include "MIUtilString.h" - -namespace MI { - -//++ -//============================================================================ -// Details: Short cut helper function to simplify repeated initialisation of -// MI components (singletons) required by a client module. -// Type: Template method. -// Args: vErrorResrcId - (R) The string resource ID error message -// identifier to place in errMsg. -// vwrbOk - (RW) On input True = Try to initialize MI driver -// module. -// On output True = MI driver module initialise -// successfully. -// vwrErrMsg - (W) MI driver module initialise error description -// on failure. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -//-- -template -bool ModuleInit(const MIint vErrorResrcId, bool &vwrbOk, - CMIUtilString &vwrErrMsg) { - if (vwrbOk && !T::Instance().Initialize()) { - vwrbOk = MIstatus::failure; - vwrErrMsg = CMIUtilString::Format( - MIRSRC(vErrorResrcId), T::Instance().GetErrorDescription().c_str()); - } - - return vwrbOk; -} - -//++ -//============================================================================ -// Details: Short cut helper function to simplify repeated shutdown of -// MI components (singletons) required by a client module. -// Type: Template method. -// Args: vErrorResrcId - (R) The string resource ID error message -// identifier -// to place in errMsg. -// vwrbOk - (W) If not already false make false on module -// shutdown failure. -// vwrErrMsg - (RW) Append to existing error description string -// MI -// driver module initialise error description on -// failure. -// Return: True - Module shutdown succeeded. -// False - Module shutdown failed. -//-- -template -bool ModuleShutdown(const MIint vErrorResrcId, bool &vwrbOk, - CMIUtilString &vwrErrMsg) { - bool bOk = MIstatus::success; - - if (!T::Instance().Shutdown()) { - const bool bMoreThanOneError(!vwrErrMsg.empty()); - bOk = MIstatus::failure; - if (bMoreThanOneError) - vwrErrMsg += ", "; - vwrErrMsg += CMIUtilString::Format( - MIRSRC(vErrorResrcId), T::Instance().GetErrorDescription().c_str()); - } - - vwrbOk = bOk ? vwrbOk : MIstatus::failure; - - return bOk; -} - -} // namespace MI diff --git a/lldb/tools/lldb-mi/MIUtilString.h b/lldb/tools/lldb-mi/MIUtilString.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilString.h +++ /dev/null @@ -1,95 +0,0 @@ -//===-- MIUtilString.h ------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers: -#include -#include -#include -#include - -// In-house headers: -#include "MIDataTypes.h" - -//++ -//============================================================================ -// Details: MI common code utility class. Used to help handle text. -// Derived from std::string -//-- -class CMIUtilString : public std::string { - // Typedefs: -public: - typedef std::vector VecString_t; - - // Static method: -public: - static CMIUtilString Format(const char *vFormating, ...); - static CMIUtilString FormatBinary(const MIuint64 vnDecimal); - static CMIUtilString FormatValist(const CMIUtilString &vrFormating, - va_list vArgs); - static bool IsAllValidAlphaAndNumeric(const char *vpText); - static const char *WithNullAsEmpty(const char *vpText) { - return vpText ? vpText : ""; - } - static bool Compare(const CMIUtilString &vrLhs, const CMIUtilString &vrRhs); - static CMIUtilString ConvertToPrintableASCII(const char vChar, - bool bEscapeQuotes = false); - static CMIUtilString ConvertToPrintableASCII(const char16_t vChar16, - bool bEscapeQuotes = false); - static CMIUtilString ConvertToPrintableASCII(const char32_t vChar32, - bool bEscapeQuotes = false); - - // Methods: -public: - /* ctor */ CMIUtilString(); - /* ctor */ CMIUtilString(const char *vpData); - /* ctor */ CMIUtilString(const std::string &vrStr); - // - bool ExtractNumber(MIint64 &vwrNumber) const; - CMIUtilString FindAndReplace(const CMIUtilString &vFind, - const CMIUtilString &vReplaceWith) const; - bool IsNumber() const; - bool IsHexadecimalNumber() const; - bool IsQuoted() const; - CMIUtilString RemoveRepeatedCharacters(const char vChar); - size_t Split(const CMIUtilString &vDelimiter, VecString_t &vwVecSplits) const; - size_t SplitConsiderQuotes(const CMIUtilString &vDelimiter, - VecString_t &vwVecSplits) const; - size_t SplitLines(VecString_t &vwVecSplits) const; - CMIUtilString StripCREndOfLine() const; - CMIUtilString StripCRAll() const; - CMIUtilString Trim() const; - CMIUtilString Trim(const char vChar) const; - size_t FindFirst(const CMIUtilString &vrPattern, size_t vnPos = 0) const; - size_t FindFirst(const CMIUtilString &vrPattern, bool vbSkipQuotedText, - bool &vrwbNotFoundClosedQuote, size_t vnPos = 0) const; - size_t FindFirstNot(const CMIUtilString &vrPattern, size_t vnPos = 0) const; - CMIUtilString Escape(bool vbEscapeQuotes = false) const; - CMIUtilString AddSlashes() const; - CMIUtilString StripSlashes() const; - // - CMIUtilString &operator=(const char *vpRhs); - CMIUtilString &operator=(const std::string &vrRhs); - - // Overrideable: -public: - /* dtor */ virtual ~CMIUtilString(); - - // Static method: -private: - static CMIUtilString FormatPriv(const CMIUtilString &vrFormat, va_list vArgs); - static CMIUtilString ConvertCharValueToPrintableASCII(char vChar, - bool bEscapeQuotes); - - // Methods: -private: - bool ExtractNumberFromHexadecimal(MIint64 &vwrNumber) const; - CMIUtilString RemoveRepeatedCharacters(size_t vnPos, const char vChar); - size_t FindFirstQuote(size_t vnPos) const; -}; diff --git a/lldb/tools/lldb-mi/MIUtilString.cpp b/lldb/tools/lldb-mi/MIUtilString.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilString.cpp +++ /dev/null @@ -1,915 +0,0 @@ -//===-- MIUtilString.cpp ----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third party headers -#include "llvm/Support/Compiler.h" -#include -#include -#include -#include -#include -#include -#include - -// In-house headers: -#include "MIUtilString.h" - -//++ -// Details: CMIUtilString constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilString::CMIUtilString() : std::string() {} - -//++ -// Details: CMIUtilString constructor. -// Type: Method. -// Args: vpData - Pointer to UTF8 text data. -// Return: None. -// Throws: None. -//-- -CMIUtilString::CMIUtilString(const char *vpData) - : std::string(WithNullAsEmpty(vpData)) {} - -//++ -// Details: CMIUtilString constructor. -// Type: Method. -// Args: vpStr - Text data. -// Return: None. -// Throws: None. -//-- -CMIUtilString::CMIUtilString(const std::string &vrStr) : std::string(vrStr) {} - -//++ -// Details: CMIUtilString assignment operator. -// Type: Method. -// Args: vpRhs - Pointer to UTF8 text data. -// Return: CMIUtilString & - *this string. -// Throws: None. -//-- -CMIUtilString &CMIUtilString::operator=(const char *vpRhs) { - assign(WithNullAsEmpty(vpRhs)); - return *this; -} - -//++ -// Details: CMIUtilString assignment operator. -// Type: Method. -// Args: vrRhs - The other string to copy from. -// Return: CMIUtilString & - *this string. -// Throws: None. -//-- -CMIUtilString &CMIUtilString::operator=(const std::string &vrRhs) { - assign(vrRhs); - return *this; -} - -//++ -// Details: CMIUtilString destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilString::~CMIUtilString() {} - -//++ -// Details: Perform a snprintf format style on a string data. A new string -// object is -// created and returned. -// Type: Static method. -// Args: vrFormat - (R) Format string data instruction. -// vArgs - (R) Var list args of any type. -// Return: CMIUtilString - Number of splits found in the string data. -// Throws: None. -//-- -CMIUtilString CMIUtilString::FormatPriv(const CMIUtilString &vrFormat, - va_list vArgs) { - CMIUtilString strResult; - MIint nFinal = 0; - MIint n = vrFormat.size(); - - // IOR: mysterious crash in this function on some windows builds not able to - // duplicate but found article which may be related. Crash occurs in - // vsnprintf() or va_copy(). - // Duplicate vArgs va_list argument pointer to ensure that it can be safely - // used in a new frame. - // http://julipedia.meroh.net/2011/09/using-vacopy-to-safely-pass-ap.html - va_list argsDup; - va_copy(argsDup, vArgs); - - // Create a copy va_list to reset when we spin - va_list argsCpy; - va_copy(argsCpy, argsDup); - - if (n == 0) - return strResult; - - n = n << 4; // Reserve 16 times as much the length of the vrFormat - - std::unique_ptr pFormatted; - while (1) { - pFormatted.reset(new char[n + 1]); // +1 for safety margin - ::strncpy(&pFormatted[0], vrFormat.c_str(), n); - - // We need to restore the variable argument list pointer to the start again - // before running vsnprintf() more then once - va_copy(argsDup, argsCpy); - - nFinal = ::vsnprintf(&pFormatted[0], n, vrFormat.c_str(), argsDup); - if ((nFinal < 0) || (nFinal >= n)) - n += abs(nFinal - n + 1); - else - break; - } - - va_end(argsCpy); - va_end(argsDup); - - strResult = pFormatted.get(); - - return strResult; -} - -//++ -// Details: Perform a snprintf format style on a string data. A new string -// object is -// created and returned. -// Type: Static method. -// Args: vFormat - (R) Format string data instruction. -// ... - (R) Var list args of any type. -// Return: CMIUtilString - Number of splits found in the string data. -// Throws: None. -//-- -CMIUtilString CMIUtilString::Format(const char *vFormating, ...) { - va_list args; - va_start(args, vFormating); - CMIUtilString strResult = - CMIUtilString::FormatPriv(WithNullAsEmpty(vFormating), args); - va_end(args); - - return strResult; -} - -//++ -// Details: Perform a snprintf format style on a string data. A new string -// object is -// created and returned. -// Type: Static method. -// Args: vrFormat - (R) Format string data instruction. -// vArgs - (R) Var list args of any type. -// Return: CMIUtilString - Number of splits found in the string data. -// Throws: None. -//-- -CMIUtilString CMIUtilString::FormatValist(const CMIUtilString &vrFormating, - va_list vArgs) { - return CMIUtilString::FormatPriv(vrFormating, vArgs); -} - -//++ -// Details: Splits string into array of strings using delimiter. If multiple -// delimiter -// are found in sequence then they are not added to the list of splits. -// Type: Method. -// Args: vData - (R) String data to be split up. -// vDelimiter - (R) Delimiter char or text. -// vwVecSplits - (W) Container of splits found in string data. -// Return: size_t - Number of splits found in the string data. -// Throws: None. -//-- -size_t CMIUtilString::Split(const CMIUtilString &vDelimiter, - VecString_t &vwVecSplits) const { - vwVecSplits.clear(); - - if (this->empty() || vDelimiter.empty()) - return 0; - - const size_t nLen(length()); - size_t nOffset(0); - do { - // Find first occurrence which doesn't match to the delimiter - const size_t nSectionPos(FindFirstNot(vDelimiter, nOffset)); - if (nSectionPos == std::string::npos) - break; - - // Find next occurrence of the delimiter after section - size_t nNextDelimiterPos(FindFirst(vDelimiter, nSectionPos)); - if (nNextDelimiterPos == std::string::npos) - nNextDelimiterPos = nLen; - - // Extract string between delimiters - const size_t nSectionLen(nNextDelimiterPos - nSectionPos); - const std::string strSection(substr(nSectionPos, nSectionLen)); - vwVecSplits.push_back(strSection); - - // Next - nOffset = nNextDelimiterPos + 1; - } while (nOffset < nLen); - - return vwVecSplits.size(); -} - -//++ -// Details: Splits string into array of strings using delimiter. However the -// string is -// also considered for text surrounded by quotes. Text with quotes -// including the -// delimiter is treated as a whole. If multiple delimiter are found in -// sequence -// then they are not added to the list of splits. Quotes that are -// embedded in -// the string as string formatted quotes are ignored (proceeded by a -// '\\') i.e. -// "\"MI GDB local C++.cpp\":88". -// Type: Method. -// Args: vData - (R) String data to be split up. -// vDelimiter - (R) Delimiter char or text. -// vwVecSplits - (W) Container of splits found in string data. -// Return: size_t - Number of splits found in the string data. -// Throws: None. -//-- -size_t CMIUtilString::SplitConsiderQuotes(const CMIUtilString &vDelimiter, - VecString_t &vwVecSplits) const { - vwVecSplits.clear(); - - if (this->empty() || vDelimiter.empty()) - return 0; - - const size_t nLen(length()); - size_t nOffset(0); - do { - // Find first occurrence which doesn't match to the delimiter - const size_t nSectionPos(FindFirstNot(vDelimiter, nOffset)); - if (nSectionPos == std::string::npos) - break; - - // Find next occurrence of the delimiter after (quoted) section - const bool bSkipQuotedText(true); - bool bUnmatchedQuote(false); - size_t nNextDelimiterPos( - FindFirst(vDelimiter, bSkipQuotedText, bUnmatchedQuote, nSectionPos)); - if (bUnmatchedQuote) { - vwVecSplits.clear(); - return 0; - } - if (nNextDelimiterPos == std::string::npos) - nNextDelimiterPos = nLen; - - // Extract string between delimiters - const size_t nSectionLen(nNextDelimiterPos - nSectionPos); - const std::string strSection(substr(nSectionPos, nSectionLen)); - vwVecSplits.push_back(strSection); - - // Next - nOffset = nNextDelimiterPos + 1; - } while (nOffset < nLen); - - return vwVecSplits.size(); -} - -//++ -// Details: Split string into lines using \n and return an array of strings. -// Type: Method. -// Args: vwVecSplits - (W) Container of splits found in string data. -// Return: size_t - Number of splits found in the string data. -// Throws: None. -//-- -size_t CMIUtilString::SplitLines(VecString_t &vwVecSplits) const { - return Split("\n", vwVecSplits); -} - -//++ -// Details: Remove '\n' from the end of string if found. It does not alter -// *this string. -// Type: Method. -// Args: None. -// Return: CMIUtilString - New version of the string. -// Throws: None. -//-- -CMIUtilString CMIUtilString::StripCREndOfLine() const { - const size_t nPos = rfind('\n'); - if (nPos == std::string::npos) - return *this; - - const CMIUtilString strNew(substr(0, nPos)); - - return strNew; -} - -//++ -// Details: Remove all '\n' from the string and replace with a space. It does -// not alter -// *this string. -// Type: Method. -// Args: None. -// Return: CMIUtilString - New version of the string. -// Throws: None. -//-- -CMIUtilString CMIUtilString::StripCRAll() const { - return FindAndReplace("\n", " "); -} - -//++ -// Details: Find and replace all matches of a sub string with another string. It -// does not -// alter *this string. -// Type: Method. -// Args: vFind - (R) The string to look for. -// vReplaceWith - (R) The string to replace the vFind match. -// Return: CMIUtilString - New version of the string. -// Throws: None. -//-- -CMIUtilString -CMIUtilString::FindAndReplace(const CMIUtilString &vFind, - const CMIUtilString &vReplaceWith) const { - if (vFind.empty() || this->empty()) - return *this; - - size_t nPos = find(vFind); - if (nPos == std::string::npos) - return *this; - - CMIUtilString strNew(*this); - while (nPos != std::string::npos) { - strNew.replace(nPos, vFind.length(), vReplaceWith); - nPos += vReplaceWith.length(); - nPos = strNew.find(vFind, nPos); - } - - return strNew; -} - -//++ -// Details: Check if *this string is a decimal number. -// Type: Method. -// Args: None. -// Return: bool - True = yes number, false not a number. -// Throws: None. -//-- -bool CMIUtilString::IsNumber() const { - if (empty()) - return false; - - if ((at(0) == '-') && (length() == 1)) - return false; - - const size_t nPos = find_first_not_of("-.0123456789"); - return nPos == std::string::npos; -} - -//++ -// Details: Check if *this string is a hexadecimal number. -// Type: Method. -// Args: None. -// Return: bool - True = yes number, false not a number. -// Throws: None. -//-- -bool CMIUtilString::IsHexadecimalNumber() const { - // Compare '0x..' prefix - if ((strncmp(c_str(), "0x", 2) != 0) && (strncmp(c_str(), "0X", 2) != 0)) - return false; - - // Skip '0x..' prefix - const size_t nPos = find_first_not_of("01234567890ABCDEFabcedf", 2); - return nPos == std::string::npos; -} - -//++ -// Details: Extract the number from the string. The number can be either a -// hexadecimal or -// natural number. It cannot contain other non-numeric characters. -// Type: Method. -// Args: vwrNumber - (W) Number extracted from the string. -// Return: bool - True = yes number, false not a number. -// Throws: None. -//-- -bool CMIUtilString::ExtractNumber(MIint64 &vwrNumber) const { - vwrNumber = 0; - - if (!IsNumber()) { - return ExtractNumberFromHexadecimal(vwrNumber); - } - - std::stringstream ss(const_cast(*this)); - ss >> vwrNumber; - - return true; -} - -//++ -// Details: Extract the number from the hexadecimal string.. -// Type: Method. -// Args: vwrNumber - (W) Number extracted from the string. -// Return: bool - True = yes number, false not a number. -// Throws: None. -//-- -bool CMIUtilString::ExtractNumberFromHexadecimal(MIint64 &vwrNumber) const { - vwrNumber = 0; - - const size_t nPos = find_first_not_of("xX01234567890ABCDEFabcedf"); - if (nPos != std::string::npos) - return false; - - errno = 0; - const MIuint64 nNum = ::strtoull(this->c_str(), nullptr, 16); - if (errno == ERANGE) - return false; - - vwrNumber = static_cast(nNum); - - return true; -} - -//++ -// Details: Determine if the text is all valid alpha numeric characters. Letters -// can be -// either upper or lower case. -// Type: Static method. -// Args: vpText - (R) The text data to examine. -// Return: bool - True = yes all alpha, false = one or more chars is non alpha. -// Throws: None. -//-- -bool CMIUtilString::IsAllValidAlphaAndNumeric(const char *vpText) { - const size_t len = ::strlen(WithNullAsEmpty(vpText)); - if (len == 0) - return false; - - for (size_t i = 0; i < len; i++, vpText++) { - const char c = *vpText; - if (::isalnum((int)c) == 0) - return false; - } - - return true; -} - -//++ -// Details: Check if two strings share equal contents. -// Type: Method. -// Args: vrLhs - (R) String A. -// vrRhs - (R) String B. -// Return: bool - True = yes equal, false - different. -// Throws: None. -//-- -bool CMIUtilString::Compare(const CMIUtilString &vrLhs, - const CMIUtilString &vrRhs) { - // Check the sizes match - if (vrLhs.size() != vrRhs.size()) - return false; - - return (::strncmp(vrLhs.c_str(), vrRhs.c_str(), vrLhs.size()) == 0); -} - -//++ -// Details: Remove from either end of *this string the following: " \t\n\v\f\r". -// Type: Method. -// Args: None. -// Return: CMIUtilString - Trimmed string. -// Throws: None. -//-- -CMIUtilString CMIUtilString::Trim() const { - CMIUtilString strNew(*this); - const char *pWhiteSpace = " \t\n\v\f\r"; - const size_t nPos = find_last_not_of(pWhiteSpace); - if (nPos != std::string::npos) { - strNew = substr(0, nPos + 1); - } - const size_t nPos2 = strNew.find_first_not_of(pWhiteSpace); - if (nPos2 != std::string::npos) { - strNew = strNew.substr(nPos2); - } - - return strNew; -} - -//++ -// Details: Remove from either end of *this string the specified character. -// Type: Method. -// Args: None. -// Return: CMIUtilString - Trimmed string. -// Throws: None. -//-- -CMIUtilString CMIUtilString::Trim(const char vChar) const { - CMIUtilString strNew(*this); - const size_t nLen = strNew.length(); - if (nLen > 1) { - if ((strNew[0] == vChar) && (strNew[nLen - 1] == vChar)) - strNew = strNew.substr(1, nLen - 2); - } - - return strNew; -} - -//++ -// Details: Do a printf equivalent for printing a number in binary i.e. "b%llB". -// Type: Static method. -// Args: vnDecimal - (R) The number to represent in binary. -// Return: CMIUtilString - Binary number in text. -// Throws: None. -//-- -CMIUtilString CMIUtilString::FormatBinary(const MIuint64 vnDecimal) { - CMIUtilString strBinaryNumber; - - const MIuint nConstBits = 64; - MIuint nRem[nConstBits + 1]; - MIint i = 0; - MIuint nLen = 0; - MIuint64 nNum = vnDecimal; - while ((nNum > 0) && (nLen < nConstBits)) { - nRem[i++] = nNum % 2; - nNum = nNum >> 1; - nLen++; - } - char pN[nConstBits + 1]; - MIuint j = 0; - for (i = nLen; i > 0; --i, j++) { - pN[j] = '0' + nRem[i - 1]; - } - pN[j] = 0; // String NUL termination - - strBinaryNumber = CMIUtilString::Format("0b%s", &pN[0]); - - return strBinaryNumber; -} - -//++ -// Details: Remove from a string doubled up characters so only one set left. -// Characters -// are only removed if the previous character is already a same -// character. -// Type: Method. -// Args: vChar - (R) The character to search for and remove adjacent -// duplicates. -// Return: CMIUtilString - New version of the string. -// Throws: None. -//-- -CMIUtilString CMIUtilString::RemoveRepeatedCharacters(const char vChar) { - return RemoveRepeatedCharacters(0, vChar); -} - -//++ -// Details: Recursively remove from a string doubled up characters so only one -// set left. -// Characters are only removed if the previous character is already a -// same -// character. -// Type: Method. -// Args: vChar - (R) The character to search for and remove adjacent -// duplicates. -// vnPos - Character position in the string. -// Return: CMIUtilString - New version of the string. -// Throws: None. -//-- -CMIUtilString CMIUtilString::RemoveRepeatedCharacters(size_t vnPos, - const char vChar) { - const char cQuote = '"'; - - // Look for first quote of two - const size_t nPos = find(cQuote, vnPos); - if (nPos == std::string::npos) - return *this; - - const size_t nPosNext = nPos + 1; - if (nPosNext > length()) - return *this; - - if (at(nPosNext) == cQuote) { - *this = substr(0, nPos) + substr(nPosNext, length()); - RemoveRepeatedCharacters(nPosNext, vChar); - } - - return *this; -} - -//++ -// Details: Is the text in *this string surrounded by quotes. -// Type: Method. -// Args: None. -// Return: bool - True = Yes string is quoted, false = no quoted. -// Throws: None. -//-- -bool CMIUtilString::IsQuoted() const { - const char cQuote = '"'; - - if (at(0) != cQuote) - return false; - - const size_t nLen = length(); - return !((nLen > 0) && (at(nLen - 1) != cQuote)); -} - -//++ -// Details: Find first occurrence in *this string which matches the pattern. -// Type: Method. -// Args: vrPattern - (R) The pattern to search for. -// vnPos - The starting position at which to start searching. -// (Dflt = 0) -// Return: size_t - The position of the first substring that match. -// Throws: None. -//-- -size_t CMIUtilString::FindFirst(const CMIUtilString &vrPattern, - size_t vnPos /* = 0 */) const { - return find(vrPattern, vnPos); -} - -//++ -// Details: Find first occurrence in *this string which matches the pattern and -// isn't surrounded by quotes. -// Type: Method. -// Args: vrPattern - (R) The pattern to search for. -// vbSkipQuotedText - (R) True = don't look at quoted text, -// false = otherwise. -// vrwbNotFoundClosedQuote - (W) True = parsing error: unmatched -// quote, false = otherwise. -// vnPos - Position of the first character in the -// string to be considered in the search. (Dflt = 0) -// Return: size_t - The position of the first substring that matches and isn't -// quoted. -// Throws: None. -//-- -size_t CMIUtilString::FindFirst(const CMIUtilString &vrPattern, - const bool vbSkipQuotedText, - bool &vrwbNotFoundClosedQuote, - size_t vnPos /* = 0 */) const { - vrwbNotFoundClosedQuote = false; - - if (!vbSkipQuotedText) - return FindFirst(vrPattern, vnPos); - - const size_t nLen(length()); - - size_t nPos = vnPos; - do { - const size_t nQuotePos(FindFirstQuote(nPos)); - const size_t nPatternPos(FindFirst(vrPattern, nPos)); - if (nQuotePos == std::string::npos) - return nPatternPos; - - const size_t nQuoteClosedPos = FindFirstQuote(nQuotePos + 1); - if (nQuoteClosedPos == std::string::npos) { - vrwbNotFoundClosedQuote = true; - return std::string::npos; - } - - if ((nPatternPos == std::string::npos) || (nPatternPos < nQuotePos)) - return nPatternPos; - - nPos = nQuoteClosedPos + 1; - } while (nPos < nLen); - - return std::string::npos; -} - -//++ -// Details: Find first occurrence in *this string which doesn't match the -// pattern. -// Type: Method. -// Args: vrPattern - (R) The pattern to search for. -// vnPos - Position of the first character in the string to be -// considered in the search. (Dflt = 0) -// Return: size_t - The position of the first character that doesn't match. -// Throws: None. -//-- -size_t CMIUtilString::FindFirstNot(const CMIUtilString &vrPattern, - size_t vnPos /* = 0 */) const { - const size_t nLen(length()); - const size_t nPatternLen(vrPattern.length()); - - size_t nPatternPos(vnPos); - do { - const bool bMatchPattern(compare(nPatternPos, nPatternLen, vrPattern) == 0); - if (!bMatchPattern) - return nPatternPos; - nPatternPos += nPatternLen; - } while (nPatternPos < nLen); - - return std::string::npos; -} - -//++ -// Details: Find first occurrence of not escaped quotation mark in *this string. -// Type: Method. -// Args: vnPos - Position of the first character in the string to be -// considered in the search. -// Return: size_t - The position of the quotation mark. -// Throws: None. -//-- -size_t CMIUtilString::FindFirstQuote(size_t vnPos) const { - const char cBckSlash('\\'); - const char cQuote('"'); - const size_t nLen(length()); - - size_t nPos = vnPos; - do { - const size_t nBckSlashPos(find(cBckSlash, nPos)); - const size_t nQuotePos(find(cQuote, nPos)); - if ((nBckSlashPos == std::string::npos) || (nQuotePos == std::string::npos)) - return nQuotePos; - - if (nQuotePos < nBckSlashPos) - return nQuotePos; - - // Skip 2 characters: First is '\', second is that which is escaped by '\' - nPos = nBckSlashPos + 2; - } while (nPos < nLen); - - return std::string::npos; -} - -//++ -// Details: Get escaped string from *this string. -// Type: Method. -// Args: None. -// Return: CMIUtilString - The escaped version of the initial string. -// Throws: None. -//-- -CMIUtilString CMIUtilString::Escape(bool vbEscapeQuotes /* = false */) const { - const size_t nLen(length()); - CMIUtilString strNew; - strNew.reserve(nLen); - for (size_t nIndex(0); nIndex < nLen; ++nIndex) { - const char cUnescapedChar((*this)[nIndex]); - if (cUnescapedChar == '"' && vbEscapeQuotes) - strNew.append("\\\""); - else - strNew.append(ConvertToPrintableASCII((char)cUnescapedChar)); - } - return strNew; -} - -//++ -// Details: Get string with backslashes in front of double quote '"' and -// backslash '\\' -// characters. -// Type: Method. -// Args: None. -// Return: CMIUtilString - The wrapped version of the initial string. -// Throws: None. -//-- -CMIUtilString CMIUtilString::AddSlashes() const { - const char cBckSlash('\\'); - const size_t nLen(length()); - CMIUtilString strNew; - strNew.reserve(nLen); - - size_t nOffset(0); - while (nOffset < nLen) { - const size_t nUnescapedCharPos(find_first_of("\"\\", nOffset)); - const bool bUnescapedCharNotFound(nUnescapedCharPos == std::string::npos); - if (bUnescapedCharNotFound) { - const size_t nAppendAll(std::string::npos); - strNew.append(*this, nOffset, nAppendAll); - break; - } - const size_t nAppendLen(nUnescapedCharPos - nOffset); - strNew.append(*this, nOffset, nAppendLen); - strNew.push_back(cBckSlash); - const char cUnescapedChar((*this)[nUnescapedCharPos]); - strNew.push_back(cUnescapedChar); - nOffset = nUnescapedCharPos + 1; - } - - return strNew; -} - -//++ -// Details: Remove backslashes added by CMIUtilString::AddSlashes. -// Type: Method. -// Args: None. -// Return: CMIUtilString - The initial version of wrapped string. -// Throws: None. -//-- -CMIUtilString CMIUtilString::StripSlashes() const { - const char cBckSlash('\\'); - const size_t nLen(length()); - CMIUtilString strNew; - strNew.reserve(nLen); - - size_t nOffset(0); - while (nOffset < nLen) { - const size_t nBckSlashPos(find(cBckSlash, nOffset)); - const bool bBckSlashNotFound(nBckSlashPos == std::string::npos); - if (bBckSlashNotFound) { - const size_t nAppendAll(std::string::npos); - strNew.append(*this, nOffset, nAppendAll); - break; - } - const size_t nAppendLen(nBckSlashPos - nOffset); - strNew.append(*this, nOffset, nAppendLen); - const bool bBckSlashIsLast(nBckSlashPos == nLen); - if (bBckSlashIsLast) { - strNew.push_back(cBckSlash); - break; - } - const char cEscapedChar((*this)[nBckSlashPos + 1]); - const size_t nEscapedCharPos(std::string("\"\\").find(cEscapedChar)); - const bool bEscapedCharNotFound(nEscapedCharPos == std::string::npos); - if (bEscapedCharNotFound) - strNew.push_back(cBckSlash); - strNew.push_back(cEscapedChar); - nOffset = nBckSlashPos + 2; - } - - return strNew; -} - -CMIUtilString CMIUtilString::ConvertToPrintableASCII(const char vChar, - bool bEscapeQuotes) { - switch (vChar) { - case '\a': - return "\\a"; - case '\b': - return "\\b"; - case '\t': - return "\\t"; - case '\n': - return "\\n"; - case '\v': - return "\\v"; - case '\f': - return "\\f"; - case '\r': - return "\\r"; - case '\033': - return "\\e"; - case '\\': - return "\\\\"; - case '"': - if (bEscapeQuotes) - return "\\\""; - LLVM_FALLTHROUGH; - default: - if (::isprint(vChar)) - return Format("%c", vChar); - else - return Format("\\x%02" PRIx8, vChar); - } -} - -CMIUtilString -CMIUtilString::ConvertCharValueToPrintableASCII(char vChar, - bool bEscapeQuotes) { - switch (vChar) { - case '\a': - return "\\a"; - case '\b': - return "\\b"; - case '\t': - return "\\t"; - case '\n': - return "\\n"; - case '\v': - return "\\v"; - case '\f': - return "\\f"; - case '\r': - return "\\r"; - case '\033': - return "\\e"; - case '\\': - return "\\\\"; - case '"': - if (bEscapeQuotes) - return "\\\""; - LLVM_FALLTHROUGH; - default: - if (::isprint(vChar)) - return Format("%c", vChar); - else - return CMIUtilString(); - } -} - -CMIUtilString CMIUtilString::ConvertToPrintableASCII(const char16_t vChar16, - bool bEscapeQuotes) { - if (vChar16 == (char16_t)(char)vChar16) { - // Convert char16_t to char (if possible) - CMIUtilString str = - ConvertCharValueToPrintableASCII((char)vChar16, bEscapeQuotes); - if (str.length() > 0) - return str; - } - return Format("\\u%02" PRIx8 "%02" PRIx8, (vChar16 >> 8) & 0xff, - vChar16 & 0xff); -} - -CMIUtilString CMIUtilString::ConvertToPrintableASCII(const char32_t vChar32, - bool bEscapeQuotes) { - if (vChar32 == (char32_t)(char)vChar32) { - // Convert char32_t to char (if possible) - CMIUtilString str = - ConvertCharValueToPrintableASCII((char)vChar32, bEscapeQuotes); - if (str.length() > 0) - return str; - } - return Format("\\U%02" PRIx8 "%02" PRIx8 "%02" PRIx8 "%02" PRIx8, - (vChar32 >> 24) & 0xff, (vChar32 >> 16) & 0xff, - (vChar32 >> 8) & 0xff, vChar32 & 0xff); -} diff --git a/lldb/tools/lldb-mi/MIUtilThreadBaseStd.h b/lldb/tools/lldb-mi/MIUtilThreadBaseStd.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilThreadBaseStd.h +++ /dev/null @@ -1,140 +0,0 @@ -//===-- MIUtilThreadBaseStd.h -----------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// Third party headers: -#include -#include - -// In-house headers: -#include "MIDataTypes.h" -#include "MIUtilString.h" - -//++ -//============================================================================ -// Details: MI common code utility class. Handle thread mutual exclusion. -// Embed Mutexes in your Active Object and then use them through Locks. -//-- -class CMIUtilThreadMutex { - // Methods: -public: - /* ctor */ CMIUtilThreadMutex() {} - // - void Lock(); // Wait until mutex can be obtained - void Unlock(); // Release the mutex - bool TryLock(); // Gain the lock if available - - // Overrideable: -public: - // From CMICmnBase - /* dtor */ virtual ~CMIUtilThreadMutex() {} - - // Attributes: -private: - std::recursive_mutex m_mutex; -}; - -//++ -//============================================================================ -// Details: MI common code utility class. Thread object. -//-- -class CMIUtilThread { - // Typedef: -public: - typedef MIuint (*FnThreadProc)(void *vpThisClass); - - // Methods: -public: - /* ctor */ CMIUtilThread(); - // - bool Start(FnThreadProc vpFn, void *vpArg); // Start execution of this thread - bool Join(); // Wait for this thread to stop - bool IsActive(); // Returns true if this thread is running - void Finish(); // Finish this thread - - // Overrideable: -public: - /* dtor */ virtual ~CMIUtilThread(); - - // Methods: -private: - CMIUtilThreadMutex m_mutex; - std::thread *m_pThread; - bool m_bIsActive; -}; - -//++ -//============================================================================ -// Details: MI common code utility class. Base class for a worker thread active -// object. Runs an 'captive thread'. -//-- -class CMIUtilThreadActiveObjBase { - // Methods: -public: - /* ctor */ CMIUtilThreadActiveObjBase(); - // - bool Acquire(); // Obtain a reference to this object - bool Release(); // Release a reference to this object - bool ThreadIsActive(); // Return true if this object is running - bool ThreadJoin(); // Wait for this thread to stop running - bool ThreadKill(); // Force this thread to stop, regardless of references - bool ThreadExecute(); // Start this objects execution in another thread - void ThreadManage(); - - // Overrideable: -public: - /* dtor */ virtual ~CMIUtilThreadActiveObjBase(); - // - // Each thread object must supple a unique name that can be used to locate it - virtual const CMIUtilString &ThreadGetName() const = 0; - - // Statics: -protected: - static MIuint ThreadEntry(void *vpThisClass); // Thread entry point - - // Overrideable: -protected: - virtual bool ThreadRun(bool &vrIsAlive) = 0; // Call the main worker method - virtual bool ThreadFinish() = 0; // Finish of what you were doing - - // Attributes: -protected: - volatile MIuint m_references; // Stores the current lifetime state of this - // thread, 0 = running, > 0 = shutting down - volatile bool - m_bHasBeenKilled; // Set to true when this thread has been killed - CMIUtilThread m_thread; // The execution thread - CMIUtilThreadMutex m_mutex; // This mutex allows us to safely communicate with - // this thread object across the interface from - // multiple threads -}; - -//++ -//============================================================================ -// Details: MI common code utility class. Handle thread resource locking. -// Put Locks inside all the methods of your Active Object that access -// data shared with the captive thread. -//-- -class CMIUtilThreadLock { - // Methods: -public: - /* ctor */ - CMIUtilThreadLock(CMIUtilThreadMutex &vMutex) : m_rMutex(vMutex) { - m_rMutex.Lock(); - } - - // Overrideable: -public: - /* dtor */ - virtual ~CMIUtilThreadLock() { m_rMutex.Unlock(); } - - // Attributes: -private: - CMIUtilThreadMutex &m_rMutex; -}; diff --git a/lldb/tools/lldb-mi/MIUtilThreadBaseStd.cpp b/lldb/tools/lldb-mi/MIUtilThreadBaseStd.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilThreadBaseStd.cpp +++ /dev/null @@ -1,302 +0,0 @@ -//===-- MIUtilThreadBaseStd.cpp ---------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// Third Party Headers: -#include - -// In-house headers: -#include "MICmnThreadMgrStd.h" -#include "MIUtilThreadBaseStd.h" - -//++ -// Details: Constructor. -// Type: None. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilThreadActiveObjBase::CMIUtilThreadActiveObjBase() - : m_references(0), m_bHasBeenKilled(false) {} - -//++ -// Details: Destructor. -// Type: None. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilThreadActiveObjBase::~CMIUtilThreadActiveObjBase() { - // Make sure our thread is not alive before we die - m_thread.Join(); -} - -//++ -// Details: Check if an object is already running. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilThreadActiveObjBase::ThreadIsActive() { - // Create a new thread to occupy this threads Run() function - return m_thread.IsActive(); -} - -//++ -// Details: Set up *this thread. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilThreadActiveObjBase::ThreadExecute() { - // Create a new thread to occupy this threads Run() function - return m_thread.Start(ThreadEntry, this); -} - -//++ -// Details: Acquire a reference to CMIUtilThreadActiveObjBase. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilThreadActiveObjBase::Acquire() { - // Access to this function is serial - CMIUtilThreadLock serial(m_mutex); - - // >0 == *this thread is alive - m_references++; - - return MIstatus::success; -} - -//++ -// Details: Release a reference to CMIUtilThreadActiveObjBase. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilThreadActiveObjBase::Release() { - // Access to this function is serial - CMIUtilThreadLock serial(m_mutex); - - // 0 == kill off *this thread - m_references--; - - return MIstatus::success; -} - -//++ -// Details: Force this thread to stop, regardless of references -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilThreadActiveObjBase::ThreadKill() { - // Access to this function is serial - CMIUtilThreadLock serial(m_mutex); - - // Set this thread to killed status - m_bHasBeenKilled = true; - - return MIstatus::success; -} - -//++ -// Details: Proxy to thread join. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilThreadActiveObjBase::ThreadJoin() { return m_thread.Join(); } - -//++ -// Details: This function is the entry point of this object thread. -// It is a trampoline to an instances operation manager. -// Type: Static method. -// Args: vpThisClass - (R) From the system (our CMIUtilThreadActiveObjBase -// from the ctor). -// Return: MIuint - 0 = success. -// Throws: None. -//-- -MIuint CMIUtilThreadActiveObjBase::ThreadEntry(void *vpThisClass) { - // The argument is a pointer to a CMIUtilThreadActiveObjBase class - // as passed from the initialize function, so we can safely cast it. - assert(vpThisClass != nullptr); - CMIUtilThreadActiveObjBase *pActive = - reinterpret_cast(vpThisClass); - - // Start the management routine of this object - pActive->ThreadManage(); - - // Thread death - return 0; -} - -//++ -// Details: This function forms a small management routine, to handle the -// thread's running. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIUtilThreadActiveObjBase::ThreadManage() { - bool bAlive = true; - - // Infinite loop - while (bAlive) { - // Scope the lock while we access m_isDying - { - // Lock down access to the interface - CMIUtilThreadLock serial(m_mutex); - - // Quit the run loop if we are dying - if (m_references == 0) - break; - } - // Execute the run routine - if (!ThreadRun(bAlive)) - // Thread's run function failed (MIstatus::failure) - break; - - // We will die if we have been signaled to die - bAlive &= !m_bHasBeenKilled; - } - - // Execute the finish routine just before we die - // to give the object a chance to clean up - ThreadFinish(); - - m_thread.Finish(); -} - - -// -CMIUtilThread::CMIUtilThread() : m_pThread(nullptr), m_bIsActive(false) {} - -//++ -// Details: CMIUtilThread destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilThread::~CMIUtilThread() { Join(); } - -//++ -// Details: Wait for thread to stop. -// Type: Method. -// Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilThread::Join() { - if (m_pThread != nullptr) { - // Wait for this thread to die - m_pThread->join(); - - // Scope the thread lock while we modify the pointer - { - CMIUtilThreadLock _lock(m_mutex); - delete m_pThread; - m_pThread = nullptr; - } - } - - return MIstatus::success; -} - -//++ -// Details: Is the thread doing work. -// Type: Method. -// Args: None. -// Return: bool - True = Yes active, false = not active. -// Throws: None. -//-- -bool CMIUtilThread::IsActive() { - // Lock while we access the thread status - CMIUtilThreadLock _lock(m_mutex); - return m_bIsActive; -} - -//++ -// Details: Finish this thread -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIUtilThread::Finish() { - // Lock while we access the thread status - CMIUtilThreadLock _lock(m_mutex); - m_bIsActive = false; -} - -//++ -// Details: Set up *this thread. -// Type: Method. -// Args: vpFn (R) - Function pointer to thread's main function. -// vpArg (R) - Pointer arguments to pass to the thread. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. -// Throws: None. -//-- -bool CMIUtilThread::Start(FnThreadProc vpFn, void *vpArg) { - // Lock while we access the thread pointer and status - CMIUtilThreadLock _lock(m_mutex); - - // Create the std thread, which starts immediately and update its status - m_pThread = new std::thread(vpFn, vpArg); - m_bIsActive = true; - - // We expect to always be able to create one - assert(m_pThread != nullptr); - - return MIstatus::success; -} - - -//++ -// Details: Take resource. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIUtilThreadMutex::Lock() { m_mutex.lock(); } - -//++ -// Details: Release resource. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIUtilThreadMutex::Unlock() { m_mutex.unlock(); } - -//++ -// Details: Take resource if available. Immediately return in either case. -// Type: Method. -// Args: None. -// Return: True - mutex has been locked. -// False - mutex could not be locked. -// Throws: None. -//-- -bool CMIUtilThreadMutex::TryLock() { return m_mutex.try_lock(); } diff --git a/lldb/tools/lldb-mi/MIUtilVariant.h b/lldb/tools/lldb-mi/MIUtilVariant.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilVariant.h +++ /dev/null @@ -1,247 +0,0 @@ -//===-- MIUtilVariant.h -----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#pragma once - -// In-house headers: -#include "MIDataTypes.h" - -//++ -//============================================================================ -// Details: MI common code utility class. The class implements behaviour of a -// variant object which holds any data object of type T. A copy of the -// data object specified is made and stored in *this wrapper. When the -// *this object is destroyed the data object hold within calls its -// destructor should it have one. -//-- -class CMIUtilVariant { - // Methods: -public: - /* ctor */ CMIUtilVariant(); - /* ctor */ CMIUtilVariant(const CMIUtilVariant &vrOther); - /* ctor */ CMIUtilVariant(CMIUtilVariant &vrOther); - /* ctor */ CMIUtilVariant(CMIUtilVariant &&vrwOther); - /* dtor */ ~CMIUtilVariant(); - - template void Set(const T &vArg); - template T *Get() const; - - CMIUtilVariant &operator=(const CMIUtilVariant &vrOther); - CMIUtilVariant &operator=(CMIUtilVariant &&vrwOther); - - // Classes: -private: - //++ ---------------------------------------------------------------------- - // Details: Base class wrapper to hold the variant's data object when - // assigned to it by the Set() function. Do not use the - // CDataObjectBase - // to create objects, use only CDataObjectBase derived objects, - // see CDataObject() class. - //-- - class CDataObjectBase { - // Methods: - public: - /* ctor */ CDataObjectBase(); - /* ctor */ CDataObjectBase(const CDataObjectBase &vrOther); - /* ctor */ CDataObjectBase(CDataObjectBase &vrOther); - /* ctor */ CDataObjectBase(CDataObjectBase &&vrwOther); - // - CDataObjectBase &operator=(const CDataObjectBase &vrOther); - CDataObjectBase &operator=(CDataObjectBase &&vrwOther); - - // Overrideable: - public: - virtual ~CDataObjectBase(); - virtual CDataObjectBase *CreateCopyOfSelf(); - virtual bool GetIsDerivedClass() const; - - // Overrideable: - protected: - virtual void Copy(const CDataObjectBase &vrOther); - virtual void Destroy(); - }; - - //++ ---------------------------------------------------------------------- - // Details: Derived from CDataObjectBase, this class is the wrapper for the - // data object as it has an aggregate of type T which is a copy - // of the data object assigned to the variant object. - //-- - template class CDataObject : public CDataObjectBase { - // Methods: - public: - /* ctor */ CDataObject(); - /* ctor */ CDataObject(const T &vArg); - /* ctor */ CDataObject(const CDataObject &vrOther); - /* ctor */ CDataObject(CDataObject &vrOther); - /* ctor */ CDataObject(CDataObject &&vrwOther); - // - CDataObject &operator=(const CDataObject &vrOther); - CDataObject &operator=(CDataObject &&vrwOther); - // - T &GetDataObject(); - - // Overridden: - public: - // From CDataObjectBase - ~CDataObject() override; - CDataObjectBase *CreateCopyOfSelf() override; - bool GetIsDerivedClass() const override; - - // Overrideable: - private: - virtual void Duplicate(const CDataObject &vrOther); - - // Overridden: - private: - // From CDataObjectBase - void Destroy() override; - - // Attributes: - private: - T m_dataObj; - }; - - // Methods -private: - void Destroy(); - void Copy(const CMIUtilVariant &vrOther); - - // Attributes: -private: - CDataObjectBase *m_pDataObject; -}; - - -//++ -// Details: CDataObject constructor. -// Type: Method. -// Args: T - The object's type. -// Return: None. -// Throws: None. -//-- -template CMIUtilVariant::CDataObject::CDataObject() {} - -//++ -// Details: CDataObject constructor. -// Type: Method. -// Args: T - The object's type. -// vArg - (R) The data object to be stored in the variant object. -// Return: None. -// Throws: None. -//-- -template -CMIUtilVariant::CDataObject::CDataObject(const T &vArg) { - m_dataObj = vArg; -} - -//++ -// Details: CDataObject destructor. -// Type: Overridden. -// Args: T - The object's type. -// Return: None. -// Throws: None. -//-- -template CMIUtilVariant::CDataObject::~CDataObject() { - Destroy(); -} - -//++ -// Details: Retrieve the data object hold by *this object wrapper. -// Type: Method. -// Args: T - The object's type. -// Return: T & - Reference to the data object. -// Throws: None. -//-- -template T &CMIUtilVariant::CDataObject::GetDataObject() { - return m_dataObj; -} - -//++ -// Details: Create a new copy of *this class. -// Type: Overridden. -// Args: T - The object's type. -// Return: CDataObjectBase * - Pointer to a new object. -// Throws: None. -//-- -template -CMIUtilVariant::CDataObjectBase * -CMIUtilVariant::CDataObject::CreateCopyOfSelf() { - CDataObject *pCopy = new CDataObject(m_dataObj); - - return pCopy; -} - -//++ -// Details: Determine if *this object is a derived from CDataObjectBase. -// Type: Overridden. -// Args: T - The object's type. -// Return: bool - True = *this is derived from CDataObjectBase -// - False = *this is an instance of the base class. -// Throws: None. -//-- -template -bool CMIUtilVariant::CDataObject::GetIsDerivedClass() const { - return true; -} - -//++ -// Details: Perform a bitwise copy of *this object. -// Type: Overrideable. -// Args: T - The object's type. -// vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -template -void CMIUtilVariant::CDataObject::Duplicate(const CDataObject &vrOther) { - CDataObjectBase::Copy(vrOther); - m_dataObj = vrOther.m_dataObj; -} - -//++ -// Details: Release any resources used by *this object. -// Type: Overridden. -// Args: None. -// Return: None. -// Throws: None. -//-- -template void CMIUtilVariant::CDataObject::Destroy() { - CDataObjectBase::Destroy(); -} - - -//++ -// Details: Assign to the variant an object of a specified type. -// Type: Template method. -// Args: T - The object's type. -// vArg - (R) The object to store. -// Return: None. -// Throws: None. -//-- -template void CMIUtilVariant::Set(const T &vArg) { - m_pDataObject = new CDataObject(vArg); -} - -//++ -// Details: Retrieve the data object from *this variant. -// Type: Template method. -// Args: T - The object's type. -// Return: T * - Pointer the data object, NULL = data object not assigned to -// *this variant. -// Throws: None. -//-- -template T *CMIUtilVariant::Get() const { - if ((m_pDataObject != nullptr) && m_pDataObject->GetIsDerivedClass()) { - CDataObject *pDataObj = static_cast *>(m_pDataObject); - return &pDataObj->GetDataObject(); - } - - // Do not use a CDataObjectBase object, use only CDataObjectBase derived - // objects - return nullptr; -} diff --git a/lldb/tools/lldb-mi/MIUtilVariant.cpp b/lldb/tools/lldb-mi/MIUtilVariant.cpp deleted file mode 100644 --- a/lldb/tools/lldb-mi/MIUtilVariant.cpp +++ /dev/null @@ -1,344 +0,0 @@ -//===-- MIUtilVariant.cpp----------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// In-house headers: -#include "MIUtilVariant.h" - -//++ -// Details: CDataObjectBase constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CDataObjectBase::CDataObjectBase() {} - -//++ -// Details: CDataObjectBase copy constructor. -// Type: Method. -// Args: vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CDataObjectBase::CDataObjectBase( - const CDataObjectBase &vrOther) { - MIunused(vrOther); -} - -//++ -// Details: CDataObjectBase copy constructor. -// Type: Method. -// Args: vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CDataObjectBase::CDataObjectBase(CDataObjectBase &vrOther) { - MIunused(vrOther); -} - -//++ -// Details: CDataObjectBase move constructor. -// Type: Method. -// Args: vrwOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CDataObjectBase::CDataObjectBase(CDataObjectBase &&vrwOther) { - MIunused(vrwOther); -} - -//++ -// Details: CDataObjectBase destructor. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CDataObjectBase::~CDataObjectBase() { Destroy(); } - -//++ -// Details: CDataObjectBase copy assignment. -// Type: Method. -// Args: vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CDataObjectBase &CMIUtilVariant::CDataObjectBase:: -operator=(const CDataObjectBase &vrOther) { - Copy(vrOther); - return *this; -} - -//++ -// Details: CDataObjectBase move assignment. -// Type: Method. -// Args: vrwOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CDataObjectBase &CMIUtilVariant::CDataObjectBase:: -operator=(CDataObjectBase &&vrwOther) { - Copy(vrwOther); - vrwOther.Destroy(); - return *this; -} - -//++ -// Details: Create a new copy of *this class. -// Type: Overrideable. -// Args: None. -// Return: CDataObjectBase * - Pointer to a new object. -// Throws: None. -//-- -CMIUtilVariant::CDataObjectBase * -CMIUtilVariant::CDataObjectBase::CreateCopyOfSelf() { - // Override to implement copying of variant's data object - return new CDataObjectBase(); -} - -//++ -// Details: Determine if *this object is a derived from CDataObjectBase. -// Type: Overrideable. -// Args: None. -// Return: bool - True = *this is derived from CDataObjectBase, false = -// *this is instance of the this base class. -// Throws: None. -//-- -bool CMIUtilVariant::CDataObjectBase::GetIsDerivedClass() const { - // Override to in the derived class and return true - return false; -} - -//++ -// Details: Perform a bitwise copy of *this object. -// Type: Overrideable. -// Args: vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -void CMIUtilVariant::CDataObjectBase::Copy(const CDataObjectBase &vrOther) { - // Override to implement - MIunused(vrOther); -} - -//++ -// Details: Release any resources used by *this object. -// Type: Overrideable. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIUtilVariant::CDataObjectBase::Destroy() { - // Do nothing - override to implement -} - - -//++ -// Details: CDataObject copy constructor. -// Type: Method. -// Args: T - The object's type. -// vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -template -CMIUtilVariant::CDataObject::CDataObject(const CDataObject &vrOther) { - if (this == &vrOther) - return; - Copy(vrOther); -} - -//++ -// Details: CDataObject copy constructor. -// Type: Method. -// Args: T - The object's type. -// vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -template -CMIUtilVariant::CDataObject::CDataObject(CDataObject &vrOther) { - if (this == &vrOther) - return; - Copy(vrOther); -} - -//++ -// Details: CDataObject move constructor. -// Type: Method. -// Args: T - The object's type. -// vrwOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -template -CMIUtilVariant::CDataObject::CDataObject(CDataObject &&vrwOther) { - if (this == &vrwOther) - return; - Copy(vrwOther); - vrwOther.Destroy(); -} - -//++ -// Details: CDataObject copy assignment. -// Type: Method. -// Args: T - The object's type. -// vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -template -CMIUtilVariant::CDataObject &CMIUtilVariant::CDataObject:: -operator=(const CDataObject &vrOther) { - if (this == &vrOther) - return *this; - Copy(vrOther); - return *this; -} - -//++ -// Details: CDataObject move assignment. -// Type: Method. -// Args: T - The object's type. -// vrwOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -template -CMIUtilVariant::CDataObject &CMIUtilVariant::CDataObject:: -operator=(CDataObject &&vrwOther) { - if (this == &vrwOther) - return *this; - Copy(vrwOther); - vrwOther.Destroy(); - return *this; -} - - -//++ -// Details: CMIUtilVariant constructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CMIUtilVariant() : m_pDataObject(nullptr) {} - -//++ -// Details: CMIUtilVariant copy constructor. -// Type: Method. -// Args: vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CMIUtilVariant(const CMIUtilVariant &vrOther) - : m_pDataObject(nullptr) { - if (this == &vrOther) - return; - - Copy(vrOther); -} - -//++ -// Details: CMIUtilVariant copy constructor. -// Type: Method. -// Args: vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CMIUtilVariant(CMIUtilVariant &vrOther) - : m_pDataObject(nullptr) { - if (this == &vrOther) - return; - - Copy(vrOther); -} - -//++ -// Details: CMIUtilVariant move constructor. -// Type: Method. -// Args: vrwOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::CMIUtilVariant(CMIUtilVariant &&vrwOther) - : m_pDataObject(nullptr) { - if (this == &vrwOther) - return; - - Copy(vrwOther); - vrwOther.Destroy(); -} - -//++ -// Details: CMIUtilVariant destructor. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant::~CMIUtilVariant() { Destroy(); } - -//++ -// Details: CMIUtilVariant copy assignment. -// Type: Method. -// Args: vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant &CMIUtilVariant::operator=(const CMIUtilVariant &vrOther) { - if (this == &vrOther) - return *this; - - Copy(vrOther); - return *this; -} - -//++ -// Details: CMIUtilVariant move assignment. -// Type: Method. -// Args: vrwOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -CMIUtilVariant &CMIUtilVariant::operator=(CMIUtilVariant &&vrwOther) { - if (this == &vrwOther) - return *this; - - Copy(vrwOther); - vrwOther.Destroy(); - return *this; -} - -//++ -// Details: Release the resources used by *this object. -// Type: Method. -// Args: None. -// Return: None. -// Throws: None. -//-- -void CMIUtilVariant::Destroy() { - if (m_pDataObject != nullptr) - delete m_pDataObject; - m_pDataObject = nullptr; -} - -//++ -// Details: Bitwise copy another data object to *this variant object. -// Type: Method. -// Args: vrOther - (R) The other object. -// Return: None. -// Throws: None. -//-- -void CMIUtilVariant::Copy(const CMIUtilVariant &vrOther) { - Destroy(); - - if (vrOther.m_pDataObject != nullptr) { - m_pDataObject = vrOther.m_pDataObject->CreateCopyOfSelf(); - } -} diff --git a/lldb/tools/lldb-mi/Platform.h b/lldb/tools/lldb-mi/Platform.h deleted file mode 100644 --- a/lldb/tools/lldb-mi/Platform.h +++ /dev/null @@ -1,87 +0,0 @@ -//===-- Platform.h ----------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -#pragma once - -#if defined(_MSC_VER) - -#include -#include -#include - -#include "lldb/Host/HostGetOpt.h" -#include "lldb/Host/windows/windows.h" - -struct winsize { - long ws_col; -}; - -typedef unsigned char cc_t; -typedef unsigned int speed_t; -typedef unsigned int tcflag_t; - -// fcntl.h // This is not used by MI -#define O_NOCTTY 0400 - -// ioctls.h -#define TIOCGWINSZ 0x5413 - -// tcsetattr arguments -#define TCSANOW 0 - -#define NCCS 32 -struct termios { - tcflag_t c_iflag; // input mode flags - tcflag_t c_oflag; // output mode flags - tcflag_t c_cflag; // control mode flags - tcflag_t c_lflag; // local mode flags - cc_t c_line; // line discipline - cc_t c_cc[NCCS]; // control characters - speed_t c_ispeed; // input speed - speed_t c_ospeed; // output speed -}; - -typedef long pid_t; - -#define STDIN_FILENO 0 -#define PATH_MAX 32768 -#define snprintf _snprintf - -extern int ioctl(int d, int request, ...); -extern int kill(pid_t pid, int sig); -extern int tcsetattr(int fd, int optional_actions, - const struct termios *termios_p); -extern int tcgetattr(int fildes, struct termios *termios_p); - -// signal handler function pointer type -typedef void (*sighandler_t)(int); - -// CODETAG_IOR_SIGNALS -// signal.h -#define SIGQUIT 3 // Terminal quit signal -#define SIGKILL 9 // Kill (cannot be caught or ignored) -#define SIGPIPE 13 // Write on a pipe with no one to read it -#define SIGCONT 18 // Continue executing, if stopped. -#define SIGTSTP 20 // Terminal stop signal -#define SIGSTOP 23 // Stop executing (cannot be caught or ignored) -#define SIGWINCH 28 // (== SIGVTALRM) - -#else - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#endif diff --git a/lldb/tools/lldb-mi/lldb-Info.plist b/lldb/tools/lldb-mi/lldb-Info.plist deleted file mode 100644 --- a/lldb/tools/lldb-mi/lldb-Info.plist +++ /dev/null @@ -1,21 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.lldb - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - lldb-mi - CFBundleVersion - 2 - SecTaskAccess - - allowed - debug - - - diff --git a/lldb/tools/lldb-mi/module.modulemap b/lldb/tools/lldb-mi/module.modulemap deleted file mode 100644 --- a/lldb/tools/lldb-mi/module.modulemap +++ /dev/null @@ -1,79 +0,0 @@ -module lldb_mi { - module MICmdArgContext { header "MICmdArgContext.h" export * } - module MICmdArgSet { header "MICmdArgSet.h" export * } - module MICmdArgValBase { header "MICmdArgValBase.h" export * } - module MICmdArgValConsume { header "MICmdArgValConsume.h" export * } - module MICmdArgValFile { header "MICmdArgValFile.h" export * } - module MICmdArgValListBase { header "MICmdArgValListBase.h" export * } - module MICmdArgValListOfN { header "MICmdArgValListOfN.h" export * } - module MICmdArgValNumber { header "MICmdArgValNumber.h" export * } - module MICmdArgValOptionLong { header "MICmdArgValOptionLong.h" export * } - module MICmdArgValOptionShort { header "MICmdArgValOptionShort.h" export * } - module MICmdArgValPrintValues { header "MICmdArgValPrintValues.h" export * } - module MICmdArgValString { header "MICmdArgValString.h" export * } - module MICmdArgValThreadGrp { header "MICmdArgValThreadGrp.h" export * } - module MICmdBase { header "MICmdBase.h" export * } - module MICmdCmdBreak { header "MICmdCmdBreak.h" export * } - module MICmdCmdData { header "MICmdCmdData.h" export * } - module MICmdCmdEnviro { header "MICmdCmdEnviro.h" export * } - module MICmdCmdExec { header "MICmdCmdExec.h" export * } - module MICmdCmdFile { header "MICmdCmdFile.h" export * } - module MICmdCmdGdbInfo { header "MICmdCmdGdbInfo.h" export * } - module MICmdCmdGdbSet { header "MICmdCmdGdbSet.h" export * } - module MICmdCmdGdbShow { header "MICmdCmdGdbShow.h" export * } - module MICmdCmdGdbThread { header "MICmdCmdGdbThread.h" export * } - module MICmdCmd { header "MICmdCmd.h" export * } - module MICmdCmdMiscellanous { header "MICmdCmdMiscellanous.h" export * } - module MICmdCmdStack { header "MICmdCmdStack.h" export * } - module MICmdCmdSupportInfo { header "MICmdCmdSupportInfo.h" export * } - module MICmdCmdSupportList { header "MICmdCmdSupportList.h" export * } - module MICmdCmdSymbol { header "MICmdCmdSymbol.h" export * } - module MICmdCmdTarget { header "MICmdCmdTarget.h" export * } - module MICmdCmdThread { header "MICmdCmdThread.h" export * } - module MICmdCmdTrace { header "MICmdCmdTrace.h" export * } - module MICmdCmdVar { header "MICmdCmdVar.h" export * } - module MICmdCommands { header "MICmdCommands.h" export * } - module MICmdData { header "MICmdData.h" export * } - module MICmdFactory { header "MICmdFactory.h" export * } - module MICmdInterpreter { header "MICmdInterpreter.h" export * } - module MICmdInvoker { header "MICmdInvoker.h" export * } - module MICmdMgr { header "MICmdMgr.h" export * } - module MICmdMgrSetCmdDeleteCallback { header "MICmdMgrSetCmdDeleteCallback.h" export * } - module MICmnBase { header "MICmnBase.h" export * } - module MICmnConfig { header "MICmnConfig.h" export * } - module MICmnLLDBBroadcaster { header "MICmnLLDBBroadcaster.h" export * } - module MICmnLLDBDebugger { header "MICmnLLDBDebugger.h" export * } - module MICmnLLDBDebuggerHandleEvents { header "MICmnLLDBDebuggerHandleEvents.h" export * } - module MICmnLLDBDebugSessionInfo { header "MICmnLLDBDebugSessionInfo.h" export * } - module MICmnLLDBDebugSessionInfoVarObj { header "MICmnLLDBDebugSessionInfoVarObj.h" export * } - module MICmnLLDBProxySBValue { header "MICmnLLDBProxySBValue.h" export * } - module MICmnLLDBUtilSBValue { header "MICmnLLDBUtilSBValue.h" export * } - module MICmnLog { header "MICmnLog.h" export * } - module MICmnLogMediumFile { header "MICmnLogMediumFile.h" export * } - module MICmnMIOutOfBandRecord { header "MICmnMIOutOfBandRecord.h" export * } - module MICmnMIResultRecord { header "MICmnMIResultRecord.h" export * } - module MICmnMIValueConst { header "MICmnMIValueConst.h" export * } - module MICmnMIValue { header "MICmnMIValue.h" export * } - module MICmnMIValueList { header "MICmnMIValueList.h" export * } - module MICmnMIValueResult { header "MICmnMIValueResult.h" export * } - module MICmnMIValueTuple { header "MICmnMIValueTuple.h" export * } - module MICmnResources { header "MICmnResources.h" export * } - module MICmnStreamStderr { header "MICmnStreamStderr.h" export * } - module MICmnStreamStdin { header "MICmnStreamStdin.h" export * } - module MICmnStreamStdout { header "MICmnStreamStdout.h" export * } - module MICmnThreadMgrStd { header "MICmnThreadMgrStd.h" export * } - module MIDataTypes { header "MIDataTypes.h" export * } - module MIDriverBase { header "MIDriverBase.h" export * } - module MIDriver { header "MIDriver.h" export * } - module MIDriverMgr { header "MIDriverMgr.h" export * } - module MIUtilDateTimeStd { header "MIUtilDateTimeStd.h" export * } - module MIUtilDebug { header "MIUtilDebug.h" export * } - module MIUtilFileStd { header "MIUtilFileStd.h" export * } - module MIUtilMapIdToVariant { header "MIUtilMapIdToVariant.h" export * } - module MIUtilSingletonBase { header "MIUtilSingletonBase.h" export * } - module MIUtilSingletonHelper { header "MIUtilSingletonHelper.h" export * } - module MIUtilString { header "MIUtilString.h" export * } - module MIUtilThreadBaseStd { header "MIUtilThreadBaseStd.h" export * } - module MIUtilVariant { header "MIUtilVariant.h" export * } - module Platform { header "Platform.h" export * } -} diff --git a/lldb/unittests/tools/CMakeLists.txt b/lldb/unittests/tools/CMakeLists.txt --- a/lldb/unittests/tools/CMakeLists.txt +++ b/lldb/unittests/tools/CMakeLists.txt @@ -1,6 +1,3 @@ -if(LLDB_TOOL_LLDB_MI_BUILD) - add_subdirectory(lldb-mi) -endif() if(LLDB_TOOL_LLDB_SERVER_BUILD) add_subdirectory(lldb-server) endif() diff --git a/lldb/unittests/tools/lldb-mi/CMakeLists.txt b/lldb/unittests/tools/lldb-mi/CMakeLists.txt deleted file mode 100644 --- a/lldb/unittests/tools/lldb-mi/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -include_directories(${LLDB_SOURCE_DIR}/tools/lldb-mi) -add_subdirectory(utils) diff --git a/lldb/unittests/tools/lldb-mi/utils/CMakeLists.txt b/lldb/unittests/tools/lldb-mi/utils/CMakeLists.txt deleted file mode 100644 --- a/lldb/unittests/tools/lldb-mi/utils/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -add_library(lldb-mi-utils OBJECT - ${LLDB_SOURCE_DIR}/tools/lldb-mi/MIUtilString.cpp - ) - -add_lldb_unittest(LLDBMiUtilTests - $ - StringTest.cpp - - LINK_COMPONENTS - Support - ) - -set_target_properties(lldb-mi-utils PROPERTIES FOLDER "lldb libraries") diff --git a/lldb/unittests/tools/lldb-mi/utils/StringTest.cpp b/lldb/unittests/tools/lldb-mi/utils/StringTest.cpp deleted file mode 100644 --- a/lldb/unittests/tools/lldb-mi/utils/StringTest.cpp +++ /dev/null @@ -1,32 +0,0 @@ -//===-- StringTest.cpp ------------------------------------------*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "MIUtilString.h" -#include "gtest/gtest.h" - -TEST(StringTest, ConstructFromNullptr) { - auto str = CMIUtilString(nullptr); - EXPECT_TRUE(str.empty()); - EXPECT_NE(nullptr, str.c_str()); - EXPECT_EQ(CMIUtilString(""), str); -} - -TEST(StringTest, AssignNullptr) { - CMIUtilString str; - str = nullptr; - EXPECT_TRUE(str.empty()); - EXPECT_NE(nullptr, str.c_str()); - EXPECT_EQ(CMIUtilString(""), str); -} - -TEST(StringTest, IsAllValidAlphaAndNumeric) { - EXPECT_TRUE(CMIUtilString::IsAllValidAlphaAndNumeric("123abc")); - EXPECT_FALSE(CMIUtilString::IsAllValidAlphaAndNumeric("")); - EXPECT_FALSE(CMIUtilString::IsAllValidAlphaAndNumeric(nullptr)); -} -