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"
1340af72e1SJim 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 
4648e42549SGreg Clayton void
4748e42549SGreg Clayton SBDebugger::Clear ()
4848e42549SGreg Clayton {
4948e42549SGreg Clayton     m_opaque_sp.reset();
5048e42549SGreg Clayton }
5148e42549SGreg Clayton 
526611103cSGreg Clayton SBDebugger
536611103cSGreg Clayton SBDebugger::Create()
546611103cSGreg Clayton {
556611103cSGreg Clayton     SBDebugger debugger;
566611103cSGreg Clayton     debugger.reset(Debugger::CreateInstance());
576611103cSGreg Clayton     return debugger;
586611103cSGreg Clayton }
596611103cSGreg Clayton 
606611103cSGreg Clayton SBDebugger::SBDebugger () :
616611103cSGreg Clayton     m_opaque_sp ()
626611103cSGreg Clayton {
636611103cSGreg Clayton }
646611103cSGreg Clayton 
656611103cSGreg Clayton SBDebugger::~SBDebugger ()
666611103cSGreg Clayton {
676611103cSGreg Clayton }
686611103cSGreg Clayton 
696611103cSGreg Clayton bool
706611103cSGreg Clayton SBDebugger::IsValid() const
716611103cSGreg Clayton {
726611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
736611103cSGreg Clayton }
746611103cSGreg Clayton 
756611103cSGreg Clayton 
7630fdc8d8SChris Lattner void
7730fdc8d8SChris Lattner SBDebugger::SetAsync (bool b)
7830fdc8d8SChris Lattner {
796611103cSGreg Clayton     if (m_opaque_sp)
806611103cSGreg Clayton         m_opaque_sp->SetAsyncExecution(b);
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
8430fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session.
8530fdc8d8SChris Lattner void
8630fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
8730fdc8d8SChris Lattner {
886611103cSGreg Clayton     if (m_opaque_sp)
896611103cSGreg Clayton         m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
9030fdc8d8SChris Lattner }
9130fdc8d8SChris Lattner 
9230fdc8d8SChris Lattner void
9330fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
9430fdc8d8SChris Lattner {
956611103cSGreg Clayton     if (m_opaque_sp)
966611103cSGreg Clayton         m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner void
10030fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
10130fdc8d8SChris Lattner {
1026611103cSGreg Clayton     if (m_opaque_sp)
1036611103cSGreg Clayton         m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
10430fdc8d8SChris Lattner }
10530fdc8d8SChris Lattner 
10630fdc8d8SChris Lattner FILE *
10730fdc8d8SChris Lattner SBDebugger::GetInputFileHandle ()
10830fdc8d8SChris Lattner {
1096611103cSGreg Clayton     if (m_opaque_sp)
1106611103cSGreg Clayton         return m_opaque_sp->GetInputFileHandle();
1116611103cSGreg Clayton     return NULL;
11230fdc8d8SChris Lattner }
11330fdc8d8SChris Lattner 
11430fdc8d8SChris Lattner FILE *
11530fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle ()
11630fdc8d8SChris Lattner {
1176611103cSGreg Clayton     if (m_opaque_sp)
1186611103cSGreg Clayton         return m_opaque_sp->GetOutputFileHandle();
1196611103cSGreg Clayton     return NULL;
12030fdc8d8SChris Lattner }
12130fdc8d8SChris Lattner 
12230fdc8d8SChris Lattner FILE *
12330fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle ()
12430fdc8d8SChris Lattner {
1256611103cSGreg Clayton     if (m_opaque_sp)
1266611103cSGreg Clayton         return m_opaque_sp->GetErrorFileHandle();
1276611103cSGreg Clayton     return NULL;
12830fdc8d8SChris Lattner }
12930fdc8d8SChris Lattner 
13030fdc8d8SChris Lattner SBCommandInterpreter
13130fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter ()
13230fdc8d8SChris Lattner {
1336611103cSGreg Clayton     SBCommandInterpreter sb_interpreter;
1346611103cSGreg Clayton     if (m_opaque_sp)
1356611103cSGreg Clayton         sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
13630fdc8d8SChris Lattner     return sb_interpreter;
13730fdc8d8SChris Lattner }
13830fdc8d8SChris Lattner 
13930fdc8d8SChris Lattner void
14030fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command)
14130fdc8d8SChris Lattner {
1426611103cSGreg Clayton     if (m_opaque_sp)
1436611103cSGreg Clayton     {
1446611103cSGreg Clayton         SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
14530fdc8d8SChris Lattner         SBCommandReturnObject result;
14630fdc8d8SChris Lattner 
14730fdc8d8SChris Lattner         sb_interpreter.HandleCommand (command, result, false);
14830fdc8d8SChris Lattner 
14930fdc8d8SChris Lattner         if (GetErrorFileHandle() != NULL)
15030fdc8d8SChris Lattner             result.PutError (GetErrorFileHandle());
15130fdc8d8SChris Lattner         if (GetOutputFileHandle() != NULL)
15230fdc8d8SChris Lattner             result.PutOutput (GetOutputFileHandle());
15330fdc8d8SChris Lattner 
1546611103cSGreg Clayton         if (m_opaque_sp->GetAsyncExecution() == false)
15530fdc8d8SChris Lattner         {
1566611103cSGreg Clayton             SBProcess process(GetCommandInterpreter().GetProcess ());
15730fdc8d8SChris Lattner             if (process.IsValid())
15830fdc8d8SChris Lattner             {
15930fdc8d8SChris Lattner                 EventSP event_sp;
1606611103cSGreg Clayton                 Listener &lldb_listener = m_opaque_sp->GetListener();
16130fdc8d8SChris Lattner                 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
16230fdc8d8SChris Lattner                 {
16330fdc8d8SChris Lattner                     SBEvent event(event_sp);
16430fdc8d8SChris Lattner                     HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
16530fdc8d8SChris Lattner                 }
16630fdc8d8SChris Lattner             }
16730fdc8d8SChris Lattner         }
16830fdc8d8SChris Lattner     }
1696611103cSGreg Clayton }
17030fdc8d8SChris Lattner 
17130fdc8d8SChris Lattner SBListener
17230fdc8d8SChris Lattner SBDebugger::GetListener ()
17330fdc8d8SChris Lattner {
1746611103cSGreg Clayton     SBListener sb_listener;
1756611103cSGreg Clayton     if (m_opaque_sp)
1766611103cSGreg Clayton         sb_listener.reset(&m_opaque_sp->GetListener(), false);
17730fdc8d8SChris Lattner     return sb_listener;
17830fdc8d8SChris Lattner }
17930fdc8d8SChris Lattner 
18030fdc8d8SChris Lattner void
18130fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
18230fdc8d8SChris Lattner {
18330fdc8d8SChris Lattner      const uint32_t event_type = event.GetType();
18430fdc8d8SChris Lattner      char stdio_buffer[1024];
18530fdc8d8SChris Lattner      size_t len;
18630fdc8d8SChris Lattner 
18730fdc8d8SChris Lattner      if (event_type & Process::eBroadcastBitSTDOUT)
18830fdc8d8SChris Lattner      {
18930fdc8d8SChris Lattner          while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
19030fdc8d8SChris Lattner              if (out != NULL)
19130fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
19230fdc8d8SChris Lattner      }
19330fdc8d8SChris Lattner      else if (event_type & Process::eBroadcastBitSTDERR)
19430fdc8d8SChris Lattner      {
19530fdc8d8SChris Lattner          while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
19630fdc8d8SChris Lattner              if (out != NULL)
19730fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
19830fdc8d8SChris Lattner      }
19930fdc8d8SChris Lattner      else if (event_type & Process::eBroadcastBitStateChanged)
20030fdc8d8SChris Lattner      {
20130fdc8d8SChris Lattner          // Drain any stdout messages.
20230fdc8d8SChris Lattner          while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
20330fdc8d8SChris Lattner              if (out != NULL)
20430fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
20530fdc8d8SChris Lattner 
20630fdc8d8SChris Lattner          // Drain any stderr messages.
20730fdc8d8SChris Lattner          while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
20830fdc8d8SChris Lattner              if (out != NULL)
20930fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
21030fdc8d8SChris Lattner 
21130fdc8d8SChris Lattner          StateType event_state = SBProcess::GetStateFromEvent (event);
21230fdc8d8SChris Lattner 
21330fdc8d8SChris Lattner          if (event_state == eStateInvalid)
21430fdc8d8SChris Lattner              return;
21530fdc8d8SChris Lattner 
21630fdc8d8SChris Lattner          bool is_stopped = StateIsStoppedState (event_state);
21730fdc8d8SChris Lattner          if (!is_stopped)
218*2976d00aSJim Ingham              process.ReportEventState (event, out);
21930fdc8d8SChris Lattner    }
22030fdc8d8SChris Lattner }
22130fdc8d8SChris Lattner 
22230fdc8d8SChris Lattner void
223*2976d00aSJim Ingham SBDebugger::UpdateSelectedThread (SBProcess &process)
22430fdc8d8SChris Lattner {
22530fdc8d8SChris Lattner     if (process.IsValid())
22630fdc8d8SChris Lattner     {
227*2976d00aSJim Ingham         SBThread curr_thread = process.GetSelectedThread ();
22830fdc8d8SChris Lattner         SBThread thread;
22930fdc8d8SChris Lattner         StopReason curr_thread_stop_reason = eStopReasonInvalid;
23030fdc8d8SChris Lattner         if (curr_thread.IsValid())
23130fdc8d8SChris Lattner         {
23230fdc8d8SChris Lattner             if (curr_thread.GetStopReason() != eStopReasonInvalid)
23330fdc8d8SChris Lattner                 curr_thread_stop_reason = curr_thread.GetStopReason ();
23430fdc8d8SChris Lattner         }
23530fdc8d8SChris Lattner 
23630fdc8d8SChris Lattner         if (! curr_thread.IsValid()
23730fdc8d8SChris Lattner             || curr_thread_stop_reason == eStopReasonInvalid
23830fdc8d8SChris Lattner             || curr_thread_stop_reason == eStopReasonNone)
23930fdc8d8SChris Lattner           {
24030fdc8d8SChris Lattner             // Prefer a thread that has just completed its plan over another thread as current thread.
24130fdc8d8SChris Lattner             SBThread plan_thread;
24230fdc8d8SChris Lattner             SBThread other_thread;
24330fdc8d8SChris Lattner             const size_t num_threads = process.GetNumThreads ();
24430fdc8d8SChris Lattner             size_t i;
24530fdc8d8SChris Lattner             for (i = 0; i < num_threads; ++i)
24630fdc8d8SChris Lattner             {
24730fdc8d8SChris Lattner                 thread = process.GetThreadAtIndex(i);
24830fdc8d8SChris Lattner                 if (thread.GetStopReason () != eStopReasonInvalid)
24930fdc8d8SChris Lattner                 {
25030fdc8d8SChris Lattner                     switch (thread.GetStopReason ())
25130fdc8d8SChris Lattner                     {
25230fdc8d8SChris Lattner                         default:
25330fdc8d8SChris Lattner                         case eStopReasonInvalid:
25430fdc8d8SChris Lattner                         case eStopReasonNone:
25530fdc8d8SChris Lattner                             break;
25630fdc8d8SChris Lattner 
25730fdc8d8SChris Lattner                         case eStopReasonTrace:
25830fdc8d8SChris Lattner                         case eStopReasonBreakpoint:
25930fdc8d8SChris Lattner                         case eStopReasonWatchpoint:
26030fdc8d8SChris Lattner                         case eStopReasonSignal:
26130fdc8d8SChris Lattner                         case eStopReasonException:
26230fdc8d8SChris Lattner                             if (! other_thread.IsValid())
26330fdc8d8SChris Lattner                                 other_thread = thread;
26430fdc8d8SChris Lattner                             break;
26530fdc8d8SChris Lattner                         case eStopReasonPlanComplete:
26630fdc8d8SChris Lattner                             if (! plan_thread.IsValid())
26730fdc8d8SChris Lattner                                 plan_thread = thread;
26830fdc8d8SChris Lattner                             break;
26930fdc8d8SChris Lattner                     }
27030fdc8d8SChris Lattner                 }
27130fdc8d8SChris Lattner             }
27230fdc8d8SChris Lattner             if (plan_thread.IsValid())
273*2976d00aSJim Ingham                 process.SetSelectedThreadByID (plan_thread.GetThreadID());
27430fdc8d8SChris Lattner             else if (other_thread.IsValid())
275*2976d00aSJim Ingham                 process.SetSelectedThreadByID (other_thread.GetThreadID());
27630fdc8d8SChris Lattner             else
27730fdc8d8SChris Lattner             {
27830fdc8d8SChris Lattner                 if (curr_thread.IsValid())
27930fdc8d8SChris Lattner                     thread = curr_thread;
28030fdc8d8SChris Lattner                 else
28130fdc8d8SChris Lattner                     thread = process.GetThreadAtIndex(0);
28230fdc8d8SChris Lattner 
28330fdc8d8SChris Lattner                 if (thread.IsValid())
284*2976d00aSJim Ingham                     process.SetSelectedThreadByID (thread.GetThreadID());
28530fdc8d8SChris Lattner             }
28630fdc8d8SChris Lattner         }
28730fdc8d8SChris Lattner     }
28830fdc8d8SChris Lattner }
28930fdc8d8SChris Lattner 
29030fdc8d8SChris Lattner SBSourceManager &
29130fdc8d8SChris Lattner SBDebugger::GetSourceManager ()
29230fdc8d8SChris Lattner {
29330fdc8d8SChris Lattner     static SourceManager g_lldb_source_manager;
29430fdc8d8SChris Lattner     static SBSourceManager g_sb_source_manager (g_lldb_source_manager);
29530fdc8d8SChris Lattner     return g_sb_source_manager;
29630fdc8d8SChris Lattner }
29730fdc8d8SChris Lattner 
29830fdc8d8SChris Lattner 
29930fdc8d8SChris Lattner bool
30030fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
30130fdc8d8SChris Lattner {
30230fdc8d8SChris Lattner     if (arch_name && arch_name_len)
30330fdc8d8SChris Lattner     {
30430fdc8d8SChris Lattner         ArchSpec &default_arch = lldb_private::GetDefaultArchitecture ();
30530fdc8d8SChris Lattner         if (default_arch.IsValid())
30630fdc8d8SChris Lattner         {
30730fdc8d8SChris Lattner             ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
30830fdc8d8SChris Lattner             return true;
30930fdc8d8SChris Lattner         }
31030fdc8d8SChris Lattner     }
31130fdc8d8SChris Lattner     if (arch_name && arch_name_len)
31230fdc8d8SChris Lattner         arch_name[0] = '\0';
31330fdc8d8SChris Lattner     return false;
31430fdc8d8SChris Lattner }
31530fdc8d8SChris Lattner 
31630fdc8d8SChris Lattner 
31730fdc8d8SChris Lattner bool
31830fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name)
31930fdc8d8SChris Lattner {
32030fdc8d8SChris Lattner     if (arch_name)
32130fdc8d8SChris Lattner     {
32230fdc8d8SChris Lattner         ArchSpec arch (arch_name);
32330fdc8d8SChris Lattner         if (arch.IsValid())
32430fdc8d8SChris Lattner         {
32530fdc8d8SChris Lattner             lldb_private::GetDefaultArchitecture () = arch;
32630fdc8d8SChris Lattner             return true;
32730fdc8d8SChris Lattner         }
32830fdc8d8SChris Lattner     }
32930fdc8d8SChris Lattner     return false;
33030fdc8d8SChris Lattner }
33130fdc8d8SChris Lattner 
33230fdc8d8SChris Lattner ScriptLanguage
33330fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name)
33430fdc8d8SChris Lattner {
33530fdc8d8SChris Lattner     return Args::StringToScriptLanguage (script_language_name,
33630fdc8d8SChris Lattner                                          eScriptLanguageDefault,
33730fdc8d8SChris Lattner                                          NULL);
33830fdc8d8SChris Lattner }
33930fdc8d8SChris Lattner 
34030fdc8d8SChris Lattner const char *
34130fdc8d8SChris Lattner SBDebugger::GetVersionString ()
34230fdc8d8SChris Lattner {
34330fdc8d8SChris Lattner     return lldb_private::GetVersion();
34430fdc8d8SChris Lattner }
34530fdc8d8SChris Lattner 
34630fdc8d8SChris Lattner const char *
34730fdc8d8SChris Lattner SBDebugger::StateAsCString (lldb::StateType state)
34830fdc8d8SChris Lattner {
34930fdc8d8SChris Lattner     return lldb_private::StateAsCString (state);
35030fdc8d8SChris Lattner }
35130fdc8d8SChris Lattner 
35230fdc8d8SChris Lattner bool
35330fdc8d8SChris Lattner SBDebugger::StateIsRunningState (lldb::StateType state)
35430fdc8d8SChris Lattner {
35530fdc8d8SChris Lattner     return lldb_private::StateIsRunningState (state);
35630fdc8d8SChris Lattner }
35730fdc8d8SChris Lattner 
35830fdc8d8SChris Lattner bool
35930fdc8d8SChris Lattner SBDebugger::StateIsStoppedState (lldb::StateType state)
36030fdc8d8SChris Lattner {
36130fdc8d8SChris Lattner     return lldb_private::StateIsStoppedState (state);
36230fdc8d8SChris Lattner }
36330fdc8d8SChris Lattner 
36430fdc8d8SChris Lattner 
36530fdc8d8SChris Lattner SBTarget
36630fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
36730fdc8d8SChris Lattner                                                  const char *target_triple)
36830fdc8d8SChris Lattner {
3696611103cSGreg Clayton     SBTarget target;
3706611103cSGreg Clayton     if (m_opaque_sp)
3716611103cSGreg Clayton     {
37230fdc8d8SChris Lattner         ArchSpec arch;
37330fdc8d8SChris Lattner         FileSpec file_spec (filename);
37430fdc8d8SChris Lattner         arch.SetArchFromTargetTriple(target_triple);
37530fdc8d8SChris Lattner         TargetSP target_sp;
3766611103cSGreg Clayton         Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
3776611103cSGreg Clayton         target.reset (target_sp);
3786611103cSGreg Clayton     }
37930fdc8d8SChris Lattner     return target;
38030fdc8d8SChris Lattner }
38130fdc8d8SChris Lattner 
38230fdc8d8SChris Lattner SBTarget
38330fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
38430fdc8d8SChris Lattner {
3856611103cSGreg Clayton     SBTarget target;
3866611103cSGreg Clayton     if (m_opaque_sp)
3876611103cSGreg Clayton     {
38830fdc8d8SChris Lattner         FileSpec file (filename);
38930fdc8d8SChris Lattner         ArchSpec arch = lldb_private::GetDefaultArchitecture();
39030fdc8d8SChris Lattner         TargetSP target_sp;
39130fdc8d8SChris Lattner         Error error;
39230fdc8d8SChris Lattner 
39330fdc8d8SChris Lattner         if (archname != NULL)
39430fdc8d8SChris Lattner         {
39530fdc8d8SChris Lattner             ArchSpec arch2 (archname);
3966611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
39730fdc8d8SChris Lattner         }
39830fdc8d8SChris Lattner         else
39930fdc8d8SChris Lattner         {
40030fdc8d8SChris Lattner             if (!arch.IsValid())
40130fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT;
40230fdc8d8SChris Lattner 
4036611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
40430fdc8d8SChris Lattner 
40530fdc8d8SChris Lattner             if (error.Fail())
40630fdc8d8SChris Lattner             {
40730fdc8d8SChris Lattner                 if (arch == LLDB_ARCH_DEFAULT_32BIT)
40830fdc8d8SChris Lattner                     arch = LLDB_ARCH_DEFAULT_64BIT;
40930fdc8d8SChris Lattner                 else
41030fdc8d8SChris Lattner                     arch = LLDB_ARCH_DEFAULT_32BIT;
41130fdc8d8SChris Lattner 
4126611103cSGreg Clayton                 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
41330fdc8d8SChris Lattner             }
41430fdc8d8SChris Lattner         }
41530fdc8d8SChris Lattner 
41630fdc8d8SChris Lattner         if (error.Success())
4176611103cSGreg Clayton         {
418*2976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
4196611103cSGreg Clayton             target.reset(target_sp);
4206611103cSGreg Clayton         }
4216611103cSGreg Clayton     }
4226611103cSGreg Clayton     return target;
42330fdc8d8SChris Lattner }
42430fdc8d8SChris Lattner 
42530fdc8d8SChris Lattner SBTarget
42630fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename)
42730fdc8d8SChris Lattner {
4286611103cSGreg Clayton     SBTarget target;
4296611103cSGreg Clayton     if (m_opaque_sp)
4306611103cSGreg Clayton     {
43130fdc8d8SChris Lattner         FileSpec file (filename);
43230fdc8d8SChris Lattner         ArchSpec arch = lldb_private::GetDefaultArchitecture();
43330fdc8d8SChris Lattner         TargetSP target_sp;
43430fdc8d8SChris Lattner         Error error;
43530fdc8d8SChris Lattner 
43630fdc8d8SChris Lattner         if (!arch.IsValid())
43730fdc8d8SChris Lattner             arch = LLDB_ARCH_DEFAULT;
43830fdc8d8SChris Lattner 
4396611103cSGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
44030fdc8d8SChris Lattner 
44130fdc8d8SChris Lattner         if (error.Fail())
44230fdc8d8SChris Lattner         {
44330fdc8d8SChris Lattner             if (arch == LLDB_ARCH_DEFAULT_32BIT)
44430fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT_64BIT;
44530fdc8d8SChris Lattner             else
44630fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT_32BIT;
44730fdc8d8SChris Lattner 
4486611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
44930fdc8d8SChris Lattner         }
45030fdc8d8SChris Lattner 
4516611103cSGreg Clayton         if (error.Success())
4526611103cSGreg Clayton         {
453*2976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
4546611103cSGreg Clayton             target.reset (target_sp);
4556611103cSGreg Clayton         }
4566611103cSGreg Clayton     }
4576611103cSGreg Clayton     return target;
45830fdc8d8SChris Lattner }
45930fdc8d8SChris Lattner 
46030fdc8d8SChris Lattner SBTarget
46130fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx)
46230fdc8d8SChris Lattner {
4636611103cSGreg Clayton     SBTarget sb_target;
4646611103cSGreg Clayton     if (m_opaque_sp)
4656611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
46630fdc8d8SChris Lattner     return sb_target;
46730fdc8d8SChris Lattner }
46830fdc8d8SChris Lattner 
46930fdc8d8SChris Lattner SBTarget
47030fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid)
47130fdc8d8SChris Lattner {
4726611103cSGreg Clayton     SBTarget sb_target;
4736611103cSGreg Clayton     if (m_opaque_sp)
4746611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
47530fdc8d8SChris Lattner     return sb_target;
47630fdc8d8SChris Lattner }
47730fdc8d8SChris Lattner 
47830fdc8d8SChris Lattner SBTarget
47930fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
48030fdc8d8SChris Lattner {
4816611103cSGreg Clayton     SBTarget sb_target;
4826611103cSGreg Clayton     if (m_opaque_sp && filename && filename[0])
4836611103cSGreg Clayton     {
48430fdc8d8SChris Lattner         ArchSpec arch;
48530fdc8d8SChris Lattner         if (arch_name)
48630fdc8d8SChris Lattner             arch.SetArch(arch_name);
4876611103cSGreg Clayton         TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename), arch_name ? &arch : NULL));
4886611103cSGreg Clayton         sb_target.reset(target_sp);
4896611103cSGreg Clayton     }
4906611103cSGreg Clayton     return sb_target;
49130fdc8d8SChris Lattner }
49230fdc8d8SChris Lattner 
49330fdc8d8SChris Lattner SBTarget
49430fdc8d8SChris Lattner SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
49530fdc8d8SChris Lattner {
4966611103cSGreg Clayton     SBTarget sb_target;
4976611103cSGreg Clayton     if (m_opaque_sp)
4986611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
49930fdc8d8SChris Lattner     return sb_target;
50030fdc8d8SChris Lattner }
50130fdc8d8SChris Lattner 
50230fdc8d8SChris Lattner 
50330fdc8d8SChris Lattner uint32_t
50430fdc8d8SChris Lattner SBDebugger::GetNumTargets ()
50530fdc8d8SChris Lattner {
5066611103cSGreg Clayton     if (m_opaque_sp)
5076611103cSGreg Clayton         return m_opaque_sp->GetTargetList().GetNumTargets ();
5086611103cSGreg Clayton     return 0;
5096611103cSGreg Clayton }
51030fdc8d8SChris Lattner 
51130fdc8d8SChris Lattner SBTarget
512*2976d00aSJim Ingham SBDebugger::GetSelectedTarget ()
51330fdc8d8SChris Lattner {
5146611103cSGreg Clayton     SBTarget sb_target;
5156611103cSGreg Clayton     if (m_opaque_sp)
516*2976d00aSJim Ingham         sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
51730fdc8d8SChris Lattner     return sb_target;
51830fdc8d8SChris Lattner }
51930fdc8d8SChris Lattner 
52030fdc8d8SChris Lattner void
52130fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
52230fdc8d8SChris Lattner {
5236611103cSGreg Clayton     if (m_opaque_sp)
5246611103cSGreg Clayton         m_opaque_sp->DispatchInput ((const char *) data, data_len);
52530fdc8d8SChris Lattner }
52630fdc8d8SChris Lattner 
52730fdc8d8SChris Lattner void
52830fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader)
52930fdc8d8SChris Lattner {
5306611103cSGreg Clayton     if (m_opaque_sp && reader.IsValid())
53130fdc8d8SChris Lattner     {
53230fdc8d8SChris Lattner         InputReaderSP reader_sp(*reader);
5336611103cSGreg Clayton         m_opaque_sp->PushInputReader (reader_sp);
53430fdc8d8SChris Lattner     }
53530fdc8d8SChris Lattner }
5366611103cSGreg Clayton 
5376611103cSGreg Clayton void
5386611103cSGreg Clayton SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
5396611103cSGreg Clayton {
5406611103cSGreg Clayton     m_opaque_sp = debugger_sp;
5416611103cSGreg Clayton }
5426611103cSGreg Clayton 
5436611103cSGreg Clayton Debugger *
5446611103cSGreg Clayton SBDebugger::get () const
5456611103cSGreg Clayton {
5466611103cSGreg Clayton     return m_opaque_sp.get();
5476611103cSGreg Clayton }
5486611103cSGreg Clayton 
5496611103cSGreg Clayton Debugger &
5506611103cSGreg Clayton SBDebugger::ref () const
5516611103cSGreg Clayton {
5526611103cSGreg Clayton     assert (m_opaque_sp.get());
5536611103cSGreg Clayton     return *m_opaque_sp;
5546611103cSGreg Clayton }
5556611103cSGreg Clayton 
5566611103cSGreg Clayton 
557ebc1bb27SCaroline Tice SBDebugger
558ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id)
559ebc1bb27SCaroline Tice {
560ebc1bb27SCaroline Tice     SBDebugger sb_debugger;
561ebc1bb27SCaroline Tice     lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
562ebc1bb27SCaroline Tice     if (debugger_sp)
563ebc1bb27SCaroline Tice         sb_debugger.reset (debugger_sp);
564ebc1bb27SCaroline Tice     return sb_debugger;
565ebc1bb27SCaroline Tice }
566