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"
1330fdc8d8SChris Lattner 
14ca93cc1dSEli Friedman #include "lldb/API/SBListener.h"
15ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h"
16ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h"
17ca93cc1dSEli Friedman #include "lldb/API/SBCommandReturnObject.h"
18ca93cc1dSEli Friedman #include "lldb/API/SBEvent.h"
19ca93cc1dSEli Friedman #include "lldb/API/SBFrame.h"
20ca93cc1dSEli Friedman #include "lldb/API/SBInputReader.h"
213df9a8dfSCaroline Tice #include "lldb/API/SBProcess.h"
223df9a8dfSCaroline Tice #include "lldb/API/SBSourceManager.h"
23dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
243df9a8dfSCaroline Tice #include "lldb/API/SBStringList.h"
253df9a8dfSCaroline Tice #include "lldb/API/SBTarget.h"
263df9a8dfSCaroline Tice #include "lldb/API/SBThread.h"
276eee5aa0SGreg Clayton #include "lldb/Core/Debugger.h"
286eee5aa0SGreg Clayton #include "lldb/Core/State.h"
296eee5aa0SGreg Clayton #include "lldb/Interpreter/Args.h"
306eee5aa0SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
316eee5aa0SGreg Clayton #include "lldb/Target/Process.h"
326eee5aa0SGreg Clayton #include "lldb/Target/TargetList.h"
3330fdc8d8SChris Lattner 
3430fdc8d8SChris Lattner using namespace lldb;
3530fdc8d8SChris Lattner using namespace lldb_private;
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner void
3830fdc8d8SChris Lattner SBDebugger::Initialize ()
3930fdc8d8SChris Lattner {
4030fdc8d8SChris Lattner     Debugger::Initialize();
4130fdc8d8SChris Lattner }
4230fdc8d8SChris Lattner 
4330fdc8d8SChris Lattner void
4430fdc8d8SChris Lattner SBDebugger::Terminate ()
4530fdc8d8SChris Lattner {
4630fdc8d8SChris Lattner     Debugger::Terminate();
4730fdc8d8SChris Lattner }
4830fdc8d8SChris Lattner 
4948e42549SGreg Clayton void
5048e42549SGreg Clayton SBDebugger::Clear ()
5148e42549SGreg Clayton {
5248e42549SGreg Clayton     m_opaque_sp.reset();
5348e42549SGreg Clayton }
5448e42549SGreg Clayton 
556611103cSGreg Clayton SBDebugger
566611103cSGreg Clayton SBDebugger::Create()
576611103cSGreg Clayton {
586611103cSGreg Clayton     SBDebugger debugger;
596611103cSGreg Clayton     debugger.reset(Debugger::CreateInstance());
606611103cSGreg Clayton     return debugger;
616611103cSGreg Clayton }
626611103cSGreg Clayton 
636611103cSGreg Clayton SBDebugger::SBDebugger () :
646611103cSGreg Clayton     m_opaque_sp ()
656611103cSGreg Clayton {
666611103cSGreg Clayton }
676611103cSGreg Clayton 
686611103cSGreg Clayton SBDebugger::~SBDebugger ()
696611103cSGreg Clayton {
706611103cSGreg Clayton }
716611103cSGreg Clayton 
726611103cSGreg Clayton bool
736611103cSGreg Clayton SBDebugger::IsValid() const
746611103cSGreg Clayton {
756611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
766611103cSGreg Clayton }
776611103cSGreg Clayton 
786611103cSGreg Clayton 
7930fdc8d8SChris Lattner void
8030fdc8d8SChris Lattner SBDebugger::SetAsync (bool b)
8130fdc8d8SChris Lattner {
826611103cSGreg Clayton     if (m_opaque_sp)
836611103cSGreg Clayton         m_opaque_sp->SetAsyncExecution(b);
8430fdc8d8SChris Lattner }
8530fdc8d8SChris Lattner 
866eee5aa0SGreg Clayton void
876eee5aa0SGreg Clayton SBDebugger::SkipLLDBInitFiles (bool b)
886eee5aa0SGreg Clayton {
896eee5aa0SGreg Clayton     if (m_opaque_sp)
906eee5aa0SGreg Clayton         m_opaque_sp->GetCommandInterpreter().SkipLLDBInitFiles (b);
916eee5aa0SGreg Clayton }
926eee5aa0SGreg Clayton 
9330fdc8d8SChris Lattner // Shouldn't really be settable after initialization as this could cause lots of problems; don't want users
9430fdc8d8SChris Lattner // trying to switch modes in the middle of a debugging session.
9530fdc8d8SChris Lattner void
9630fdc8d8SChris Lattner SBDebugger::SetInputFileHandle (FILE *fh, bool transfer_ownership)
9730fdc8d8SChris Lattner {
986611103cSGreg Clayton     if (m_opaque_sp)
996611103cSGreg Clayton         m_opaque_sp->SetInputFileHandle (fh, transfer_ownership);
10030fdc8d8SChris Lattner }
10130fdc8d8SChris Lattner 
10230fdc8d8SChris Lattner void
10330fdc8d8SChris Lattner SBDebugger::SetOutputFileHandle (FILE *fh, bool transfer_ownership)
10430fdc8d8SChris Lattner {
1056611103cSGreg Clayton     if (m_opaque_sp)
1066611103cSGreg Clayton         m_opaque_sp->SetOutputFileHandle (fh, transfer_ownership);
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
10930fdc8d8SChris Lattner void
11030fdc8d8SChris Lattner SBDebugger::SetErrorFileHandle (FILE *fh, bool transfer_ownership)
11130fdc8d8SChris Lattner {
1126611103cSGreg Clayton     if (m_opaque_sp)
1136611103cSGreg Clayton         m_opaque_sp->SetErrorFileHandle (fh, transfer_ownership);
11430fdc8d8SChris Lattner }
11530fdc8d8SChris Lattner 
11630fdc8d8SChris Lattner FILE *
11730fdc8d8SChris Lattner SBDebugger::GetInputFileHandle ()
11830fdc8d8SChris Lattner {
1196611103cSGreg Clayton     if (m_opaque_sp)
1206611103cSGreg Clayton         return m_opaque_sp->GetInputFileHandle();
1216611103cSGreg Clayton     return NULL;
12230fdc8d8SChris Lattner }
12330fdc8d8SChris Lattner 
12430fdc8d8SChris Lattner FILE *
12530fdc8d8SChris Lattner SBDebugger::GetOutputFileHandle ()
12630fdc8d8SChris Lattner {
1276611103cSGreg Clayton     if (m_opaque_sp)
1286611103cSGreg Clayton         return m_opaque_sp->GetOutputFileHandle();
1296611103cSGreg Clayton     return NULL;
13030fdc8d8SChris Lattner }
13130fdc8d8SChris Lattner 
13230fdc8d8SChris Lattner FILE *
13330fdc8d8SChris Lattner SBDebugger::GetErrorFileHandle ()
13430fdc8d8SChris Lattner {
1356611103cSGreg Clayton     if (m_opaque_sp)
1366611103cSGreg Clayton         return m_opaque_sp->GetErrorFileHandle();
1376611103cSGreg Clayton     return NULL;
13830fdc8d8SChris Lattner }
13930fdc8d8SChris Lattner 
14030fdc8d8SChris Lattner SBCommandInterpreter
14130fdc8d8SChris Lattner SBDebugger::GetCommandInterpreter ()
14230fdc8d8SChris Lattner {
1436611103cSGreg Clayton     SBCommandInterpreter sb_interpreter;
1446611103cSGreg Clayton     if (m_opaque_sp)
1456611103cSGreg Clayton         sb_interpreter.reset (&m_opaque_sp->GetCommandInterpreter());
14630fdc8d8SChris Lattner     return sb_interpreter;
14730fdc8d8SChris Lattner }
14830fdc8d8SChris Lattner 
14930fdc8d8SChris Lattner void
15030fdc8d8SChris Lattner SBDebugger::HandleCommand (const char *command)
15130fdc8d8SChris Lattner {
1526611103cSGreg Clayton     if (m_opaque_sp)
1536611103cSGreg Clayton     {
1546611103cSGreg Clayton         SBCommandInterpreter sb_interpreter(GetCommandInterpreter ());
15530fdc8d8SChris Lattner         SBCommandReturnObject result;
15630fdc8d8SChris Lattner 
15730fdc8d8SChris Lattner         sb_interpreter.HandleCommand (command, result, false);
15830fdc8d8SChris Lattner 
15930fdc8d8SChris Lattner         if (GetErrorFileHandle() != NULL)
16030fdc8d8SChris Lattner             result.PutError (GetErrorFileHandle());
16130fdc8d8SChris Lattner         if (GetOutputFileHandle() != NULL)
16230fdc8d8SChris Lattner             result.PutOutput (GetOutputFileHandle());
16330fdc8d8SChris Lattner 
1646611103cSGreg Clayton         if (m_opaque_sp->GetAsyncExecution() == false)
16530fdc8d8SChris Lattner         {
1666611103cSGreg Clayton             SBProcess process(GetCommandInterpreter().GetProcess ());
16730fdc8d8SChris Lattner             if (process.IsValid())
16830fdc8d8SChris Lattner             {
16930fdc8d8SChris Lattner                 EventSP event_sp;
1706611103cSGreg Clayton                 Listener &lldb_listener = m_opaque_sp->GetListener();
17130fdc8d8SChris Lattner                 while (lldb_listener.GetNextEventForBroadcaster (process.get(), event_sp))
17230fdc8d8SChris Lattner                 {
17330fdc8d8SChris Lattner                     SBEvent event(event_sp);
17430fdc8d8SChris Lattner                     HandleProcessEvent (process, event, GetOutputFileHandle(), GetErrorFileHandle());
17530fdc8d8SChris Lattner                 }
17630fdc8d8SChris Lattner             }
17730fdc8d8SChris Lattner         }
17830fdc8d8SChris Lattner     }
1796611103cSGreg Clayton }
18030fdc8d8SChris Lattner 
18130fdc8d8SChris Lattner SBListener
18230fdc8d8SChris Lattner SBDebugger::GetListener ()
18330fdc8d8SChris Lattner {
1846611103cSGreg Clayton     SBListener sb_listener;
1856611103cSGreg Clayton     if (m_opaque_sp)
1866611103cSGreg Clayton         sb_listener.reset(&m_opaque_sp->GetListener(), false);
18730fdc8d8SChris Lattner     return sb_listener;
18830fdc8d8SChris Lattner }
18930fdc8d8SChris Lattner 
19030fdc8d8SChris Lattner void
19130fdc8d8SChris Lattner SBDebugger::HandleProcessEvent (const SBProcess &process, const SBEvent &event, FILE *out, FILE *err)
19230fdc8d8SChris Lattner {
19330fdc8d8SChris Lattner      const uint32_t event_type = event.GetType();
19430fdc8d8SChris Lattner      char stdio_buffer[1024];
19530fdc8d8SChris Lattner      size_t len;
19630fdc8d8SChris Lattner 
19730fdc8d8SChris Lattner      if (event_type & Process::eBroadcastBitSTDOUT)
19830fdc8d8SChris Lattner      {
19930fdc8d8SChris Lattner          while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
20030fdc8d8SChris Lattner              if (out != NULL)
20130fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
20230fdc8d8SChris Lattner      }
20330fdc8d8SChris Lattner      else if (event_type & Process::eBroadcastBitSTDERR)
20430fdc8d8SChris Lattner      {
20530fdc8d8SChris Lattner          while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
20630fdc8d8SChris Lattner              if (out != NULL)
20730fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
20830fdc8d8SChris Lattner      }
20930fdc8d8SChris Lattner      else if (event_type & Process::eBroadcastBitStateChanged)
21030fdc8d8SChris Lattner      {
21130fdc8d8SChris Lattner          // Drain any stdout messages.
21230fdc8d8SChris Lattner          while ((len = process.GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
21330fdc8d8SChris Lattner              if (out != NULL)
21430fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
21530fdc8d8SChris Lattner 
21630fdc8d8SChris Lattner          // Drain any stderr messages.
21730fdc8d8SChris Lattner          while ((len = process.GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
21830fdc8d8SChris Lattner              if (out != NULL)
21930fdc8d8SChris Lattner                  ::fwrite (stdio_buffer, 1, len, out);
22030fdc8d8SChris Lattner 
22130fdc8d8SChris Lattner          StateType event_state = SBProcess::GetStateFromEvent (event);
22230fdc8d8SChris Lattner 
22330fdc8d8SChris Lattner          if (event_state == eStateInvalid)
22430fdc8d8SChris Lattner              return;
22530fdc8d8SChris Lattner 
22630fdc8d8SChris Lattner          bool is_stopped = StateIsStoppedState (event_state);
22730fdc8d8SChris Lattner          if (!is_stopped)
2282976d00aSJim Ingham              process.ReportEventState (event, out);
22930fdc8d8SChris Lattner    }
23030fdc8d8SChris Lattner }
23130fdc8d8SChris Lattner 
23230fdc8d8SChris Lattner void
2332976d00aSJim Ingham SBDebugger::UpdateSelectedThread (SBProcess &process)
23430fdc8d8SChris Lattner {
23530fdc8d8SChris Lattner     if (process.IsValid())
23630fdc8d8SChris Lattner     {
2372976d00aSJim Ingham         SBThread curr_thread = process.GetSelectedThread ();
23830fdc8d8SChris Lattner         SBThread thread;
23930fdc8d8SChris Lattner         StopReason curr_thread_stop_reason = eStopReasonInvalid;
24030fdc8d8SChris Lattner         if (curr_thread.IsValid())
24130fdc8d8SChris Lattner         {
24230fdc8d8SChris Lattner             if (curr_thread.GetStopReason() != eStopReasonInvalid)
24330fdc8d8SChris Lattner                 curr_thread_stop_reason = curr_thread.GetStopReason ();
24430fdc8d8SChris Lattner         }
24530fdc8d8SChris Lattner 
24630fdc8d8SChris Lattner         if (! curr_thread.IsValid()
24730fdc8d8SChris Lattner             || curr_thread_stop_reason == eStopReasonInvalid
24830fdc8d8SChris Lattner             || curr_thread_stop_reason == eStopReasonNone)
24930fdc8d8SChris Lattner           {
25030fdc8d8SChris Lattner             // Prefer a thread that has just completed its plan over another thread as current thread.
25130fdc8d8SChris Lattner             SBThread plan_thread;
25230fdc8d8SChris Lattner             SBThread other_thread;
25330fdc8d8SChris Lattner             const size_t num_threads = process.GetNumThreads ();
25430fdc8d8SChris Lattner             size_t i;
25530fdc8d8SChris Lattner             for (i = 0; i < num_threads; ++i)
25630fdc8d8SChris Lattner             {
25730fdc8d8SChris Lattner                 thread = process.GetThreadAtIndex(i);
25830fdc8d8SChris Lattner                 if (thread.GetStopReason () != eStopReasonInvalid)
25930fdc8d8SChris Lattner                 {
26030fdc8d8SChris Lattner                     switch (thread.GetStopReason ())
26130fdc8d8SChris Lattner                     {
26230fdc8d8SChris Lattner                         default:
26330fdc8d8SChris Lattner                         case eStopReasonInvalid:
26430fdc8d8SChris Lattner                         case eStopReasonNone:
26530fdc8d8SChris Lattner                             break;
26630fdc8d8SChris Lattner 
26730fdc8d8SChris Lattner                         case eStopReasonTrace:
26830fdc8d8SChris Lattner                         case eStopReasonBreakpoint:
26930fdc8d8SChris Lattner                         case eStopReasonWatchpoint:
27030fdc8d8SChris Lattner                         case eStopReasonSignal:
27130fdc8d8SChris Lattner                         case eStopReasonException:
27230fdc8d8SChris Lattner                             if (! other_thread.IsValid())
27330fdc8d8SChris Lattner                                 other_thread = thread;
27430fdc8d8SChris Lattner                             break;
27530fdc8d8SChris Lattner                         case eStopReasonPlanComplete:
27630fdc8d8SChris Lattner                             if (! plan_thread.IsValid())
27730fdc8d8SChris Lattner                                 plan_thread = thread;
27830fdc8d8SChris Lattner                             break;
27930fdc8d8SChris Lattner                     }
28030fdc8d8SChris Lattner                 }
28130fdc8d8SChris Lattner             }
28230fdc8d8SChris Lattner             if (plan_thread.IsValid())
2832976d00aSJim Ingham                 process.SetSelectedThreadByID (plan_thread.GetThreadID());
28430fdc8d8SChris Lattner             else if (other_thread.IsValid())
2852976d00aSJim Ingham                 process.SetSelectedThreadByID (other_thread.GetThreadID());
28630fdc8d8SChris Lattner             else
28730fdc8d8SChris Lattner             {
28830fdc8d8SChris Lattner                 if (curr_thread.IsValid())
28930fdc8d8SChris Lattner                     thread = curr_thread;
29030fdc8d8SChris Lattner                 else
29130fdc8d8SChris Lattner                     thread = process.GetThreadAtIndex(0);
29230fdc8d8SChris Lattner 
29330fdc8d8SChris Lattner                 if (thread.IsValid())
2942976d00aSJim Ingham                     process.SetSelectedThreadByID (thread.GetThreadID());
29530fdc8d8SChris Lattner             }
29630fdc8d8SChris Lattner         }
29730fdc8d8SChris Lattner     }
29830fdc8d8SChris Lattner }
29930fdc8d8SChris Lattner 
30030fdc8d8SChris Lattner SBSourceManager &
30130fdc8d8SChris Lattner SBDebugger::GetSourceManager ()
30230fdc8d8SChris Lattner {
30330fdc8d8SChris Lattner     static SourceManager g_lldb_source_manager;
30430fdc8d8SChris Lattner     static SBSourceManager g_sb_source_manager (g_lldb_source_manager);
30530fdc8d8SChris Lattner     return g_sb_source_manager;
30630fdc8d8SChris Lattner }
30730fdc8d8SChris Lattner 
30830fdc8d8SChris Lattner 
30930fdc8d8SChris Lattner bool
31030fdc8d8SChris Lattner SBDebugger::GetDefaultArchitecture (char *arch_name, size_t arch_name_len)
31130fdc8d8SChris Lattner {
31230fdc8d8SChris Lattner     if (arch_name && arch_name_len)
31330fdc8d8SChris Lattner     {
314daccaa9eSCaroline Tice         ArchSpec default_arch = lldb_private::Target::GetDefaultArchitecture ();
315daccaa9eSCaroline Tice 
31630fdc8d8SChris Lattner         if (default_arch.IsValid())
31730fdc8d8SChris Lattner         {
31830fdc8d8SChris Lattner             ::snprintf (arch_name, arch_name_len, "%s", default_arch.AsCString());
31930fdc8d8SChris Lattner             return true;
32030fdc8d8SChris Lattner         }
32130fdc8d8SChris Lattner     }
32230fdc8d8SChris Lattner     if (arch_name && arch_name_len)
32330fdc8d8SChris Lattner         arch_name[0] = '\0';
32430fdc8d8SChris Lattner     return false;
32530fdc8d8SChris Lattner }
32630fdc8d8SChris Lattner 
32730fdc8d8SChris Lattner 
32830fdc8d8SChris Lattner bool
32930fdc8d8SChris Lattner SBDebugger::SetDefaultArchitecture (const char *arch_name)
33030fdc8d8SChris Lattner {
33130fdc8d8SChris Lattner     if (arch_name)
33230fdc8d8SChris Lattner     {
33330fdc8d8SChris Lattner         ArchSpec arch (arch_name);
33430fdc8d8SChris Lattner         if (arch.IsValid())
33530fdc8d8SChris Lattner         {
336daccaa9eSCaroline Tice             lldb_private::Target::SetDefaultArchitecture (arch);
33730fdc8d8SChris Lattner             return true;
33830fdc8d8SChris Lattner         }
33930fdc8d8SChris Lattner     }
34030fdc8d8SChris Lattner     return false;
34130fdc8d8SChris Lattner }
34230fdc8d8SChris Lattner 
34330fdc8d8SChris Lattner ScriptLanguage
34430fdc8d8SChris Lattner SBDebugger::GetScriptingLanguage (const char *script_language_name)
34530fdc8d8SChris Lattner {
34630fdc8d8SChris Lattner     return Args::StringToScriptLanguage (script_language_name,
34730fdc8d8SChris Lattner                                          eScriptLanguageDefault,
34830fdc8d8SChris Lattner                                          NULL);
34930fdc8d8SChris Lattner }
35030fdc8d8SChris Lattner 
35130fdc8d8SChris Lattner const char *
35230fdc8d8SChris Lattner SBDebugger::GetVersionString ()
35330fdc8d8SChris Lattner {
35430fdc8d8SChris Lattner     return lldb_private::GetVersion();
35530fdc8d8SChris Lattner }
35630fdc8d8SChris Lattner 
35730fdc8d8SChris Lattner const char *
35830fdc8d8SChris Lattner SBDebugger::StateAsCString (lldb::StateType state)
35930fdc8d8SChris Lattner {
36030fdc8d8SChris Lattner     return lldb_private::StateAsCString (state);
36130fdc8d8SChris Lattner }
36230fdc8d8SChris Lattner 
36330fdc8d8SChris Lattner bool
36430fdc8d8SChris Lattner SBDebugger::StateIsRunningState (lldb::StateType state)
36530fdc8d8SChris Lattner {
36630fdc8d8SChris Lattner     return lldb_private::StateIsRunningState (state);
36730fdc8d8SChris Lattner }
36830fdc8d8SChris Lattner 
36930fdc8d8SChris Lattner bool
37030fdc8d8SChris Lattner SBDebugger::StateIsStoppedState (lldb::StateType state)
37130fdc8d8SChris Lattner {
37230fdc8d8SChris Lattner     return lldb_private::StateIsStoppedState (state);
37330fdc8d8SChris Lattner }
37430fdc8d8SChris Lattner 
37530fdc8d8SChris Lattner 
37630fdc8d8SChris Lattner SBTarget
37730fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndTargetTriple (const char *filename,
37830fdc8d8SChris Lattner                                                  const char *target_triple)
37930fdc8d8SChris Lattner {
3806611103cSGreg Clayton     SBTarget target;
3816611103cSGreg Clayton     if (m_opaque_sp)
3826611103cSGreg Clayton     {
38330fdc8d8SChris Lattner         ArchSpec arch;
384*274060b6SGreg Clayton         FileSpec file_spec (filename, true);
38530fdc8d8SChris Lattner         arch.SetArchFromTargetTriple(target_triple);
38630fdc8d8SChris Lattner         TargetSP target_sp;
3876611103cSGreg Clayton         Error error (m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file_spec, arch, NULL, true, target_sp));
3886611103cSGreg Clayton         target.reset (target_sp);
3896611103cSGreg Clayton     }
39030fdc8d8SChris Lattner     return target;
39130fdc8d8SChris Lattner }
39230fdc8d8SChris Lattner 
39330fdc8d8SChris Lattner SBTarget
39430fdc8d8SChris Lattner SBDebugger::CreateTargetWithFileAndArch (const char *filename, const char *archname)
39530fdc8d8SChris Lattner {
3966611103cSGreg Clayton     SBTarget target;
3976611103cSGreg Clayton     if (m_opaque_sp)
3986611103cSGreg Clayton     {
399*274060b6SGreg Clayton         FileSpec file (filename, true);
400daccaa9eSCaroline Tice         ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
40130fdc8d8SChris Lattner         TargetSP target_sp;
40230fdc8d8SChris Lattner         Error error;
40330fdc8d8SChris Lattner 
40430fdc8d8SChris Lattner         if (archname != NULL)
40530fdc8d8SChris Lattner         {
40630fdc8d8SChris Lattner             ArchSpec arch2 (archname);
4076611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch2, NULL, true, target_sp);
40830fdc8d8SChris Lattner         }
40930fdc8d8SChris Lattner         else
41030fdc8d8SChris Lattner         {
41130fdc8d8SChris Lattner             if (!arch.IsValid())
41230fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT;
41330fdc8d8SChris Lattner 
4146611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
41530fdc8d8SChris Lattner 
41630fdc8d8SChris Lattner             if (error.Fail())
41730fdc8d8SChris Lattner             {
41830fdc8d8SChris Lattner                 if (arch == LLDB_ARCH_DEFAULT_32BIT)
41930fdc8d8SChris Lattner                     arch = LLDB_ARCH_DEFAULT_64BIT;
42030fdc8d8SChris Lattner                 else
42130fdc8d8SChris Lattner                     arch = LLDB_ARCH_DEFAULT_32BIT;
42230fdc8d8SChris Lattner 
4236611103cSGreg Clayton                 error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
42430fdc8d8SChris Lattner             }
42530fdc8d8SChris Lattner         }
42630fdc8d8SChris Lattner 
42730fdc8d8SChris Lattner         if (error.Success())
4286611103cSGreg Clayton         {
4292976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
4306611103cSGreg Clayton             target.reset(target_sp);
4316611103cSGreg Clayton         }
4326611103cSGreg Clayton     }
4336611103cSGreg Clayton     return target;
43430fdc8d8SChris Lattner }
43530fdc8d8SChris Lattner 
43630fdc8d8SChris Lattner SBTarget
43730fdc8d8SChris Lattner SBDebugger::CreateTarget (const char *filename)
43830fdc8d8SChris Lattner {
4396611103cSGreg Clayton     SBTarget target;
4406611103cSGreg Clayton     if (m_opaque_sp)
4416611103cSGreg Clayton     {
442*274060b6SGreg Clayton         FileSpec file (filename, true);
443daccaa9eSCaroline Tice         ArchSpec arch = lldb_private::Target::GetDefaultArchitecture ();
44430fdc8d8SChris Lattner         TargetSP target_sp;
44530fdc8d8SChris Lattner         Error error;
44630fdc8d8SChris Lattner 
44730fdc8d8SChris Lattner         if (!arch.IsValid())
44830fdc8d8SChris Lattner             arch = LLDB_ARCH_DEFAULT;
44930fdc8d8SChris Lattner 
4506611103cSGreg Clayton         error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
45130fdc8d8SChris Lattner 
45230fdc8d8SChris Lattner         if (error.Fail())
45330fdc8d8SChris Lattner         {
45430fdc8d8SChris Lattner             if (arch == LLDB_ARCH_DEFAULT_32BIT)
45530fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT_64BIT;
45630fdc8d8SChris Lattner             else
45730fdc8d8SChris Lattner                 arch = LLDB_ARCH_DEFAULT_32BIT;
45830fdc8d8SChris Lattner 
4596611103cSGreg Clayton             error = m_opaque_sp->GetTargetList().CreateTarget (*m_opaque_sp, file, arch, NULL, true, target_sp);
46030fdc8d8SChris Lattner         }
46130fdc8d8SChris Lattner 
4626611103cSGreg Clayton         if (error.Success())
4636611103cSGreg Clayton         {
4642976d00aSJim Ingham             m_opaque_sp->GetTargetList().SetSelectedTarget (target_sp.get());
4656611103cSGreg Clayton             target.reset (target_sp);
4666611103cSGreg Clayton         }
4676611103cSGreg Clayton     }
4686611103cSGreg Clayton     return target;
46930fdc8d8SChris Lattner }
47030fdc8d8SChris Lattner 
47130fdc8d8SChris Lattner SBTarget
47230fdc8d8SChris Lattner SBDebugger::GetTargetAtIndex (uint32_t idx)
47330fdc8d8SChris Lattner {
4746611103cSGreg Clayton     SBTarget sb_target;
4756611103cSGreg Clayton     if (m_opaque_sp)
4766611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().GetTargetAtIndex (idx));
47730fdc8d8SChris Lattner     return sb_target;
47830fdc8d8SChris Lattner }
47930fdc8d8SChris Lattner 
48030fdc8d8SChris Lattner SBTarget
48130fdc8d8SChris Lattner SBDebugger::FindTargetWithProcessID (pid_t pid)
48230fdc8d8SChris Lattner {
4836611103cSGreg Clayton     SBTarget sb_target;
4846611103cSGreg Clayton     if (m_opaque_sp)
4856611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcessID (pid));
48630fdc8d8SChris Lattner     return sb_target;
48730fdc8d8SChris Lattner }
48830fdc8d8SChris Lattner 
48930fdc8d8SChris Lattner SBTarget
49030fdc8d8SChris Lattner SBDebugger::FindTargetWithFileAndArch (const char *filename, const char *arch_name)
49130fdc8d8SChris Lattner {
4926611103cSGreg Clayton     SBTarget sb_target;
4936611103cSGreg Clayton     if (m_opaque_sp && filename && filename[0])
4946611103cSGreg Clayton     {
49530fdc8d8SChris Lattner         ArchSpec arch;
49630fdc8d8SChris Lattner         if (arch_name)
49730fdc8d8SChris Lattner             arch.SetArch(arch_name);
498*274060b6SGreg Clayton         TargetSP target_sp (m_opaque_sp->GetTargetList().FindTargetWithExecutableAndArchitecture (FileSpec(filename, false), arch_name ? &arch : NULL));
4996611103cSGreg Clayton         sb_target.reset(target_sp);
5006611103cSGreg Clayton     }
5016611103cSGreg Clayton     return sb_target;
50230fdc8d8SChris Lattner }
50330fdc8d8SChris Lattner 
50430fdc8d8SChris Lattner SBTarget
50530fdc8d8SChris Lattner SBDebugger::FindTargetWithLLDBProcess (const lldb::ProcessSP &process_sp)
50630fdc8d8SChris Lattner {
5076611103cSGreg Clayton     SBTarget sb_target;
5086611103cSGreg Clayton     if (m_opaque_sp)
5096611103cSGreg Clayton         sb_target.reset(m_opaque_sp->GetTargetList().FindTargetWithProcess (process_sp.get()));
51030fdc8d8SChris Lattner     return sb_target;
51130fdc8d8SChris Lattner }
51230fdc8d8SChris Lattner 
51330fdc8d8SChris Lattner 
51430fdc8d8SChris Lattner uint32_t
51530fdc8d8SChris Lattner SBDebugger::GetNumTargets ()
51630fdc8d8SChris Lattner {
5176611103cSGreg Clayton     if (m_opaque_sp)
5186611103cSGreg Clayton         return m_opaque_sp->GetTargetList().GetNumTargets ();
5196611103cSGreg Clayton     return 0;
5206611103cSGreg Clayton }
52130fdc8d8SChris Lattner 
52230fdc8d8SChris Lattner SBTarget
5232976d00aSJim Ingham SBDebugger::GetSelectedTarget ()
52430fdc8d8SChris Lattner {
5256611103cSGreg Clayton     SBTarget sb_target;
5266611103cSGreg Clayton     if (m_opaque_sp)
5272976d00aSJim Ingham         sb_target.reset(m_opaque_sp->GetTargetList().GetSelectedTarget ());
52830fdc8d8SChris Lattner     return sb_target;
52930fdc8d8SChris Lattner }
53030fdc8d8SChris Lattner 
53130fdc8d8SChris Lattner void
53230fdc8d8SChris Lattner SBDebugger::DispatchInput (void *baton, const void *data, size_t data_len)
53330fdc8d8SChris Lattner {
5346611103cSGreg Clayton     if (m_opaque_sp)
5356611103cSGreg Clayton         m_opaque_sp->DispatchInput ((const char *) data, data_len);
53630fdc8d8SChris Lattner }
53730fdc8d8SChris Lattner 
53830fdc8d8SChris Lattner void
53930fdc8d8SChris Lattner SBDebugger::PushInputReader (SBInputReader &reader)
54030fdc8d8SChris Lattner {
5416611103cSGreg Clayton     if (m_opaque_sp && reader.IsValid())
54230fdc8d8SChris Lattner     {
54330fdc8d8SChris Lattner         InputReaderSP reader_sp(*reader);
5446611103cSGreg Clayton         m_opaque_sp->PushInputReader (reader_sp);
54530fdc8d8SChris Lattner     }
54630fdc8d8SChris Lattner }
5476611103cSGreg Clayton 
5486611103cSGreg Clayton void
5496611103cSGreg Clayton SBDebugger::reset (const lldb::DebuggerSP &debugger_sp)
5506611103cSGreg Clayton {
5516611103cSGreg Clayton     m_opaque_sp = debugger_sp;
5526611103cSGreg Clayton }
5536611103cSGreg Clayton 
5546611103cSGreg Clayton Debugger *
5556611103cSGreg Clayton SBDebugger::get () const
5566611103cSGreg Clayton {
5576611103cSGreg Clayton     return m_opaque_sp.get();
5586611103cSGreg Clayton }
5596611103cSGreg Clayton 
5606611103cSGreg Clayton Debugger &
5616611103cSGreg Clayton SBDebugger::ref () const
5626611103cSGreg Clayton {
5636611103cSGreg Clayton     assert (m_opaque_sp.get());
5646611103cSGreg Clayton     return *m_opaque_sp;
5656611103cSGreg Clayton }
5666611103cSGreg Clayton 
5676611103cSGreg Clayton 
568ebc1bb27SCaroline Tice SBDebugger
569ebc1bb27SCaroline Tice SBDebugger::FindDebuggerWithID (int id)
570ebc1bb27SCaroline Tice {
571ebc1bb27SCaroline Tice     SBDebugger sb_debugger;
572ebc1bb27SCaroline Tice     lldb::DebuggerSP debugger_sp = Debugger::FindDebuggerWithID (id);
573ebc1bb27SCaroline Tice     if (debugger_sp)
574ebc1bb27SCaroline Tice         sb_debugger.reset (debugger_sp);
575ebc1bb27SCaroline Tice     return sb_debugger;
576ebc1bb27SCaroline Tice }
577e40e4218SJim Ingham 
578dd759857SCaroline Tice const char *
579dd759857SCaroline Tice SBDebugger::GetInstanceName()
580dd759857SCaroline Tice {
581dd759857SCaroline Tice     if (m_opaque_sp)
582dd759857SCaroline Tice         return m_opaque_sp->GetInstanceName().AsCString();
583dd759857SCaroline Tice     else
584dd759857SCaroline Tice         return NULL;
585dd759857SCaroline Tice }
586dd759857SCaroline Tice 
5873df9a8dfSCaroline Tice SBError
588dd759857SCaroline Tice SBDebugger::SetInternalVariable (const char *var_name, const char *value, const char *debugger_instance_name)
5893df9a8dfSCaroline Tice {
5903df9a8dfSCaroline Tice     lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
5913df9a8dfSCaroline Tice 
5921559a46bSCaroline Tice     Error err = root_settings_controller->SetVariable (var_name, value, lldb::eVarSetOperationAssign, true,
593101c7c20SCaroline Tice                                                        debugger_instance_name);
5943df9a8dfSCaroline Tice     SBError sb_error;
5953df9a8dfSCaroline Tice     sb_error.SetError (err);
5963df9a8dfSCaroline Tice 
5973df9a8dfSCaroline Tice     return sb_error;
5983df9a8dfSCaroline Tice }
5993df9a8dfSCaroline Tice 
6003df9a8dfSCaroline Tice lldb::SBStringList
601dd759857SCaroline Tice SBDebugger::GetInternalVariableValue (const char *var_name, const char *debugger_instance_name)
6023df9a8dfSCaroline Tice {
6033df9a8dfSCaroline Tice     SBStringList ret_value;
604101c7c20SCaroline Tice     lldb::SettableVariableType var_type;
605daccaa9eSCaroline Tice     lldb_private:Error err;
606101c7c20SCaroline Tice 
6073df9a8dfSCaroline Tice     lldb::UserSettingsControllerSP root_settings_controller = lldb_private::Debugger::GetSettingsController();
6083df9a8dfSCaroline Tice 
609daccaa9eSCaroline Tice     StringList value = root_settings_controller->GetVariable (var_name, var_type, debugger_instance_name, err);
610daccaa9eSCaroline Tice 
611daccaa9eSCaroline Tice     if (err.Success())
612daccaa9eSCaroline Tice     {
613311adf3dSChris Lattner         for (unsigned i = 0; i != value.GetSize(); ++i)
6143df9a8dfSCaroline Tice             ret_value.AppendString (value.GetStringAtIndex(i));
615daccaa9eSCaroline Tice     }
616daccaa9eSCaroline Tice     else
617daccaa9eSCaroline Tice     {
618daccaa9eSCaroline Tice         ret_value.AppendString (err.AsCString());
619daccaa9eSCaroline Tice     }
620daccaa9eSCaroline Tice 
6213df9a8dfSCaroline Tice 
6223df9a8dfSCaroline Tice     return ret_value;
6233df9a8dfSCaroline Tice }
6243df9a8dfSCaroline Tice 
625a7015092SGreg Clayton uint32_t
626a7015092SGreg Clayton SBDebugger::GetTerminalWidth () const
627a7015092SGreg Clayton {
628a7015092SGreg Clayton     if (m_opaque_sp)
629a7015092SGreg Clayton         return m_opaque_sp->GetTerminalWidth ();
630a7015092SGreg Clayton     return 0;
631a7015092SGreg Clayton }
632a7015092SGreg Clayton 
633a7015092SGreg Clayton void
634a7015092SGreg Clayton SBDebugger::SetTerminalWidth (uint32_t term_width)
635a7015092SGreg Clayton {
636a7015092SGreg Clayton     if (m_opaque_sp)
637a7015092SGreg Clayton         m_opaque_sp->SetTerminalWidth (term_width);
638a7015092SGreg Clayton }
639a7015092SGreg Clayton 
640a7015092SGreg Clayton const char *
641a7015092SGreg Clayton SBDebugger::GetPrompt() const
642a7015092SGreg Clayton {
643a7015092SGreg Clayton     if (m_opaque_sp)
644a7015092SGreg Clayton         return m_opaque_sp->GetPrompt ();
645a7015092SGreg Clayton     return 0;
646a7015092SGreg Clayton }
647a7015092SGreg Clayton 
648a7015092SGreg Clayton void
649a7015092SGreg Clayton SBDebugger::SetPrompt (const char *prompt)
650a7015092SGreg Clayton {
651a7015092SGreg Clayton     if (m_opaque_sp)
652a7015092SGreg Clayton         m_opaque_sp->SetPrompt (prompt);
653a7015092SGreg Clayton }
654a7015092SGreg Clayton 
655a7015092SGreg Clayton 
656a7015092SGreg Clayton lldb::ScriptLanguage
657a7015092SGreg Clayton SBDebugger::GetScriptLanguage() const
658a7015092SGreg Clayton {
659a7015092SGreg Clayton     if (m_opaque_sp)
660a7015092SGreg Clayton         return m_opaque_sp->GetScriptLanguage ();
661a7015092SGreg Clayton     return eScriptLanguageNone;
662a7015092SGreg Clayton }
663a7015092SGreg Clayton 
664a7015092SGreg Clayton void
665a7015092SGreg Clayton SBDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang)
666a7015092SGreg Clayton {
667a7015092SGreg Clayton     if (m_opaque_sp)
668a7015092SGreg Clayton         m_opaque_sp->SetScriptLanguage (script_lang);
669a7015092SGreg Clayton }
670a7015092SGreg Clayton 
671a7015092SGreg Clayton 
672a7015092SGreg Clayton 
673a7015092SGreg Clayton 
674e40e4218SJim Ingham bool
675e40e4218SJim Ingham SBDebugger::SetUseExternalEditor (bool value)
676e40e4218SJim Ingham {
677e40e4218SJim Ingham     if (m_opaque_sp)
678e40e4218SJim Ingham         return m_opaque_sp->SetUseExternalEditor (value);
679e40e4218SJim Ingham     else
680e40e4218SJim Ingham         return false;
681e40e4218SJim Ingham }
682e40e4218SJim Ingham 
683e40e4218SJim Ingham bool
684daccaa9eSCaroline Tice SBDebugger::GetUseExternalEditor ()
685e40e4218SJim Ingham {
686e40e4218SJim Ingham     if (m_opaque_sp)
687daccaa9eSCaroline Tice         return m_opaque_sp->GetUseExternalEditor ();
688e40e4218SJim Ingham     else
689e40e4218SJim Ingham         return false;
690e40e4218SJim Ingham }
691e40e4218SJim Ingham 
692dde9cff3SCaroline Tice bool
693dde9cff3SCaroline Tice SBDebugger::GetDescription (SBStream &description)
694dde9cff3SCaroline Tice {
695dde9cff3SCaroline Tice     if (m_opaque_sp)
696dde9cff3SCaroline Tice     {
697dde9cff3SCaroline Tice         const char *name = m_opaque_sp->GetInstanceName().AsCString();
698dde9cff3SCaroline Tice         lldb::user_id_t id = m_opaque_sp->GetID();
699dde9cff3SCaroline Tice         description.Printf ("Debugger (instance: '%s', id: %d)", name, id);
700dde9cff3SCaroline Tice     }
701dde9cff3SCaroline Tice     else
702dde9cff3SCaroline Tice         description.Printf ("No value");
703dde9cff3SCaroline Tice 
704dde9cff3SCaroline Tice     return true;
705dde9cff3SCaroline Tice }
706