130fdc8d8SChris Lattner //===-- SBDebugger.cpp ------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 10ca93cc1dSEli Friedman #include "lldb/API/SBDebugger.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include "lldb/lldb-include.h" 13*40af72e1SJim Ingham #include "lldb/Interpreter/Args.h" 1430fdc8d8SChris Lattner #include "lldb/Core/Debugger.h" 1530fdc8d8SChris Lattner #include "lldb/Core/State.h" 1630fdc8d8SChris Lattner #include "lldb/Target/Process.h" 1730fdc8d8SChris Lattner #include "lldb/Target/TargetList.h" 1830fdc8d8SChris Lattner 19ca93cc1dSEli Friedman #include "lldb/API/SBListener.h" 20ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h" 21ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h" 22ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h" 23ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h" 24ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h" 25ca93cc1dSEli Friedman #include "lldb/API/SBTarget.h" 26ca93cc1dSEli Friedman #include "lldb/API/SBProcess.h" 27ca93cc1dSEli Friedman #include "lldb/API/SBThread.h" 28ca93cc1dSEli Friedman #include "lldb/API/SBSourceManager.h" 29ca93cc1dSEli Friedman #include "lldb/API/SBInputReader.h" 3030fdc8d8SChris Lattner 3130fdc8d8SChris Lattner using namespace lldb; 3230fdc8d8SChris Lattner using namespace lldb_private; 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner void 3530fdc8d8SChris Lattner SBDebugger::Initialize () 3630fdc8d8SChris Lattner { 3730fdc8d8SChris Lattner Debugger::Initialize(); 3830fdc8d8SChris Lattner } 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner void 4130fdc8d8SChris Lattner SBDebugger::Terminate () 4230fdc8d8SChris Lattner { 4330fdc8d8SChris Lattner Debugger::Terminate(); 4430fdc8d8SChris Lattner } 4530fdc8d8SChris Lattner 4630fdc8d8SChris Lattner void 4730fdc8d8SChris Lattner SBDebugger::SetAsync (bool b) 4830fdc8d8SChris Lattner { 4930fdc8d8SChris Lattner static bool value_set_once = false; 5030fdc8d8SChris Lattner 5130fdc8d8SChris Lattner if (!value_set_once) 5230fdc8d8SChris Lattner { 5330fdc8d8SChris Lattner value_set_once = true; 5430fdc8d8SChris Lattner Debugger::GetSharedInstance().SetAsyncExecution(b); 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner } 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner void 5930fdc8d8SChris Lattner SBDebugger::SetInputFile (const char *tty_name) 6030fdc8d8SChris Lattner { 6130fdc8d8SChris Lattner // DEPRECATED: will be removed in next submission 6230fdc8d8SChris Lattner FILE *fh = ::fopen (tty_name, "r"); 6330fdc8d8SChris Lattner SetInputFileHandle (fh, true); 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner 6630fdc8d8SChris Lattner void 6730fdc8d8SChris Lattner SBDebugger::SetOutputFile (const char *tty_name) 6830fdc8d8SChris Lattner { 6930fdc8d8SChris Lattner // DEPRECATED: will be removed in next submission 7030fdc8d8SChris Lattner FILE *fh = ::fopen (tty_name, "w"); 7130fdc8d8SChris Lattner SetOutputFileHandle (fh, true); 7230fdc8d8SChris Lattner SetErrorFileHandle (fh, false); 7330fdc8d8SChris Lattner } 7430fdc8d8SChris Lattner 7530fdc8d8SChris Lattner void 7630fdc8d8SChris Lattner SBDebugger::SetErrorFile (const char *tty_name) 7730fdc8d8SChris Lattner { 7830fdc8d8SChris Lattner // DEPRECATED: will be removed in next submission 7930fdc8d8SChris Lattner } 8030fdc8d8SChris Lattner 8130fdc8d8SChris Lattner 8230fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users 8330fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session. 8430fdc8d8SChris Lattner void 8530fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership) 8630fdc8d8SChris Lattner { 8730fdc8d8SChris Lattner Debugger::GetSharedInstance().SetInputFileHandle (fh, transfer_ownership); 8830fdc8d8SChris Lattner } 8930fdc8d8SChris Lattner 9030fdc8d8SChris Lattner void 9130fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership) 9230fdc8d8SChris Lattner { 9330fdc8d8SChris Lattner Debugger::GetSharedInstance().SetOutputFileHandle (fh, transfer_ownership); 9430fdc8d8SChris Lattner } 9530fdc8d8SChris Lattner 9630fdc8d8SChris Lattner void 9730fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership) 9830fdc8d8SChris Lattner { 9930fdc8d8SChris Lattner Debugger::GetSharedInstance().SetErrorFileHandle (fh, transfer_ownership); 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 10230fdc8d8SChris Lattner FILE * 10330fdc8d8SChris Lattner SBDebugger::GetInputFileHandle () 10430fdc8d8SChris Lattner { 10530fdc8d8SChris Lattner return Debugger::GetSharedInstance().GetInputFileHandle(); 10630fdc8d8SChris Lattner } 10730fdc8d8SChris Lattner 10830fdc8d8SChris Lattner FILE * 10930fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle () 11030fdc8d8SChris Lattner { 11130fdc8d8SChris Lattner return Debugger::GetSharedInstance().GetOutputFileHandle(); 11230fdc8d8SChris Lattner } 11330fdc8d8SChris Lattner 11430fdc8d8SChris Lattner FILE * 11530fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle () 11630fdc8d8SChris Lattner { 11730fdc8d8SChris Lattner return Debugger::GetSharedInstance().GetErrorFileHandle(); 11830fdc8d8SChris Lattner } 11930fdc8d8SChris Lattner 12030fdc8d8SChris Lattner SBCommandInterpreter 12130fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter () 12230fdc8d8SChris Lattner { 12330fdc8d8SChris Lattner SBCommandInterpreter sb_interpreter(Debugger::GetSharedInstance().GetCommandInterpreter()); 12430fdc8d8SChris Lattner return sb_interpreter; 12530fdc8d8SChris Lattner } 12630fdc8d8SChris Lattner 12730fdc8d8SChris Lattner void 12830fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command) 12930fdc8d8SChris Lattner { 13030fdc8d8SChris Lattner SBProcess process; 13130fdc8d8SChris Lattner SBCommandInterpreter sb_interpreter(Debugger::GetSharedInstance().GetCommandInterpreter()); 13230fdc8d8SChris Lattner SBCommandReturnObject result; 13330fdc8d8SChris Lattner 13430fdc8d8SChris Lattner sb_interpreter.HandleCommand (command, result, false); 13530fdc8d8SChris Lattner 13630fdc8d8SChris Lattner if (GetErrorFileHandle() != NULL) 13730fdc8d8SChris Lattner result.PutError (GetErrorFileHandle()); 13830fdc8d8SChris Lattner if (GetOutputFileHandle() != NULL) 13930fdc8d8SChris Lattner result.PutOutput (GetOutputFileHandle()); 14030fdc8d8SChris Lattner 14130fdc8d8SChris Lattner if (Debugger::GetSharedInstance().GetAsyncExecution() == false) 14230fdc8d8SChris Lattner { 14330fdc8d8SChris Lattner process = GetCommandInterpreter().GetProcess (); 14430fdc8d8SChris Lattner if (process.IsValid()) 14530fdc8d8SChris Lattner { 14630fdc8d8SChris Lattner EventSP event_sp; 14730fdc8d8SChris Lattner Listener &lldb_listener = Debugger::GetSharedInstance().GetListener(); 14830fdc8d8SChris Lattner while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp)) 14930fdc8d8SChris Lattner { 15030fdc8d8SChris Lattner SBEvent event(event_sp); 15130fdc8d8SChris Lattner HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle()); 15230fdc8d8SChris Lattner } 15330fdc8d8SChris Lattner } 15430fdc8d8SChris Lattner } 15530fdc8d8SChris Lattner } 15630fdc8d8SChris Lattner 15730fdc8d8SChris Lattner SBListener 15830fdc8d8SChris Lattner SBDebugger::GetListener () 15930fdc8d8SChris Lattner { 16030fdc8d8SChris Lattner SBListener sb_listener(Debugger::GetSharedInstance().GetListener()); 16130fdc8d8SChris Lattner return sb_listener; 16230fdc8d8SChris Lattner } 16330fdc8d8SChris Lattner 16430fdc8d8SChris Lattner void 16530fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err) 16630fdc8d8SChris Lattner { 16730fdc8d8SChris Lattner const uint32_t event_type = event.GetType(); 16830fdc8d8SChris Lattner char stdio_buffer[1024]; 16930fdc8d8SChris Lattner size_t len; 17030fdc8d8SChris Lattner 17130fdc8d8SChris Lattner if (event_type & Process::eBroadcastBitSTDOUT) 17230fdc8d8SChris Lattner { 17330fdc8d8SChris Lattner while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0) 17430fdc8d8SChris Lattner if (out != NULL) 17530fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 17630fdc8d8SChris Lattner } 17730fdc8d8SChris Lattner else if (event_type & Process::eBroadcastBitSTDERR) 17830fdc8d8SChris Lattner { 17930fdc8d8SChris Lattner while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0) 18030fdc8d8SChris Lattner if (out != NULL) 18130fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 18230fdc8d8SChris Lattner } 18330fdc8d8SChris Lattner else if (event_type & Process::eBroadcastBitStateChanged) 18430fdc8d8SChris Lattner { 18530fdc8d8SChris Lattner // Drain any stdout messages. 18630fdc8d8SChris Lattner while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0) 18730fdc8d8SChris Lattner if (out != NULL) 18830fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 18930fdc8d8SChris Lattner 19030fdc8d8SChris Lattner // Drain any stderr messages. 19130fdc8d8SChris Lattner while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0) 19230fdc8d8SChris Lattner if (out != NULL) 19330fdc8d8SChris Lattner ::fwrite (stdio_buffer, 1, len, out); 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner StateType event_state = SBProcess::GetStateFromEvent (event); 19630fdc8d8SChris Lattner 19730fdc8d8SChris Lattner if (event_state == eStateInvalid) 19830fdc8d8SChris Lattner return; 19930fdc8d8SChris Lattner 20030fdc8d8SChris Lattner bool is_stopped = StateIsStoppedState (event_state); 20130fdc8d8SChris Lattner if (!is_stopped) 20230fdc8d8SChris Lattner process.ReportCurrentState (event, out); 20330fdc8d8SChris Lattner } 20430fdc8d8SChris Lattner } 20530fdc8d8SChris Lattner 20630fdc8d8SChris Lattner void 20730fdc8d8SChris Lattner SBDebugger::UpdateCurrentThread (SBProcess &process) 20830fdc8d8SChris Lattner { 20930fdc8d8SChris Lattner if (process.IsValid()) 21030fdc8d8SChris Lattner { 21130fdc8d8SChris Lattner SBThread curr_thread = process.GetCurrentThread (); 21230fdc8d8SChris Lattner SBThread thread; 21330fdc8d8SChris Lattner StopReason curr_thread_stop_reason = eStopReasonInvalid; 21430fdc8d8SChris Lattner if (curr_thread.IsValid()) 21530fdc8d8SChris Lattner { 21630fdc8d8SChris Lattner if (curr_thread.GetStopReason() != eStopReasonInvalid) 21730fdc8d8SChris Lattner curr_thread_stop_reason = curr_thread.GetStopReason (); 21830fdc8d8SChris Lattner } 21930fdc8d8SChris Lattner 22030fdc8d8SChris Lattner if (! curr_thread.IsValid() 22130fdc8d8SChris Lattner || curr_thread_stop_reason == eStopReasonInvalid 22230fdc8d8SChris Lattner || curr_thread_stop_reason == eStopReasonNone) 22330fdc8d8SChris Lattner { 22430fdc8d8SChris Lattner // Prefer a thread that has just completed its plan over another thread as current thread. 22530fdc8d8SChris Lattner SBThread plan_thread; 22630fdc8d8SChris Lattner SBThread other_thread; 22730fdc8d8SChris Lattner const size_t num_threads = process.GetNumThreads (); 22830fdc8d8SChris Lattner size_t i; 22930fdc8d8SChris Lattner for (i = 0; i < num_threads; ++i) 23030fdc8d8SChris Lattner { 23130fdc8d8SChris Lattner thread = process.GetThreadAtIndex(i); 23230fdc8d8SChris Lattner if (thread.GetStopReason () != eStopReasonInvalid) 23330fdc8d8SChris Lattner { 23430fdc8d8SChris Lattner switch (thread.GetStopReason ()) 23530fdc8d8SChris Lattner { 23630fdc8d8SChris Lattner default: 23730fdc8d8SChris Lattner case eStopReasonInvalid: 23830fdc8d8SChris Lattner case eStopReasonNone: 23930fdc8d8SChris Lattner break; 24030fdc8d8SChris Lattner 24130fdc8d8SChris Lattner case eStopReasonTrace: 24230fdc8d8SChris Lattner case eStopReasonBreakpoint: 24330fdc8d8SChris Lattner case eStopReasonWatchpoint: 24430fdc8d8SChris Lattner case eStopReasonSignal: 24530fdc8d8SChris Lattner case eStopReasonException: 24630fdc8d8SChris Lattner if (! other_thread.IsValid()) 24730fdc8d8SChris Lattner other_thread = thread; 24830fdc8d8SChris Lattner break; 24930fdc8d8SChris Lattner case eStopReasonPlanComplete: 25030fdc8d8SChris Lattner if (! plan_thread.IsValid()) 25130fdc8d8SChris Lattner plan_thread = thread; 25230fdc8d8SChris Lattner break; 25330fdc8d8SChris Lattner } 25430fdc8d8SChris Lattner } 25530fdc8d8SChris Lattner } 25630fdc8d8SChris Lattner if (plan_thread.IsValid()) 25730fdc8d8SChris Lattner process.SetCurrentThreadByID (plan_thread.GetThreadID()); 25830fdc8d8SChris Lattner else if (other_thread.IsValid()) 25930fdc8d8SChris Lattner process.SetCurrentThreadByID (other_thread.GetThreadID()); 26030fdc8d8SChris Lattner else 26130fdc8d8SChris Lattner { 26230fdc8d8SChris Lattner if (curr_thread.IsValid()) 26330fdc8d8SChris Lattner thread = curr_thread; 26430fdc8d8SChris Lattner else 26530fdc8d8SChris Lattner thread = process.GetThreadAtIndex(0); 26630fdc8d8SChris Lattner 26730fdc8d8SChris Lattner if (thread.IsValid()) 26830fdc8d8SChris Lattner process.SetCurrentThreadByID (thread.GetThreadID()); 26930fdc8d8SChris Lattner } 27030fdc8d8SChris Lattner } 27130fdc8d8SChris Lattner } 27230fdc8d8SChris Lattner } 27330fdc8d8SChris Lattner 27430fdc8d8SChris Lattner void 27530fdc8d8SChris Lattner SBDebugger::ReportCurrentLocation (FILE *out, FILE *err) 27630fdc8d8SChris Lattner { 27730fdc8d8SChris Lattner if ((out == NULL) || (err == NULL)) 27830fdc8d8SChris Lattner return; 27930fdc8d8SChris Lattner 28030fdc8d8SChris Lattner SBTarget sb_target (GetCurrentTarget()); 28130fdc8d8SChris Lattner if (!sb_target.IsValid()) 28230fdc8d8SChris Lattner { 28330fdc8d8SChris Lattner fprintf (out, "no target\n"); 28430fdc8d8SChris Lattner return; 28530fdc8d8SChris Lattner } 28630fdc8d8SChris Lattner 28730fdc8d8SChris Lattner SBProcess process = sb_target.GetProcess (); 28830fdc8d8SChris Lattner if (process.IsValid()) 28930fdc8d8SChris Lattner { 29030fdc8d8SChris Lattner StateType state = process.GetState(); 29130fdc8d8SChris Lattner 29230fdc8d8SChris Lattner if (StateIsStoppedState (state)) 29330fdc8d8SChris Lattner { 29430fdc8d8SChris Lattner if (state == eStateExited) 29530fdc8d8SChris Lattner { 29630fdc8d8SChris Lattner int exit_status = process.GetExitStatus(); 29730fdc8d8SChris Lattner const char *exit_description = process.GetExitDescription(); 29830fdc8d8SChris Lattner ::fprintf (out, "Process %d exited with status = %i (0x%8.8x) %s\n", 29930fdc8d8SChris Lattner process.GetProcessID(), 30030fdc8d8SChris Lattner exit_status, 30130fdc8d8SChris Lattner exit_status, 30230fdc8d8SChris Lattner exit_description ? exit_description : ""); 30330fdc8d8SChris Lattner } 30430fdc8d8SChris Lattner else 30530fdc8d8SChris Lattner { 30630fdc8d8SChris Lattner fprintf (out, "Process %d %s\n", process.GetProcessID(), StateAsCString (state)); 30730fdc8d8SChris Lattner SBThread current_thread = process.GetThreadAtIndex (0); 30830fdc8d8SChris Lattner if (current_thread.IsValid()) 30930fdc8d8SChris Lattner { 31030fdc8d8SChris Lattner process.DisplayThreadsInfo (out, err, true); 31130fdc8d8SChris Lattner } 31230fdc8d8SChris Lattner else 31330fdc8d8SChris Lattner fprintf (out, "No valid thread found in current process\n"); 31430fdc8d8SChris Lattner } 31530fdc8d8SChris Lattner } 31630fdc8d8SChris Lattner else 31730fdc8d8SChris Lattner fprintf (out, "No current location or status available\n"); 31830fdc8d8SChris Lattner } 31930fdc8d8SChris Lattner } 32030fdc8d8SChris Lattner 32130fdc8d8SChris Lattner SBSourceManager & 32230fdc8d8SChris Lattner SBDebugger::GetSourceManager () 32330fdc8d8SChris Lattner { 32430fdc8d8SChris Lattner static SourceManager g_lldb_source_manager; 32530fdc8d8SChris Lattner static SBSourceManager g_sb_source_manager (g_lldb_source_manager); 32630fdc8d8SChris Lattner return g_sb_source_manager; 32730fdc8d8SChris Lattner } 32830fdc8d8SChris Lattner 32930fdc8d8SChris Lattner 33030fdc8d8SChris Lattner bool 33130fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len) 33230fdc8d8SChris Lattner { 33330fdc8d8SChris Lattner if (arch_name && arch_name_len) 33430fdc8d8SChris Lattner { 33530fdc8d8SChris Lattner ArchSpec &default_arch = lldb_private::GetDefaultArchitecture (); 33630fdc8d8SChris Lattner if (default_arch.IsValid()) 33730fdc8d8SChris Lattner { 33830fdc8d8SChris Lattner ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString()); 33930fdc8d8SChris Lattner return true; 34030fdc8d8SChris Lattner } 34130fdc8d8SChris Lattner } 34230fdc8d8SChris Lattner if (arch_name && arch_name_len) 34330fdc8d8SChris Lattner arch_name[0] = '\0'; 34430fdc8d8SChris Lattner return false; 34530fdc8d8SChris Lattner } 34630fdc8d8SChris Lattner 34730fdc8d8SChris Lattner 34830fdc8d8SChris Lattner bool 34930fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name) 35030fdc8d8SChris Lattner { 35130fdc8d8SChris Lattner if (arch_name) 35230fdc8d8SChris Lattner { 35330fdc8d8SChris Lattner ArchSpec arch (arch_name); 35430fdc8d8SChris Lattner if (arch.IsValid()) 35530fdc8d8SChris Lattner { 35630fdc8d8SChris Lattner lldb_private::GetDefaultArchitecture () = arch; 35730fdc8d8SChris Lattner return true; 35830fdc8d8SChris Lattner } 35930fdc8d8SChris Lattner } 36030fdc8d8SChris Lattner return false; 36130fdc8d8SChris Lattner } 36230fdc8d8SChris Lattner 36330fdc8d8SChris Lattner ScriptLanguage 36430fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name) 36530fdc8d8SChris Lattner { 36630fdc8d8SChris Lattner return Args::StringToScriptLanguage (script_language_name, 36730fdc8d8SChris Lattner eScriptLanguageDefault, 36830fdc8d8SChris Lattner NULL); 36930fdc8d8SChris Lattner } 37030fdc8d8SChris Lattner //pid_t 37130fdc8d8SChris Lattner /* 37230fdc8d8SChris Lattner SBDebugger::AttachByName (const char *process_name, const char *filename) 37330fdc8d8SChris Lattner { 37430fdc8d8SChris Lattner SBTarget *temp_target = GetCurrentTarget(); 37530fdc8d8SChris Lattner SBTarget sb_target; 37630fdc8d8SChris Lattner pid_t return_pid = (pid_t) LLDB_INVALID_PROCESS_ID; 37730fdc8d8SChris Lattner 37830fdc8d8SChris Lattner if (temp_target == NULL) 37930fdc8d8SChris Lattner { 38030fdc8d8SChris Lattner if (filename != NULL) 38130fdc8d8SChris Lattner { 38230fdc8d8SChris Lattner sb_target = CreateWithFile (filename); 38330fdc8d8SChris Lattner sb_target.SetArch (LLDB_ARCH_DEFAULT); 38430fdc8d8SChris Lattner } 38530fdc8d8SChris Lattner } 38630fdc8d8SChris Lattner else 38730fdc8d8SChris Lattner { 38830fdc8d8SChris Lattner sb_target = *temp_target; 38930fdc8d8SChris Lattner } 39030fdc8d8SChris Lattner 39130fdc8d8SChris Lattner if (sb_target.IsValid()) 39230fdc8d8SChris Lattner { 39330fdc8d8SChris Lattner SBProcess process = sb_target.GetProcess (); 39430fdc8d8SChris Lattner if (process.IsValid()) 39530fdc8d8SChris Lattner { 39630fdc8d8SChris Lattner return_pid = process.AttachByName (process_name); 39730fdc8d8SChris Lattner } 39830fdc8d8SChris Lattner } 39930fdc8d8SChris Lattner return return_pid; 40030fdc8d8SChris Lattner } 40130fdc8d8SChris Lattner */ 40230fdc8d8SChris Lattner 40330fdc8d8SChris Lattner const char * 40430fdc8d8SChris Lattner SBDebugger::GetVersionString () 40530fdc8d8SChris Lattner { 40630fdc8d8SChris Lattner return lldb_private::GetVersion(); 40730fdc8d8SChris Lattner } 40830fdc8d8SChris Lattner 40930fdc8d8SChris Lattner const char * 41030fdc8d8SChris Lattner SBDebugger::StateAsCString (lldb::StateType state) 41130fdc8d8SChris Lattner { 41230fdc8d8SChris Lattner return lldb_private::StateAsCString (state); 41330fdc8d8SChris Lattner } 41430fdc8d8SChris Lattner 41530fdc8d8SChris Lattner bool 41630fdc8d8SChris Lattner SBDebugger::StateIsRunningState (lldb::StateType state) 41730fdc8d8SChris Lattner { 41830fdc8d8SChris Lattner return lldb_private::StateIsRunningState (state); 41930fdc8d8SChris Lattner } 42030fdc8d8SChris Lattner 42130fdc8d8SChris Lattner bool 42230fdc8d8SChris Lattner SBDebugger::StateIsStoppedState (lldb::StateType state) 42330fdc8d8SChris Lattner { 42430fdc8d8SChris Lattner return lldb_private::StateIsStoppedState (state); 42530fdc8d8SChris Lattner } 42630fdc8d8SChris Lattner 42730fdc8d8SChris Lattner 42830fdc8d8SChris Lattner SBTarget 42930fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename, 43030fdc8d8SChris Lattner const char *target_triple) 43130fdc8d8SChris Lattner { 43230fdc8d8SChris Lattner ArchSpec arch; 43330fdc8d8SChris Lattner FileSpec file_spec (filename); 43430fdc8d8SChris Lattner arch.SetArchFromTargetTriple(target_triple); 43530fdc8d8SChris Lattner TargetSP target_sp; 43630fdc8d8SChris Lattner Error error (Debugger::GetSharedInstance().GetTargetList().CreateTarget (file_spec, arch, NULL, true, target_sp)); 43730fdc8d8SChris Lattner SBTarget target(target_sp); 43830fdc8d8SChris Lattner return target; 43930fdc8d8SChris Lattner } 44030fdc8d8SChris Lattner 44130fdc8d8SChris Lattner SBTarget 44230fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname) 44330fdc8d8SChris Lattner { 44430fdc8d8SChris Lattner FileSpec file (filename); 44530fdc8d8SChris Lattner ArchSpec arch = lldb_private::GetDefaultArchitecture(); 44630fdc8d8SChris Lattner TargetSP target_sp; 44730fdc8d8SChris Lattner Error error; 44830fdc8d8SChris Lattner 44930fdc8d8SChris Lattner if (archname != NULL) 45030fdc8d8SChris Lattner { 45130fdc8d8SChris Lattner ArchSpec arch2 (archname); 45230fdc8d8SChris Lattner error = Debugger::GetSharedInstance().GetTargetList().CreateTarget (file, arch2, NULL, true, target_sp); 45330fdc8d8SChris Lattner } 45430fdc8d8SChris Lattner else 45530fdc8d8SChris Lattner { 45630fdc8d8SChris Lattner if (!arch.IsValid()) 45730fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT; 45830fdc8d8SChris Lattner 45930fdc8d8SChris Lattner error = Debugger::GetSharedInstance().GetTargetList().CreateTarget (file, arch, NULL, true, target_sp); 46030fdc8d8SChris Lattner 46130fdc8d8SChris Lattner if (error.Fail()) 46230fdc8d8SChris Lattner { 46330fdc8d8SChris Lattner if (arch == LLDB_ARCH_DEFAULT_32BIT) 46430fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_64BIT; 46530fdc8d8SChris Lattner else 46630fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_32BIT; 46730fdc8d8SChris Lattner 46830fdc8d8SChris Lattner error = Debugger::GetSharedInstance().GetTargetList().CreateTarget (file, arch, NULL, true, target_sp); 46930fdc8d8SChris Lattner } 47030fdc8d8SChris Lattner } 47130fdc8d8SChris Lattner 47230fdc8d8SChris Lattner if (error.Success()) 47330fdc8d8SChris Lattner Debugger::GetSharedInstance().GetTargetList().SetCurrentTarget (target_sp.get()); 47430fdc8d8SChris Lattner else 47530fdc8d8SChris Lattner target_sp.reset(); 47630fdc8d8SChris Lattner 47730fdc8d8SChris Lattner SBTarget sb_target (target_sp); 47830fdc8d8SChris Lattner return sb_target; 47930fdc8d8SChris Lattner } 48030fdc8d8SChris Lattner 48130fdc8d8SChris Lattner SBTarget 48230fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename) 48330fdc8d8SChris Lattner { 48430fdc8d8SChris Lattner FileSpec file (filename); 48530fdc8d8SChris Lattner ArchSpec arch = lldb_private::GetDefaultArchitecture(); 48630fdc8d8SChris Lattner TargetSP target_sp; 48730fdc8d8SChris Lattner Error error; 48830fdc8d8SChris Lattner 48930fdc8d8SChris Lattner if (!arch.IsValid()) 49030fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT; 49130fdc8d8SChris Lattner 49230fdc8d8SChris Lattner error = Debugger::GetSharedInstance().GetTargetList().CreateTarget (file, arch, NULL, true, target_sp); 49330fdc8d8SChris Lattner 49430fdc8d8SChris Lattner if (error.Fail()) 49530fdc8d8SChris Lattner { 49630fdc8d8SChris Lattner if (arch == LLDB_ARCH_DEFAULT_32BIT) 49730fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_64BIT; 49830fdc8d8SChris Lattner else 49930fdc8d8SChris Lattner arch = LLDB_ARCH_DEFAULT_32BIT; 50030fdc8d8SChris Lattner 50130fdc8d8SChris Lattner error = Debugger::GetSharedInstance().GetTargetList().CreateTarget (file, arch, NULL, true, target_sp); 50230fdc8d8SChris Lattner } 50330fdc8d8SChris Lattner 50430fdc8d8SChris Lattner if (!error.Fail()) 50530fdc8d8SChris Lattner Debugger::GetSharedInstance().GetTargetList().SetCurrentTarget (target_sp.get()); 50630fdc8d8SChris Lattner 50730fdc8d8SChris Lattner SBTarget sb_target (target_sp); 50830fdc8d8SChris Lattner return sb_target; 50930fdc8d8SChris Lattner } 51030fdc8d8SChris Lattner 51130fdc8d8SChris Lattner SBTarget 51230fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx) 51330fdc8d8SChris Lattner { 51430fdc8d8SChris Lattner SBTarget sb_target (Debugger::GetSharedInstance().GetTargetList().GetTargetAtIndex (idx)); 51530fdc8d8SChris Lattner return sb_target; 51630fdc8d8SChris Lattner } 51730fdc8d8SChris Lattner 51830fdc8d8SChris Lattner SBTarget 51930fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid) 52030fdc8d8SChris Lattner { 52130fdc8d8SChris Lattner SBTarget sb_target(Debugger::GetSharedInstance().GetTargetList().FindTargetWithProcessID (pid)); 52230fdc8d8SChris Lattner return sb_target; 52330fdc8d8SChris Lattner } 52430fdc8d8SChris Lattner 52530fdc8d8SChris Lattner SBTarget 52630fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name) 52730fdc8d8SChris Lattner { 52830fdc8d8SChris Lattner ArchSpec arch; 52930fdc8d8SChris Lattner if (arch_name) 53030fdc8d8SChris Lattner arch.SetArch(arch_name); 53130fdc8d8SChris Lattner return SBTarget (Debugger::GetSharedInstance().GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename), 53230fdc8d8SChris Lattner arch_name ? &arch : NULL)); 53330fdc8d8SChris Lattner } 53430fdc8d8SChris Lattner 53530fdc8d8SChris Lattner SBTarget 53630fdc8d8SChris Lattner SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp) 53730fdc8d8SChris Lattner { 53830fdc8d8SChris Lattner SBTarget sb_target(Debugger::GetSharedInstance().GetTargetList().FindTargetWithProcess (process_sp.get())); 53930fdc8d8SChris Lattner return sb_target; 54030fdc8d8SChris Lattner } 54130fdc8d8SChris Lattner 54230fdc8d8SChris Lattner 54330fdc8d8SChris Lattner uint32_t 54430fdc8d8SChris Lattner SBDebugger::GetNumTargets () 54530fdc8d8SChris Lattner { 54630fdc8d8SChris Lattner return Debugger::GetSharedInstance().GetTargetList().GetNumTargets ();} 54730fdc8d8SChris Lattner 54830fdc8d8SChris Lattner SBTarget 54930fdc8d8SChris Lattner SBDebugger::GetCurrentTarget () 55030fdc8d8SChris Lattner { 55130fdc8d8SChris Lattner SBTarget sb_target(Debugger::GetSharedInstance().GetTargetList().GetCurrentTarget ()); 55230fdc8d8SChris Lattner return sb_target; 55330fdc8d8SChris Lattner } 55430fdc8d8SChris Lattner 55530fdc8d8SChris Lattner void 55630fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len) 55730fdc8d8SChris Lattner { 55830fdc8d8SChris Lattner Debugger::GetSharedInstance().DispatchInput ((const char *) data, data_len); 55930fdc8d8SChris Lattner } 56030fdc8d8SChris Lattner 56130fdc8d8SChris Lattner void 56230fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader) 56330fdc8d8SChris Lattner { 56430fdc8d8SChris Lattner if (reader.IsValid()) 56530fdc8d8SChris Lattner { 56630fdc8d8SChris Lattner InputReaderSP reader_sp(*reader); 56730fdc8d8SChris Lattner Debugger::GetSharedInstance().PushInputReader (reader_sp); 56830fdc8d8SChris Lattner } 56930fdc8d8SChris Lattner } 570