diff options
author | Greg Clayton <gclayton@apple.com> | 2011-09-22 04:58:26 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2011-09-22 04:58:26 +0000 |
commit | c14ee32db561671a16759c8307d5391646cb87c4 (patch) | |
tree | 33eea53e3b30461a2452c79eca2e668aa9537500 /lldb/source/Core/Debugger.cpp | |
parent | 3d10b95bf7f72dd7abbb1bb6a8412708a579d315 (diff) | |
download | bcm5719-llvm-c14ee32db561671a16759c8307d5391646cb87c4.tar.gz bcm5719-llvm-c14ee32db561671a16759c8307d5391646cb87c4.zip |
Converted the lldb_private::Process over to use the intrusive
shared pointers.
Changed the ExecutionContext over to use shared pointers for
the target, process, thread and frame since these objects can
easily go away at any time and any object that was holding onto
an ExecutionContext was running the risk of using a bad object.
Now that the shared pointers for target, process, thread and
frame are just a single pointer (they all use the instrusive
shared pointers) the execution context is much safer and still
the same size.
Made the shared pointers in the the ExecutionContext class protected
and made accessors for all of the various ways to get at the pointers,
references, and shared pointers.
llvm-svn: 140298
Diffstat (limited to 'lldb/source/Core/Debugger.cpp')
-rw-r--r-- | lldb/source/Core/Debugger.cpp | 240 |
1 files changed, 127 insertions, 113 deletions
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index c101038ca89..83c226b7664 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -337,22 +337,22 @@ ExecutionContext Debugger::GetSelectedExecutionContext () { ExecutionContext exe_ctx; - exe_ctx.Clear(); - - TargetSP target_sp = GetSelectedTarget(); - exe_ctx.target = target_sp.get(); + TargetSP target_sp(GetSelectedTarget()); + exe_ctx.SetTargetSP (target_sp); if (target_sp) { - exe_ctx.process = target_sp->GetProcessSP().get(); - if (exe_ctx.process && exe_ctx.process->IsRunning() == false) + ProcessSP process_sp (target_sp->GetProcessSP()); + exe_ctx.SetProcessSP (process_sp); + if (process_sp && process_sp->IsRunning() == false) { - exe_ctx.thread = exe_ctx.process->GetThreadList().GetSelectedThread().get(); - if (exe_ctx.thread) + ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread()); + if (thread_sp) { - exe_ctx.frame = exe_ctx.thread->GetSelectedFrame().get(); - if (exe_ctx.frame == NULL) - exe_ctx.frame = exe_ctx.thread->GetStackFrameAtIndex (0).get(); + exe_ctx.SetThreadSP (thread_sp); + exe_ctx.SetFrameSP (thread_sp->GetSelectedFrame()); + if (exe_ctx.GetFramePtr() == NULL) + exe_ctx.SetFrameSP (thread_sp->GetStackFrameAtIndex (0)); } } } @@ -1259,10 +1259,10 @@ Debugger::FormatPrompt for (;index_lower<=index_higher;index_lower++) { - ValueObject* item = ExpandIndexedExpression(target, - index_lower, - exe_ctx->frame, - false).get(); + ValueObject* item = ExpandIndexedExpression (target, + index_lower, + exe_ctx->GetFramePtr(), + false).get(); if (!item) { @@ -1307,77 +1307,85 @@ Debugger::FormatPrompt case 'p': if (::strncmp (var_name_begin, "process.", strlen("process.")) == 0) { - if (exe_ctx && exe_ctx->process != NULL) + if (exe_ctx) { - var_name_begin += ::strlen ("process."); - if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) - { - s.Printf("%i", exe_ctx->process->GetID()); - var_success = true; - } - else if ((::strncmp (var_name_begin, "name}", strlen("name}")) == 0) || - (::strncmp (var_name_begin, "file.basename}", strlen("file.basename}")) == 0) || - (::strncmp (var_name_begin, "file.fullpath}", strlen("file.fullpath}")) == 0)) + Process *process = exe_ctx->GetProcessPtr(); + if (process) { - Module *exe_module = exe_ctx->process->GetTarget().GetExecutableModulePointer(); - if (exe_module) + var_name_begin += ::strlen ("process."); + if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) { - if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f') - { - format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename(); - var_success = format_file_spec; - } - else + s.Printf("%i", process->GetID()); + var_success = true; + } + else if ((::strncmp (var_name_begin, "name}", strlen("name}")) == 0) || + (::strncmp (var_name_begin, "file.basename}", strlen("file.basename}")) == 0) || + (::strncmp (var_name_begin, "file.fullpath}", strlen("file.fullpath}")) == 0)) + { + Module *exe_module = process->GetTarget().GetExecutableModulePointer(); + if (exe_module) { - format_file_spec = exe_module->GetFileSpec(); - var_success = format_file_spec; + if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f') + { + format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename(); + var_success = format_file_spec; + } + else + { + format_file_spec = exe_module->GetFileSpec(); + var_success = format_file_spec; + } } } } - } + } } break; case 't': if (::strncmp (var_name_begin, "thread.", strlen("thread.")) == 0) { - if (exe_ctx && exe_ctx->thread) + if (exe_ctx) { - var_name_begin += ::strlen ("thread."); - if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) - { - s.Printf("0x%4.4x", exe_ctx->thread->GetID()); - var_success = true; - } - else if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) - { - s.Printf("%u", exe_ctx->thread->GetIndexID()); - var_success = true; - } - else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) + Thread *thread = exe_ctx->GetThreadPtr(); + if (thread) { - cstr = exe_ctx->thread->GetName(); - var_success = cstr && cstr[0]; - if (var_success) - s.PutCString(cstr); - } - else if (::strncmp (var_name_begin, "queue}", strlen("queue}")) == 0) - { - cstr = exe_ctx->thread->GetQueueName(); - var_success = cstr && cstr[0]; - if (var_success) - s.PutCString(cstr); - } - else if (::strncmp (var_name_begin, "stop-reason}", strlen("stop-reason}")) == 0) - { - StopInfoSP stop_info_sp = exe_ctx->thread->GetStopInfo (); - if (stop_info_sp) + var_name_begin += ::strlen ("thread."); + if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) { - cstr = stop_info_sp->GetDescription(); - if (cstr && cstr[0]) - { + s.Printf("0x%4.4x", thread->GetID()); + var_success = true; + } + else if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) + { + s.Printf("%u", thread->GetIndexID()); + var_success = true; + } + else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) + { + cstr = thread->GetName(); + var_success = cstr && cstr[0]; + if (var_success) s.PutCString(cstr); - var_success = true; + } + else if (::strncmp (var_name_begin, "queue}", strlen("queue}")) == 0) + { + cstr = thread->GetQueueName(); + var_success = cstr && cstr[0]; + if (var_success) + s.PutCString(cstr); + } + else if (::strncmp (var_name_begin, "stop-reason}", strlen("stop-reason}")) == 0) + { + StopInfoSP stop_info_sp = thread->GetStopInfo (); + if (stop_info_sp) + { + cstr = stop_info_sp->GetDescription(); + if (cstr && cstr[0]) + { + s.PutCString(cstr); + var_success = true; + } } } } @@ -1455,50 +1463,54 @@ Debugger::FormatPrompt } else if (::strncmp (var_name_begin, "frame.", strlen("frame.")) == 0) { - if (exe_ctx && exe_ctx->frame) + if (exe_ctx) { - var_name_begin += ::strlen ("frame."); - if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) - { - s.Printf("%u", exe_ctx->frame->GetFrameIndex()); - var_success = true; - } - else if (::strncmp (var_name_begin, "pc}", strlen("pc}")) == 0) - { - reg_kind = eRegisterKindGeneric; - reg_num = LLDB_REGNUM_GENERIC_PC; - var_success = true; - } - else if (::strncmp (var_name_begin, "sp}", strlen("sp}")) == 0) - { - reg_kind = eRegisterKindGeneric; - reg_num = LLDB_REGNUM_GENERIC_SP; - var_success = true; - } - else if (::strncmp (var_name_begin, "fp}", strlen("fp}")) == 0) - { - reg_kind = eRegisterKindGeneric; - reg_num = LLDB_REGNUM_GENERIC_FP; - var_success = true; - } - else if (::strncmp (var_name_begin, "flags}", strlen("flags}")) == 0) + StackFrame *frame = exe_ctx->GetFramePtr(); + if (frame) { - reg_kind = eRegisterKindGeneric; - reg_num = LLDB_REGNUM_GENERIC_FLAGS; - var_success = true; - } - else if (::strncmp (var_name_begin, "reg.", strlen ("reg.")) == 0) - { - reg_ctx = exe_ctx->frame->GetRegisterContext().get(); - if (reg_ctx) + var_name_begin += ::strlen ("frame."); + if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) + { + s.Printf("%u", frame->GetFrameIndex()); + var_success = true; + } + else if (::strncmp (var_name_begin, "pc}", strlen("pc}")) == 0) { - var_name_begin += ::strlen ("reg."); - if (var_name_begin < var_name_end) + reg_kind = eRegisterKindGeneric; + reg_num = LLDB_REGNUM_GENERIC_PC; + var_success = true; + } + else if (::strncmp (var_name_begin, "sp}", strlen("sp}")) == 0) + { + reg_kind = eRegisterKindGeneric; + reg_num = LLDB_REGNUM_GENERIC_SP; + var_success = true; + } + else if (::strncmp (var_name_begin, "fp}", strlen("fp}")) == 0) + { + reg_kind = eRegisterKindGeneric; + reg_num = LLDB_REGNUM_GENERIC_FP; + var_success = true; + } + else if (::strncmp (var_name_begin, "flags}", strlen("flags}")) == 0) + { + reg_kind = eRegisterKindGeneric; + reg_num = LLDB_REGNUM_GENERIC_FLAGS; + var_success = true; + } + else if (::strncmp (var_name_begin, "reg.", strlen ("reg.")) == 0) + { + reg_ctx = frame->GetRegisterContext().get(); + if (reg_ctx) { - std::string reg_name (var_name_begin, var_name_end); - reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str()); - if (reg_info) - var_success = true; + var_name_begin += ::strlen ("reg."); + if (var_name_begin < var_name_end) + { + std::string reg_name (var_name_begin, var_name_end); + reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str()); + if (reg_info) + var_success = true; + } } } } @@ -1564,10 +1576,11 @@ Debugger::FormatPrompt } else if (::strncmp (var_name_begin, "pc-offset}", strlen("pc-offset}")) == 0) { - var_success = exe_ctx->frame; + StackFrame *frame = exe_ctx->GetFramePtr(); + var_success = frame != NULL; if (var_success) { - format_addr = exe_ctx->frame->GetFrameCodeAddress(); + format_addr = frame->GetFrameCodeAddress(); calculate_format_addr_function_offset = true; } } @@ -1622,15 +1635,16 @@ Debugger::FormatPrompt // If format addr is valid, then we need to print an address if (reg_num != LLDB_INVALID_REGNUM) { + StackFrame *frame = exe_ctx->GetFramePtr(); // We have a register value to display... if (reg_num == LLDB_REGNUM_GENERIC_PC && reg_kind == eRegisterKindGeneric) { - format_addr = exe_ctx->frame->GetFrameCodeAddress(); + format_addr = frame->GetFrameCodeAddress(); } else { if (reg_ctx == NULL) - reg_ctx = exe_ctx->frame->GetRegisterContext().get(); + reg_ctx = frame->GetRegisterContext().get(); if (reg_ctx) { |