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