130fdc8d8SChris Lattner //===-- Debugger.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 104a33d318SGreg Clayton #include "lldb/Core/Debugger.h" 114a33d318SGreg Clayton 124a33d318SGreg Clayton #include <map> 134a33d318SGreg Clayton 144becb37eSEnrico Granata #include "clang/AST/DeclCXX.h" 154becb37eSEnrico Granata #include "clang/AST/Type.h" 164becb37eSEnrico Granata 1730fdc8d8SChris Lattner #include "lldb/lldb-private.h" 1830fdc8d8SChris Lattner #include "lldb/Core/ConnectionFileDescriptor.h" 194a33d318SGreg Clayton #include "lldb/Core/FormatManager.h" 2030fdc8d8SChris Lattner #include "lldb/Core/InputReader.h" 217349bd90SGreg Clayton #include "lldb/Core/RegisterValue.h" 2230fdc8d8SChris Lattner #include "lldb/Core/State.h" 235b52f0c7SJim Ingham #include "lldb/Core/StreamAsynchronousIO.h" 241b654882SGreg Clayton #include "lldb/Core/StreamString.h" 2530fdc8d8SChris Lattner #include "lldb/Core/Timer.h" 264becb37eSEnrico Granata #include "lldb/Core/ValueObject.h" 276d3dbf51SGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 28a3406614SGreg Clayton #include "lldb/Host/Terminal.h" 296611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 306d3dbf51SGreg Clayton #include "lldb/Symbol/VariableList.h" 3130fdc8d8SChris Lattner #include "lldb/Target/TargetList.h" 3230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 331b654882SGreg Clayton #include "lldb/Target/RegisterContext.h" 341b654882SGreg Clayton #include "lldb/Target/StopInfo.h" 3530fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 365a31471eSGreg Clayton #include "lldb/Utility/AnsiTerminal.h" 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner using namespace lldb; 3930fdc8d8SChris Lattner using namespace lldb_private; 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner 421b654882SGreg Clayton static uint32_t g_shared_debugger_refcount = 0; 43ebc1bb27SCaroline Tice static lldb::user_id_t g_unique_id = 1; 44ebc1bb27SCaroline Tice 451b654882SGreg Clayton #pragma mark Static Functions 461b654882SGreg Clayton 471b654882SGreg Clayton static Mutex & 481b654882SGreg Clayton GetDebuggerListMutex () 491b654882SGreg Clayton { 501b654882SGreg Clayton static Mutex g_mutex(Mutex::eMutexTypeRecursive); 511b654882SGreg Clayton return g_mutex; 521b654882SGreg Clayton } 531b654882SGreg Clayton 541b654882SGreg Clayton typedef std::vector<DebuggerSP> DebuggerList; 551b654882SGreg Clayton 561b654882SGreg Clayton static DebuggerList & 571b654882SGreg Clayton GetDebuggerList() 581b654882SGreg Clayton { 591b654882SGreg Clayton // hide the static debugger list inside a singleton accessor to avoid 601b654882SGreg Clayton // global init contructors 611b654882SGreg Clayton static DebuggerList g_list; 621b654882SGreg Clayton return g_list; 631b654882SGreg Clayton } 641b654882SGreg Clayton 651b654882SGreg Clayton 66e372b98dSGreg Clayton static const ConstString & 67e372b98dSGreg Clayton PromptVarName () 68e372b98dSGreg Clayton { 69e372b98dSGreg Clayton static ConstString g_const_string ("prompt"); 70e372b98dSGreg Clayton return g_const_string; 71e372b98dSGreg Clayton } 72e372b98dSGreg Clayton 73e372b98dSGreg Clayton static const ConstString & 74e372b98dSGreg Clayton GetFrameFormatName () 75e372b98dSGreg Clayton { 76e372b98dSGreg Clayton static ConstString g_const_string ("frame-format"); 77e372b98dSGreg Clayton return g_const_string; 78e372b98dSGreg Clayton } 79e372b98dSGreg Clayton 80e372b98dSGreg Clayton static const ConstString & 81e372b98dSGreg Clayton GetThreadFormatName () 82e372b98dSGreg Clayton { 83e372b98dSGreg Clayton static ConstString g_const_string ("thread-format"); 84e372b98dSGreg Clayton return g_const_string; 85e372b98dSGreg Clayton } 86e372b98dSGreg Clayton 87e372b98dSGreg Clayton static const ConstString & 88e372b98dSGreg Clayton ScriptLangVarName () 89e372b98dSGreg Clayton { 90e372b98dSGreg Clayton static ConstString g_const_string ("script-lang"); 91e372b98dSGreg Clayton return g_const_string; 92e372b98dSGreg Clayton } 93e372b98dSGreg Clayton 94e372b98dSGreg Clayton static const ConstString & 95e372b98dSGreg Clayton TermWidthVarName () 96e372b98dSGreg Clayton { 97e372b98dSGreg Clayton static ConstString g_const_string ("term-width"); 98e372b98dSGreg Clayton return g_const_string; 99e372b98dSGreg Clayton } 100e372b98dSGreg Clayton 101e372b98dSGreg Clayton static const ConstString & 102e372b98dSGreg Clayton UseExternalEditorVarName () 103e372b98dSGreg Clayton { 104e372b98dSGreg Clayton static ConstString g_const_string ("use-external-editor"); 105e372b98dSGreg Clayton return g_const_string; 106e372b98dSGreg Clayton } 107e372b98dSGreg Clayton 108e372b98dSGreg Clayton static const ConstString & 109e372b98dSGreg Clayton AutoConfirmName () 110e372b98dSGreg Clayton { 111e372b98dSGreg Clayton static ConstString g_const_string ("auto-confirm"); 112e372b98dSGreg Clayton return g_const_string; 113e372b98dSGreg Clayton } 114e372b98dSGreg Clayton 115e372b98dSGreg Clayton static const ConstString & 116e372b98dSGreg Clayton StopSourceContextBeforeName () 117e372b98dSGreg Clayton { 118e372b98dSGreg Clayton static ConstString g_const_string ("stop-line-count-before"); 119e372b98dSGreg Clayton return g_const_string; 120e372b98dSGreg Clayton } 121e372b98dSGreg Clayton 122e372b98dSGreg Clayton static const ConstString & 123e372b98dSGreg Clayton StopSourceContextAfterName () 124e372b98dSGreg Clayton { 125e372b98dSGreg Clayton static ConstString g_const_string ("stop-line-count-after"); 126e372b98dSGreg Clayton return g_const_string; 127e372b98dSGreg Clayton } 128e372b98dSGreg Clayton 129e372b98dSGreg Clayton static const ConstString & 130e372b98dSGreg Clayton StopDisassemblyCountName () 131e372b98dSGreg Clayton { 132e372b98dSGreg Clayton static ConstString g_const_string ("stop-disassembly-count"); 133e372b98dSGreg Clayton return g_const_string; 134e372b98dSGreg Clayton } 135e372b98dSGreg Clayton 136e372b98dSGreg Clayton static const ConstString & 137e372b98dSGreg Clayton StopDisassemblyDisplayName () 138e372b98dSGreg Clayton { 139e372b98dSGreg Clayton static ConstString g_const_string ("stop-disassembly-display"); 140e372b98dSGreg Clayton return g_const_string; 141e372b98dSGreg Clayton } 142e372b98dSGreg Clayton 143e372b98dSGreg Clayton OptionEnumValueElement 144e372b98dSGreg Clayton DebuggerInstanceSettings::g_show_disassembly_enum_values[] = 145e372b98dSGreg Clayton { 146e372b98dSGreg Clayton { eStopDisassemblyTypeNever, "never", "Never show disassembly when displaying a stop context."}, 147e372b98dSGreg Clayton { eStopDisassemblyTypeNoSource, "no-source", "Show disassembly when there is no source information, or the source file is missing when displaying a stop context."}, 148e372b98dSGreg Clayton { eStopDisassemblyTypeAlways, "always", "Always show disassembly when displaying a stop context."}, 149e372b98dSGreg Clayton { 0, NULL, NULL } 150e372b98dSGreg Clayton }; 151e372b98dSGreg Clayton 152e372b98dSGreg Clayton 153e372b98dSGreg Clayton 1541b654882SGreg Clayton #pragma mark Debugger 1551b654882SGreg Clayton 15699d0faf2SGreg Clayton UserSettingsControllerSP & 15799d0faf2SGreg Clayton Debugger::GetSettingsController () 15899d0faf2SGreg Clayton { 159b9556accSGreg Clayton static UserSettingsControllerSP g_settings_controller_sp; 160b9556accSGreg Clayton if (!g_settings_controller_sp) 161b9556accSGreg Clayton { 162b9556accSGreg Clayton g_settings_controller_sp.reset (new Debugger::SettingsController); 163b9556accSGreg Clayton 164b9556accSGreg Clayton // The first shared pointer to Debugger::SettingsController in 165b9556accSGreg Clayton // g_settings_controller_sp must be fully created above so that 166b9556accSGreg Clayton // the DebuggerInstanceSettings can use a weak_ptr to refer back 167b9556accSGreg Clayton // to the master setttings controller 168b9556accSGreg Clayton InstanceSettingsSP default_instance_settings_sp (new DebuggerInstanceSettings (g_settings_controller_sp, 169b9556accSGreg Clayton false, 170b9556accSGreg Clayton InstanceSettings::GetDefaultName().AsCString())); 171b9556accSGreg Clayton g_settings_controller_sp->SetDefaultInstanceSettings (default_instance_settings_sp); 172b9556accSGreg Clayton } 173b9556accSGreg Clayton return g_settings_controller_sp; 17499d0faf2SGreg Clayton } 17599d0faf2SGreg Clayton 1762f88aadfSCaroline Tice int 1772f88aadfSCaroline Tice Debugger::TestDebuggerRefCount () 1782f88aadfSCaroline Tice { 1792f88aadfSCaroline Tice return g_shared_debugger_refcount; 1802f88aadfSCaroline Tice } 1812f88aadfSCaroline Tice 18230fdc8d8SChris Lattner void 18330fdc8d8SChris Lattner Debugger::Initialize () 18430fdc8d8SChris Lattner { 1856611103cSGreg Clayton if (g_shared_debugger_refcount == 0) 18699d0faf2SGreg Clayton { 187dbe54508SGreg Clayton lldb_private::Initialize(); 18899d0faf2SGreg Clayton } 1896611103cSGreg Clayton g_shared_debugger_refcount++; 19099d0faf2SGreg Clayton 19130fdc8d8SChris Lattner } 19230fdc8d8SChris Lattner 19330fdc8d8SChris Lattner void 19430fdc8d8SChris Lattner Debugger::Terminate () 19530fdc8d8SChris Lattner { 1966611103cSGreg Clayton if (g_shared_debugger_refcount > 0) 1976611103cSGreg Clayton { 19830fdc8d8SChris Lattner g_shared_debugger_refcount--; 19930fdc8d8SChris Lattner if (g_shared_debugger_refcount == 0) 20030fdc8d8SChris Lattner { 201dbe54508SGreg Clayton lldb_private::WillTerminate(); 202dbe54508SGreg Clayton lldb_private::Terminate(); 2036760a517SCaroline Tice 20499d0faf2SGreg Clayton // Clear our master list of debugger objects 20599d0faf2SGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 20699d0faf2SGreg Clayton GetDebuggerList().clear(); 20730fdc8d8SChris Lattner } 2086760a517SCaroline Tice } 2096760a517SCaroline Tice } 21030fdc8d8SChris Lattner 21120bd37f7SCaroline Tice void 21220bd37f7SCaroline Tice Debugger::SettingsInitialize () 21320bd37f7SCaroline Tice { 21420bd37f7SCaroline Tice static bool g_initialized = false; 21520bd37f7SCaroline Tice 21620bd37f7SCaroline Tice if (!g_initialized) 21720bd37f7SCaroline Tice { 21820bd37f7SCaroline Tice g_initialized = true; 219b9556accSGreg Clayton UserSettingsController::InitializeSettingsController (GetSettingsController(), 22020bd37f7SCaroline Tice SettingsController::global_settings_table, 22120bd37f7SCaroline Tice SettingsController::instance_settings_table); 22220bd37f7SCaroline Tice // Now call SettingsInitialize for each settings 'child' of Debugger 22320bd37f7SCaroline Tice Target::SettingsInitialize (); 22420bd37f7SCaroline Tice } 22520bd37f7SCaroline Tice } 22620bd37f7SCaroline Tice 22720bd37f7SCaroline Tice void 22820bd37f7SCaroline Tice Debugger::SettingsTerminate () 22920bd37f7SCaroline Tice { 23020bd37f7SCaroline Tice 23120bd37f7SCaroline Tice // Must call SettingsTerminate() for each settings 'child' of Debugger, before terminating the Debugger's 23220bd37f7SCaroline Tice // Settings. 23320bd37f7SCaroline Tice 23420bd37f7SCaroline Tice Target::SettingsTerminate (); 23520bd37f7SCaroline Tice 23620bd37f7SCaroline Tice // Now terminate the Debugger Settings. 23720bd37f7SCaroline Tice 23820bd37f7SCaroline Tice UserSettingsControllerSP &usc = GetSettingsController(); 23920bd37f7SCaroline Tice UserSettingsController::FinalizeSettingsController (usc); 24020bd37f7SCaroline Tice usc.reset(); 24120bd37f7SCaroline Tice } 24220bd37f7SCaroline Tice 2436611103cSGreg Clayton DebuggerSP 2446611103cSGreg Clayton Debugger::CreateInstance () 2456611103cSGreg Clayton { 2466611103cSGreg Clayton DebuggerSP debugger_sp (new Debugger); 2476611103cSGreg Clayton // Scope for locker 2486611103cSGreg Clayton { 2496611103cSGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 2506611103cSGreg Clayton GetDebuggerList().push_back(debugger_sp); 2516611103cSGreg Clayton } 2526611103cSGreg Clayton return debugger_sp; 2536611103cSGreg Clayton } 2546611103cSGreg Clayton 255e02657b1SCaroline Tice void 2564d122c40SGreg Clayton Debugger::Destroy (DebuggerSP &debugger_sp) 257e02657b1SCaroline Tice { 258e02657b1SCaroline Tice if (debugger_sp.get() == NULL) 259e02657b1SCaroline Tice return; 260e02657b1SCaroline Tice 2618314c525SJim Ingham debugger_sp->Clear(); 2628314c525SJim Ingham 263e02657b1SCaroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 264e02657b1SCaroline Tice DebuggerList &debugger_list = GetDebuggerList (); 265e02657b1SCaroline Tice DebuggerList::iterator pos, end = debugger_list.end(); 266e02657b1SCaroline Tice for (pos = debugger_list.begin (); pos != end; ++pos) 267e02657b1SCaroline Tice { 268e02657b1SCaroline Tice if ((*pos).get() == debugger_sp.get()) 269e02657b1SCaroline Tice { 270e02657b1SCaroline Tice debugger_list.erase (pos); 271e02657b1SCaroline Tice return; 272e02657b1SCaroline Tice } 273e02657b1SCaroline Tice } 274e02657b1SCaroline Tice } 275e02657b1SCaroline Tice 2764d122c40SGreg Clayton DebuggerSP 2773df9a8dfSCaroline Tice Debugger::FindDebuggerWithInstanceName (const ConstString &instance_name) 2783df9a8dfSCaroline Tice { 2794d122c40SGreg Clayton DebuggerSP debugger_sp; 2803df9a8dfSCaroline Tice 2813df9a8dfSCaroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 2823df9a8dfSCaroline Tice DebuggerList &debugger_list = GetDebuggerList(); 2833df9a8dfSCaroline Tice DebuggerList::iterator pos, end = debugger_list.end(); 2843df9a8dfSCaroline Tice 2853df9a8dfSCaroline Tice for (pos = debugger_list.begin(); pos != end; ++pos) 2863df9a8dfSCaroline Tice { 2873df9a8dfSCaroline Tice if ((*pos).get()->m_instance_name == instance_name) 2883df9a8dfSCaroline Tice { 2893df9a8dfSCaroline Tice debugger_sp = *pos; 2903df9a8dfSCaroline Tice break; 2913df9a8dfSCaroline Tice } 2923df9a8dfSCaroline Tice } 2933df9a8dfSCaroline Tice return debugger_sp; 2943df9a8dfSCaroline Tice } 2956611103cSGreg Clayton 2966611103cSGreg Clayton TargetSP 2976611103cSGreg Clayton Debugger::FindTargetWithProcessID (lldb::pid_t pid) 2986611103cSGreg Clayton { 2994d122c40SGreg Clayton TargetSP target_sp; 3006611103cSGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 3016611103cSGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 3026611103cSGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 3036611103cSGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 3046611103cSGreg Clayton { 3056611103cSGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid); 3066611103cSGreg Clayton if (target_sp) 3076611103cSGreg Clayton break; 3086611103cSGreg Clayton } 3096611103cSGreg Clayton return target_sp; 3106611103cSGreg Clayton } 3116611103cSGreg Clayton 312e4e45924SGreg Clayton TargetSP 313e4e45924SGreg Clayton Debugger::FindTargetWithProcess (Process *process) 314e4e45924SGreg Clayton { 315e4e45924SGreg Clayton TargetSP target_sp; 316e4e45924SGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 317e4e45924SGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 318e4e45924SGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 319e4e45924SGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 320e4e45924SGreg Clayton { 321e4e45924SGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcess (process); 322e4e45924SGreg Clayton if (target_sp) 323e4e45924SGreg Clayton break; 324e4e45924SGreg Clayton } 325e4e45924SGreg Clayton return target_sp; 326e4e45924SGreg Clayton } 327e4e45924SGreg Clayton 3286611103cSGreg Clayton 32930fdc8d8SChris Lattner Debugger::Debugger () : 330ebc1bb27SCaroline Tice UserID (g_unique_id++), 331b9556accSGreg Clayton DebuggerInstanceSettings (GetSettingsController()), 332d46c87a1SGreg Clayton m_input_comm("debugger.input"), 33330fdc8d8SChris Lattner m_input_file (), 33430fdc8d8SChris Lattner m_output_file (), 33530fdc8d8SChris Lattner m_error_file (), 3364bddaeb5SJim Ingham m_target_list (*this), 337ded470d3SGreg Clayton m_platform_list (), 33830fdc8d8SChris Lattner m_listener ("lldb.Debugger"), 339e37d605eSJim Ingham m_source_manager(*this), 340e37d605eSJim Ingham m_source_file_cache(), 3416611103cSGreg Clayton m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)), 342d5a0a01bSCaroline Tice m_input_reader_stack (), 3434957bf69SGreg Clayton m_input_reader_data () 34430fdc8d8SChris Lattner { 3456611103cSGreg Clayton m_command_interpreter_ap->Initialize (); 346ded470d3SGreg Clayton // Always add our default platform to the platform list 347ded470d3SGreg Clayton PlatformSP default_platform_sp (Platform::GetDefaultPlatform()); 348ded470d3SGreg Clayton assert (default_platform_sp.get()); 349ded470d3SGreg Clayton m_platform_list.Append (default_platform_sp, true); 35030fdc8d8SChris Lattner } 35130fdc8d8SChris Lattner 35230fdc8d8SChris Lattner Debugger::~Debugger () 35330fdc8d8SChris Lattner { 3548314c525SJim Ingham Clear(); 3558314c525SJim Ingham } 3568314c525SJim Ingham 3578314c525SJim Ingham void 3588314c525SJim Ingham Debugger::Clear() 3598314c525SJim Ingham { 3603d6086f6SCaroline Tice CleanUpInputReaders(); 3611ed54f50SGreg Clayton m_listener.Clear(); 3626611103cSGreg Clayton int num_targets = m_target_list.GetNumTargets(); 3636611103cSGreg Clayton for (int i = 0; i < num_targets; i++) 3646611103cSGreg Clayton { 365ccbc08e6SGreg Clayton TargetSP target_sp (m_target_list.GetTargetAtIndex (i)); 366ccbc08e6SGreg Clayton if (target_sp) 367ccbc08e6SGreg Clayton { 368ccbc08e6SGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 3696611103cSGreg Clayton if (process_sp) 3708314c525SJim Ingham { 371e24c4acfSGreg Clayton if (process_sp->GetShouldDetach()) 3728314c525SJim Ingham process_sp->Detach(); 373ccbc08e6SGreg Clayton } 374ccbc08e6SGreg Clayton target_sp->Destroy(); 3756611103cSGreg Clayton } 37630fdc8d8SChris Lattner } 3774bddaeb5SJim Ingham BroadcasterManager::Clear (); 3788314c525SJim Ingham DisconnectInput(); 37930fdc8d8SChris Lattner 3808314c525SJim Ingham } 38130fdc8d8SChris Lattner 38230fdc8d8SChris Lattner bool 383fc3f027dSGreg Clayton Debugger::GetCloseInputOnEOF () const 384fc3f027dSGreg Clayton { 385fc3f027dSGreg Clayton return m_input_comm.GetCloseOnEOF(); 386fc3f027dSGreg Clayton } 387fc3f027dSGreg Clayton 388fc3f027dSGreg Clayton void 389fc3f027dSGreg Clayton Debugger::SetCloseInputOnEOF (bool b) 390fc3f027dSGreg Clayton { 391fc3f027dSGreg Clayton m_input_comm.SetCloseOnEOF(b); 392fc3f027dSGreg Clayton } 393fc3f027dSGreg Clayton 394fc3f027dSGreg Clayton bool 39530fdc8d8SChris Lattner Debugger::GetAsyncExecution () 39630fdc8d8SChris Lattner { 3976611103cSGreg Clayton return !m_command_interpreter_ap->GetSynchronous(); 39830fdc8d8SChris Lattner } 39930fdc8d8SChris Lattner 40030fdc8d8SChris Lattner void 40130fdc8d8SChris Lattner Debugger::SetAsyncExecution (bool async_execution) 40230fdc8d8SChris Lattner { 4036611103cSGreg Clayton m_command_interpreter_ap->SetSynchronous (!async_execution); 40430fdc8d8SChris Lattner } 40530fdc8d8SChris Lattner 40630fdc8d8SChris Lattner 40730fdc8d8SChris Lattner void 40830fdc8d8SChris Lattner Debugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership) 40930fdc8d8SChris Lattner { 41051b1e2d2SGreg Clayton File &in_file = GetInputFile(); 41151b1e2d2SGreg Clayton in_file.SetStream (fh, tranfer_ownership); 41251b1e2d2SGreg Clayton if (in_file.IsValid() == false) 41351b1e2d2SGreg Clayton in_file.SetStream (stdin, true); 41430fdc8d8SChris Lattner 41530fdc8d8SChris Lattner // Disconnect from any old connection if we had one 41630fdc8d8SChris Lattner m_input_comm.Disconnect (); 41732720b51SGreg Clayton // Pass false as the second argument to ConnectionFileDescriptor below because 41832720b51SGreg Clayton // our "in_file" above will already take ownership if requested and we don't 41932720b51SGreg Clayton // want to objects trying to own and close a file descriptor. 42032720b51SGreg Clayton m_input_comm.SetConnection (new ConnectionFileDescriptor (in_file.GetDescriptor(), false)); 42130fdc8d8SChris Lattner m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this); 42230fdc8d8SChris Lattner 42330fdc8d8SChris Lattner Error error; 42430fdc8d8SChris Lattner if (m_input_comm.StartReadThread (&error) == false) 42530fdc8d8SChris Lattner { 42651b1e2d2SGreg Clayton File &err_file = GetErrorFile(); 42751b1e2d2SGreg Clayton 42851b1e2d2SGreg Clayton err_file.Printf ("error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error"); 42930fdc8d8SChris Lattner exit(1); 43030fdc8d8SChris Lattner } 43130fdc8d8SChris Lattner } 43230fdc8d8SChris Lattner 43330fdc8d8SChris Lattner void 43430fdc8d8SChris Lattner Debugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership) 43530fdc8d8SChris Lattner { 43651b1e2d2SGreg Clayton File &out_file = GetOutputFile(); 43751b1e2d2SGreg Clayton out_file.SetStream (fh, tranfer_ownership); 43851b1e2d2SGreg Clayton if (out_file.IsValid() == false) 43951b1e2d2SGreg Clayton out_file.SetStream (stdout, false); 4402f88aadfSCaroline Tice 4412f88aadfSCaroline Tice GetCommandInterpreter().GetScriptInterpreter()->ResetOutputFileHandle (fh); 44230fdc8d8SChris Lattner } 44330fdc8d8SChris Lattner 44430fdc8d8SChris Lattner void 44530fdc8d8SChris Lattner Debugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership) 44630fdc8d8SChris Lattner { 44751b1e2d2SGreg Clayton File &err_file = GetErrorFile(); 44851b1e2d2SGreg Clayton err_file.SetStream (fh, tranfer_ownership); 44951b1e2d2SGreg Clayton if (err_file.IsValid() == false) 45051b1e2d2SGreg Clayton err_file.SetStream (stderr, false); 45130fdc8d8SChris Lattner } 45230fdc8d8SChris Lattner 45330fdc8d8SChris Lattner ExecutionContext 4542976d00aSJim Ingham Debugger::GetSelectedExecutionContext () 45530fdc8d8SChris Lattner { 45630fdc8d8SChris Lattner ExecutionContext exe_ctx; 457c14ee32dSGreg Clayton TargetSP target_sp(GetSelectedTarget()); 458c14ee32dSGreg Clayton exe_ctx.SetTargetSP (target_sp); 45930fdc8d8SChris Lattner 46030fdc8d8SChris Lattner if (target_sp) 46130fdc8d8SChris Lattner { 462c14ee32dSGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 463c14ee32dSGreg Clayton exe_ctx.SetProcessSP (process_sp); 464c14ee32dSGreg Clayton if (process_sp && process_sp->IsRunning() == false) 46530fdc8d8SChris Lattner { 466c14ee32dSGreg Clayton ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread()); 467c14ee32dSGreg Clayton if (thread_sp) 46830fdc8d8SChris Lattner { 469c14ee32dSGreg Clayton exe_ctx.SetThreadSP (thread_sp); 470c14ee32dSGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetSelectedFrame()); 471c14ee32dSGreg Clayton if (exe_ctx.GetFramePtr() == NULL) 472c14ee32dSGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetStackFrameAtIndex (0)); 47330fdc8d8SChris Lattner } 47430fdc8d8SChris Lattner } 47530fdc8d8SChris Lattner } 47630fdc8d8SChris Lattner return exe_ctx; 47730fdc8d8SChris Lattner 47830fdc8d8SChris Lattner } 47930fdc8d8SChris Lattner 480b44880caSCaroline Tice InputReaderSP 481b44880caSCaroline Tice Debugger::GetCurrentInputReader () 482b44880caSCaroline Tice { 483b44880caSCaroline Tice InputReaderSP reader_sp; 484b44880caSCaroline Tice 485d5a0a01bSCaroline Tice if (!m_input_reader_stack.IsEmpty()) 486b44880caSCaroline Tice { 487b44880caSCaroline Tice // Clear any finished readers from the stack 488b44880caSCaroline Tice while (CheckIfTopInputReaderIsDone()) ; 489b44880caSCaroline Tice 490d5a0a01bSCaroline Tice if (!m_input_reader_stack.IsEmpty()) 491d5a0a01bSCaroline Tice reader_sp = m_input_reader_stack.Top(); 492b44880caSCaroline Tice } 493b44880caSCaroline Tice 494b44880caSCaroline Tice return reader_sp; 495b44880caSCaroline Tice } 496b44880caSCaroline Tice 49730fdc8d8SChris Lattner void 49830fdc8d8SChris Lattner Debugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len) 49930fdc8d8SChris Lattner { 500efed6131SCaroline Tice if (bytes_len > 0) 50130fdc8d8SChris Lattner ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len); 502efed6131SCaroline Tice else 503efed6131SCaroline Tice ((Debugger *)baton)->DispatchInputEndOfFile (); 50430fdc8d8SChris Lattner } 50530fdc8d8SChris Lattner 50630fdc8d8SChris Lattner 50730fdc8d8SChris Lattner void 50830fdc8d8SChris Lattner Debugger::DispatchInput (const char *bytes, size_t bytes_len) 50930fdc8d8SChris Lattner { 510efed6131SCaroline Tice if (bytes == NULL || bytes_len == 0) 511efed6131SCaroline Tice return; 51230fdc8d8SChris Lattner 51330fdc8d8SChris Lattner WriteToDefaultReader (bytes, bytes_len); 51430fdc8d8SChris Lattner } 51530fdc8d8SChris Lattner 51630fdc8d8SChris Lattner void 517efed6131SCaroline Tice Debugger::DispatchInputInterrupt () 518efed6131SCaroline Tice { 519efed6131SCaroline Tice m_input_reader_data.clear(); 520efed6131SCaroline Tice 521b44880caSCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 522efed6131SCaroline Tice if (reader_sp) 523b44880caSCaroline Tice { 524efed6131SCaroline Tice reader_sp->Notify (eInputReaderInterrupt); 525efed6131SCaroline Tice 526b44880caSCaroline Tice // If notifying the reader of the interrupt finished the reader, we should pop it off the stack. 527efed6131SCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 528efed6131SCaroline Tice } 529efed6131SCaroline Tice } 530efed6131SCaroline Tice 531efed6131SCaroline Tice void 532efed6131SCaroline Tice Debugger::DispatchInputEndOfFile () 533efed6131SCaroline Tice { 534efed6131SCaroline Tice m_input_reader_data.clear(); 535efed6131SCaroline Tice 536b44880caSCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 537efed6131SCaroline Tice if (reader_sp) 538b44880caSCaroline Tice { 539efed6131SCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 540efed6131SCaroline Tice 541b44880caSCaroline Tice // If notifying the reader of the end-of-file finished the reader, we should pop it off the stack. 542efed6131SCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 543efed6131SCaroline Tice } 544efed6131SCaroline Tice } 545efed6131SCaroline Tice 546efed6131SCaroline Tice void 5473d6086f6SCaroline Tice Debugger::CleanUpInputReaders () 5483d6086f6SCaroline Tice { 5493d6086f6SCaroline Tice m_input_reader_data.clear(); 5503d6086f6SCaroline Tice 551b44880caSCaroline Tice // The bottom input reader should be the main debugger input reader. We do not want to close that one here. 552d5a0a01bSCaroline Tice while (m_input_reader_stack.GetSize() > 1) 5533d6086f6SCaroline Tice { 554b44880caSCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 5553d6086f6SCaroline Tice if (reader_sp) 5563d6086f6SCaroline Tice { 5573d6086f6SCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 5583d6086f6SCaroline Tice reader_sp->SetIsDone (true); 5593d6086f6SCaroline Tice } 5603d6086f6SCaroline Tice } 5613d6086f6SCaroline Tice } 5623d6086f6SCaroline Tice 5633d6086f6SCaroline Tice void 564969ed3d1SCaroline Tice Debugger::NotifyTopInputReader (InputReaderAction notification) 565969ed3d1SCaroline Tice { 566969ed3d1SCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader()); 567969ed3d1SCaroline Tice if (reader_sp) 568969ed3d1SCaroline Tice { 569969ed3d1SCaroline Tice reader_sp->Notify (notification); 570969ed3d1SCaroline Tice 571969ed3d1SCaroline Tice // Flush out any input readers that are done. 572969ed3d1SCaroline Tice while (CheckIfTopInputReaderIsDone ()) 573969ed3d1SCaroline Tice /* Do nothing. */; 574969ed3d1SCaroline Tice } 575969ed3d1SCaroline Tice } 576969ed3d1SCaroline Tice 5779088b068SCaroline Tice bool 5784d122c40SGreg Clayton Debugger::InputReaderIsTopReader (const InputReaderSP& reader_sp) 5799088b068SCaroline Tice { 5809088b068SCaroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader()); 5819088b068SCaroline Tice 582d61c10bcSCaroline Tice return (reader_sp.get() == top_reader_sp.get()); 5839088b068SCaroline Tice } 5849088b068SCaroline Tice 5859088b068SCaroline Tice 586969ed3d1SCaroline Tice void 58730fdc8d8SChris Lattner Debugger::WriteToDefaultReader (const char *bytes, size_t bytes_len) 58830fdc8d8SChris Lattner { 58930fdc8d8SChris Lattner if (bytes && bytes_len) 59030fdc8d8SChris Lattner m_input_reader_data.append (bytes, bytes_len); 59130fdc8d8SChris Lattner 59230fdc8d8SChris Lattner if (m_input_reader_data.empty()) 59330fdc8d8SChris Lattner return; 59430fdc8d8SChris Lattner 595d5a0a01bSCaroline Tice while (!m_input_reader_stack.IsEmpty() && !m_input_reader_data.empty()) 59630fdc8d8SChris Lattner { 59730fdc8d8SChris Lattner // Get the input reader from the top of the stack 598b44880caSCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 59930fdc8d8SChris Lattner if (!reader_sp) 60030fdc8d8SChris Lattner break; 60130fdc8d8SChris Lattner 602471b31ceSGreg Clayton size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(), 60330fdc8d8SChris Lattner m_input_reader_data.size()); 60430fdc8d8SChris Lattner if (bytes_handled) 60530fdc8d8SChris Lattner { 60630fdc8d8SChris Lattner m_input_reader_data.erase (0, bytes_handled); 60730fdc8d8SChris Lattner } 60830fdc8d8SChris Lattner else 60930fdc8d8SChris Lattner { 61030fdc8d8SChris Lattner // No bytes were handled, we might not have reached our 61130fdc8d8SChris Lattner // granularity, just return and wait for more data 61230fdc8d8SChris Lattner break; 61330fdc8d8SChris Lattner } 61430fdc8d8SChris Lattner } 61530fdc8d8SChris Lattner 616b44880caSCaroline Tice // Flush out any input readers that are done. 61730fdc8d8SChris Lattner while (CheckIfTopInputReaderIsDone ()) 61830fdc8d8SChris Lattner /* Do nothing. */; 61930fdc8d8SChris Lattner 62030fdc8d8SChris Lattner } 62130fdc8d8SChris Lattner 62230fdc8d8SChris Lattner void 62330fdc8d8SChris Lattner Debugger::PushInputReader (const InputReaderSP& reader_sp) 62430fdc8d8SChris Lattner { 62530fdc8d8SChris Lattner if (!reader_sp) 62630fdc8d8SChris Lattner return; 627b44880caSCaroline Tice 62830fdc8d8SChris Lattner // Deactivate the old top reader 629b44880caSCaroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader ()); 630b44880caSCaroline Tice 63130fdc8d8SChris Lattner if (top_reader_sp) 63230fdc8d8SChris Lattner top_reader_sp->Notify (eInputReaderDeactivate); 633b44880caSCaroline Tice 634d5a0a01bSCaroline Tice m_input_reader_stack.Push (reader_sp); 63530fdc8d8SChris Lattner reader_sp->Notify (eInputReaderActivate); 63630fdc8d8SChris Lattner ActivateInputReader (reader_sp); 63730fdc8d8SChris Lattner } 63830fdc8d8SChris Lattner 63930fdc8d8SChris Lattner bool 6404d122c40SGreg Clayton Debugger::PopInputReader (const InputReaderSP& pop_reader_sp) 64130fdc8d8SChris Lattner { 64230fdc8d8SChris Lattner bool result = false; 64330fdc8d8SChris Lattner 64430fdc8d8SChris Lattner // The reader on the stop of the stack is done, so let the next 64530fdc8d8SChris Lattner // read on the stack referesh its prompt and if there is one... 646d5a0a01bSCaroline Tice if (!m_input_reader_stack.IsEmpty()) 64730fdc8d8SChris Lattner { 648b44880caSCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 649d5a0a01bSCaroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 65030fdc8d8SChris Lattner 65130fdc8d8SChris Lattner if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get()) 65230fdc8d8SChris Lattner { 653d5a0a01bSCaroline Tice m_input_reader_stack.Pop (); 65430fdc8d8SChris Lattner reader_sp->Notify (eInputReaderDeactivate); 65530fdc8d8SChris Lattner reader_sp->Notify (eInputReaderDone); 65630fdc8d8SChris Lattner result = true; 65730fdc8d8SChris Lattner 658d5a0a01bSCaroline Tice if (!m_input_reader_stack.IsEmpty()) 65930fdc8d8SChris Lattner { 660d5a0a01bSCaroline Tice reader_sp = m_input_reader_stack.Top(); 66130fdc8d8SChris Lattner if (reader_sp) 66230fdc8d8SChris Lattner { 66330fdc8d8SChris Lattner ActivateInputReader (reader_sp); 66430fdc8d8SChris Lattner reader_sp->Notify (eInputReaderReactivate); 66530fdc8d8SChris Lattner } 66630fdc8d8SChris Lattner } 66730fdc8d8SChris Lattner } 66830fdc8d8SChris Lattner } 66930fdc8d8SChris Lattner return result; 67030fdc8d8SChris Lattner } 67130fdc8d8SChris Lattner 67230fdc8d8SChris Lattner bool 67330fdc8d8SChris Lattner Debugger::CheckIfTopInputReaderIsDone () 67430fdc8d8SChris Lattner { 67530fdc8d8SChris Lattner bool result = false; 676d5a0a01bSCaroline Tice if (!m_input_reader_stack.IsEmpty()) 67730fdc8d8SChris Lattner { 678b44880caSCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 679d5a0a01bSCaroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 68030fdc8d8SChris Lattner 68130fdc8d8SChris Lattner if (reader_sp && reader_sp->IsDone()) 68230fdc8d8SChris Lattner { 68330fdc8d8SChris Lattner result = true; 68430fdc8d8SChris Lattner PopInputReader (reader_sp); 68530fdc8d8SChris Lattner } 68630fdc8d8SChris Lattner } 68730fdc8d8SChris Lattner return result; 68830fdc8d8SChris Lattner } 68930fdc8d8SChris Lattner 69030fdc8d8SChris Lattner void 69130fdc8d8SChris Lattner Debugger::ActivateInputReader (const InputReaderSP &reader_sp) 69230fdc8d8SChris Lattner { 69351b1e2d2SGreg Clayton int input_fd = m_input_file.GetFile().GetDescriptor(); 69430fdc8d8SChris Lattner 69551b1e2d2SGreg Clayton if (input_fd >= 0) 69630fdc8d8SChris Lattner { 69751b1e2d2SGreg Clayton Terminal tty(input_fd); 698a3406614SGreg Clayton 699a3406614SGreg Clayton tty.SetEcho(reader_sp->GetEcho()); 70030fdc8d8SChris Lattner 70130fdc8d8SChris Lattner switch (reader_sp->GetGranularity()) 70230fdc8d8SChris Lattner { 70330fdc8d8SChris Lattner case eInputReaderGranularityByte: 70430fdc8d8SChris Lattner case eInputReaderGranularityWord: 705a3406614SGreg Clayton tty.SetCanonical (false); 70630fdc8d8SChris Lattner break; 70730fdc8d8SChris Lattner 70830fdc8d8SChris Lattner case eInputReaderGranularityLine: 70930fdc8d8SChris Lattner case eInputReaderGranularityAll: 710a3406614SGreg Clayton tty.SetCanonical (true); 71130fdc8d8SChris Lattner break; 71230fdc8d8SChris Lattner 71330fdc8d8SChris Lattner default: 71430fdc8d8SChris Lattner break; 71530fdc8d8SChris Lattner } 71630fdc8d8SChris Lattner } 71730fdc8d8SChris Lattner } 7186611103cSGreg Clayton 7195b52f0c7SJim Ingham StreamSP 7205b52f0c7SJim Ingham Debugger::GetAsyncOutputStream () 7215b52f0c7SJim Ingham { 7225b52f0c7SJim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 7235b52f0c7SJim Ingham CommandInterpreter::eBroadcastBitAsynchronousOutputData)); 7245b52f0c7SJim Ingham } 7255b52f0c7SJim Ingham 7265b52f0c7SJim Ingham StreamSP 7275b52f0c7SJim Ingham Debugger::GetAsyncErrorStream () 7285b52f0c7SJim Ingham { 7295b52f0c7SJim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 7305b52f0c7SJim Ingham CommandInterpreter::eBroadcastBitAsynchronousErrorData)); 7315b52f0c7SJim Ingham } 7325b52f0c7SJim Ingham 733061858ceSEnrico Granata uint32_t 734061858ceSEnrico Granata Debugger::GetNumDebuggers() 735061858ceSEnrico Granata { 736061858ceSEnrico Granata Mutex::Locker locker (GetDebuggerListMutex ()); 737061858ceSEnrico Granata return GetDebuggerList().size(); 738061858ceSEnrico Granata } 739061858ceSEnrico Granata 740061858ceSEnrico Granata lldb::DebuggerSP 741061858ceSEnrico Granata Debugger::GetDebuggerAtIndex (uint32_t index) 742061858ceSEnrico Granata { 743061858ceSEnrico Granata DebuggerSP debugger_sp; 744061858ceSEnrico Granata 745061858ceSEnrico Granata Mutex::Locker locker (GetDebuggerListMutex ()); 746061858ceSEnrico Granata DebuggerList &debugger_list = GetDebuggerList(); 747061858ceSEnrico Granata 748061858ceSEnrico Granata if (index < debugger_list.size()) 749061858ceSEnrico Granata debugger_sp = debugger_list[index]; 750061858ceSEnrico Granata 751061858ceSEnrico Granata return debugger_sp; 752061858ceSEnrico Granata } 753061858ceSEnrico Granata 754ebc1bb27SCaroline Tice DebuggerSP 755ebc1bb27SCaroline Tice Debugger::FindDebuggerWithID (lldb::user_id_t id) 756ebc1bb27SCaroline Tice { 7574d122c40SGreg Clayton DebuggerSP debugger_sp; 758ebc1bb27SCaroline Tice 759ebc1bb27SCaroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 760ebc1bb27SCaroline Tice DebuggerList &debugger_list = GetDebuggerList(); 761ebc1bb27SCaroline Tice DebuggerList::iterator pos, end = debugger_list.end(); 762ebc1bb27SCaroline Tice for (pos = debugger_list.begin(); pos != end; ++pos) 763ebc1bb27SCaroline Tice { 764ebc1bb27SCaroline Tice if ((*pos).get()->GetID() == id) 765ebc1bb27SCaroline Tice { 766ebc1bb27SCaroline Tice debugger_sp = *pos; 767ebc1bb27SCaroline Tice break; 768ebc1bb27SCaroline Tice } 769ebc1bb27SCaroline Tice } 770ebc1bb27SCaroline Tice return debugger_sp; 771ebc1bb27SCaroline Tice } 7723df9a8dfSCaroline Tice 7731b654882SGreg Clayton static void 7741b654882SGreg Clayton TestPromptFormats (StackFrame *frame) 7751b654882SGreg Clayton { 7761b654882SGreg Clayton if (frame == NULL) 7771b654882SGreg Clayton return; 7781b654882SGreg Clayton 7791b654882SGreg Clayton StreamString s; 7801b654882SGreg Clayton const char *prompt_format = 7811b654882SGreg Clayton "{addr = '${addr}'\n}" 7821b654882SGreg Clayton "{process.id = '${process.id}'\n}" 7831b654882SGreg Clayton "{process.name = '${process.name}'\n}" 7841b654882SGreg Clayton "{process.file.basename = '${process.file.basename}'\n}" 7851b654882SGreg Clayton "{process.file.fullpath = '${process.file.fullpath}'\n}" 7861b654882SGreg Clayton "{thread.id = '${thread.id}'\n}" 7871b654882SGreg Clayton "{thread.index = '${thread.index}'\n}" 7881b654882SGreg Clayton "{thread.name = '${thread.name}'\n}" 7891b654882SGreg Clayton "{thread.queue = '${thread.queue}'\n}" 7901b654882SGreg Clayton "{thread.stop-reason = '${thread.stop-reason}'\n}" 7911b654882SGreg Clayton "{target.arch = '${target.arch}'\n}" 7921b654882SGreg Clayton "{module.file.basename = '${module.file.basename}'\n}" 7931b654882SGreg Clayton "{module.file.fullpath = '${module.file.fullpath}'\n}" 7941b654882SGreg Clayton "{file.basename = '${file.basename}'\n}" 7951b654882SGreg Clayton "{file.fullpath = '${file.fullpath}'\n}" 7961b654882SGreg Clayton "{frame.index = '${frame.index}'\n}" 7971b654882SGreg Clayton "{frame.pc = '${frame.pc}'\n}" 7981b654882SGreg Clayton "{frame.sp = '${frame.sp}'\n}" 7991b654882SGreg Clayton "{frame.fp = '${frame.fp}'\n}" 8001b654882SGreg Clayton "{frame.flags = '${frame.flags}'\n}" 8011b654882SGreg Clayton "{frame.reg.rdi = '${frame.reg.rdi}'\n}" 8021b654882SGreg Clayton "{frame.reg.rip = '${frame.reg.rip}'\n}" 8031b654882SGreg Clayton "{frame.reg.rsp = '${frame.reg.rsp}'\n}" 8041b654882SGreg Clayton "{frame.reg.rbp = '${frame.reg.rbp}'\n}" 8051b654882SGreg Clayton "{frame.reg.rflags = '${frame.reg.rflags}'\n}" 8061b654882SGreg Clayton "{frame.reg.xmm0 = '${frame.reg.xmm0}'\n}" 8071b654882SGreg Clayton "{frame.reg.carp = '${frame.reg.carp}'\n}" 8081b654882SGreg Clayton "{function.id = '${function.id}'\n}" 8091b654882SGreg Clayton "{function.name = '${function.name}'\n}" 810ccbc08e6SGreg Clayton "{function.name-with-args = '${function.name-with-args}'\n}" 8111b654882SGreg Clayton "{function.addr-offset = '${function.addr-offset}'\n}" 8121b654882SGreg Clayton "{function.line-offset = '${function.line-offset}'\n}" 8131b654882SGreg Clayton "{function.pc-offset = '${function.pc-offset}'\n}" 8141b654882SGreg Clayton "{line.file.basename = '${line.file.basename}'\n}" 8151b654882SGreg Clayton "{line.file.fullpath = '${line.file.fullpath}'\n}" 8161b654882SGreg Clayton "{line.number = '${line.number}'\n}" 8171b654882SGreg Clayton "{line.start-addr = '${line.start-addr}'\n}" 8181b654882SGreg Clayton "{line.end-addr = '${line.end-addr}'\n}" 8191b654882SGreg Clayton ; 8201b654882SGreg Clayton 8211b654882SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextEverything)); 8221b654882SGreg Clayton ExecutionContext exe_ctx; 8230603aa9dSGreg Clayton frame->CalculateExecutionContext(exe_ctx); 8241b654882SGreg Clayton const char *end = NULL; 8251b654882SGreg Clayton if (Debugger::FormatPrompt (prompt_format, &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, &end)) 8261b654882SGreg Clayton { 8271b654882SGreg Clayton printf("%s\n", s.GetData()); 8281b654882SGreg Clayton } 8291b654882SGreg Clayton else 8301b654882SGreg Clayton { 8311b654882SGreg Clayton printf ("error: at '%s'\n", end); 8321b654882SGreg Clayton printf ("what we got: %s\n", s.GetData()); 8331b654882SGreg Clayton } 8341b654882SGreg Clayton } 8351b654882SGreg Clayton 8369fc1944eSEnrico Granata static bool 8379fc1944eSEnrico Granata ScanFormatDescriptor (const char* var_name_begin, 8389fc1944eSEnrico Granata const char* var_name_end, 8399fc1944eSEnrico Granata const char** var_name_final, 8409fc1944eSEnrico Granata const char** percent_position, 8414d122c40SGreg Clayton Format* custom_format, 8429fc1944eSEnrico Granata ValueObject::ValueObjectRepresentationStyle* val_obj_display) 8439fc1944eSEnrico Granata { 844e992a089SEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 8459fc1944eSEnrico Granata *percent_position = ::strchr(var_name_begin,'%'); 8469fc1944eSEnrico Granata if (!*percent_position || *percent_position > var_name_end) 847e992a089SEnrico Granata { 848e992a089SEnrico Granata if (log) 849e992a089SEnrico Granata log->Printf("no format descriptor in string, skipping"); 8509fc1944eSEnrico Granata *var_name_final = var_name_end; 851e992a089SEnrico Granata } 8529fc1944eSEnrico Granata else 8539fc1944eSEnrico Granata { 8549fc1944eSEnrico Granata *var_name_final = *percent_position; 8559fc1944eSEnrico Granata char* format_name = new char[var_name_end-*var_name_final]; format_name[var_name_end-*var_name_final-1] = '\0'; 8569fc1944eSEnrico Granata memcpy(format_name, *var_name_final+1, var_name_end-*var_name_final-1); 857e992a089SEnrico Granata if (log) 858e992a089SEnrico Granata log->Printf("parsing %s as a format descriptor", format_name); 8599fc1944eSEnrico Granata if ( !FormatManager::GetFormatFromCString(format_name, 8609fc1944eSEnrico Granata true, 8619fc1944eSEnrico Granata *custom_format) ) 8629fc1944eSEnrico Granata { 863e992a089SEnrico Granata if (log) 864e992a089SEnrico Granata log->Printf("%s is an unknown format", format_name); 8659fc1944eSEnrico Granata // if this is an @ sign, print ObjC description 8669fc1944eSEnrico Granata if (*format_name == '@') 8679fc1944eSEnrico Granata *val_obj_display = ValueObject::eDisplayLanguageSpecific; 8689fc1944eSEnrico Granata // if this is a V, print the value using the default format 869e992a089SEnrico Granata else if (*format_name == 'V') 8709fc1944eSEnrico Granata *val_obj_display = ValueObject::eDisplayValue; 871d55546b2SEnrico Granata // if this is an L, print the location of the value 872e992a089SEnrico Granata else if (*format_name == 'L') 873f2bbf717SEnrico Granata *val_obj_display = ValueObject::eDisplayLocation; 874d55546b2SEnrico Granata // if this is an S, print the summary after all 875e992a089SEnrico Granata else if (*format_name == 'S') 876d55546b2SEnrico Granata *val_obj_display = ValueObject::eDisplaySummary; 8775dfd49ccSEnrico Granata else if (*format_name == '#') 8785dfd49ccSEnrico Granata *val_obj_display = ValueObject::eDisplayChildrenCount; 879d64d0bc0SEnrico Granata else if (*format_name == 'T') 880d64d0bc0SEnrico Granata *val_obj_display = ValueObject::eDisplayType; 881e992a089SEnrico Granata else if (log) 882e992a089SEnrico Granata log->Printf("%s is an error, leaving the previous value alone", format_name); 8839fc1944eSEnrico Granata } 8849fc1944eSEnrico Granata // a good custom format tells us to print the value using it 8859fc1944eSEnrico Granata else 886e992a089SEnrico Granata { 887e992a089SEnrico Granata if (log) 888e992a089SEnrico Granata log->Printf("will display value for this VO"); 8899fc1944eSEnrico Granata *val_obj_display = ValueObject::eDisplayValue; 890e992a089SEnrico Granata } 8919fc1944eSEnrico Granata delete format_name; 8929fc1944eSEnrico Granata } 893e992a089SEnrico Granata if (log) 894e992a089SEnrico Granata log->Printf("final format description outcome: custom_format = %d, val_obj_display = %d", 895e992a089SEnrico Granata *custom_format, 896e992a089SEnrico Granata *val_obj_display); 8979fc1944eSEnrico Granata return true; 8989fc1944eSEnrico Granata } 8999fc1944eSEnrico Granata 9009fc1944eSEnrico Granata static bool 9019fc1944eSEnrico Granata ScanBracketedRange (const char* var_name_begin, 9029fc1944eSEnrico Granata const char* var_name_end, 9039fc1944eSEnrico Granata const char* var_name_final, 9049fc1944eSEnrico Granata const char** open_bracket_position, 9059fc1944eSEnrico Granata const char** separator_position, 9069fc1944eSEnrico Granata const char** close_bracket_position, 9079fc1944eSEnrico Granata const char** var_name_final_if_array_range, 9089fc1944eSEnrico Granata int64_t* index_lower, 9099fc1944eSEnrico Granata int64_t* index_higher) 9109fc1944eSEnrico Granata { 911e992a089SEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 9129fc1944eSEnrico Granata *open_bracket_position = ::strchr(var_name_begin,'['); 9139fc1944eSEnrico Granata if (*open_bracket_position && *open_bracket_position < var_name_final) 9149fc1944eSEnrico Granata { 9159fc1944eSEnrico Granata *separator_position = ::strchr(*open_bracket_position,'-'); // might be NULL if this is a simple var[N] bitfield 9169fc1944eSEnrico Granata *close_bracket_position = ::strchr(*open_bracket_position,']'); 9179fc1944eSEnrico Granata // as usual, we assume that [] will come before % 9189fc1944eSEnrico Granata //printf("trying to expand a []\n"); 9199fc1944eSEnrico Granata *var_name_final_if_array_range = *open_bracket_position; 9209fc1944eSEnrico Granata if (*close_bracket_position - *open_bracket_position == 1) 9219fc1944eSEnrico Granata { 922e992a089SEnrico Granata if (log) 923e992a089SEnrico Granata log->Printf("[] detected.. going from 0 to end of data"); 9249fc1944eSEnrico Granata *index_lower = 0; 9259fc1944eSEnrico Granata } 9269fc1944eSEnrico Granata else if (*separator_position == NULL || *separator_position > var_name_end) 9279fc1944eSEnrico Granata { 9289fc1944eSEnrico Granata char *end = NULL; 9299fc1944eSEnrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 9309fc1944eSEnrico Granata *index_higher = *index_lower; 931e992a089SEnrico Granata if (log) 932fd54b368SJason Molenda log->Printf("[%lld] detected, high index is same", *index_lower); 9339fc1944eSEnrico Granata } 9349fc1944eSEnrico Granata else if (*close_bracket_position && *close_bracket_position < var_name_end) 9359fc1944eSEnrico Granata { 9369fc1944eSEnrico Granata char *end = NULL; 9379fc1944eSEnrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 9389fc1944eSEnrico Granata *index_higher = ::strtoul (*separator_position+1, &end, 0); 939e992a089SEnrico Granata if (log) 940fd54b368SJason Molenda log->Printf("[%lld-%lld] detected", *index_lower, *index_higher); 9419fc1944eSEnrico Granata } 9429fc1944eSEnrico Granata else 943e992a089SEnrico Granata { 944e992a089SEnrico Granata if (log) 945e992a089SEnrico Granata log->Printf("expression is erroneous, cannot extract indices out of it"); 9469fc1944eSEnrico Granata return false; 947e992a089SEnrico Granata } 9489fc1944eSEnrico Granata if (*index_lower > *index_higher && *index_higher > 0) 9499fc1944eSEnrico Granata { 950e992a089SEnrico Granata if (log) 951e992a089SEnrico Granata log->Printf("swapping indices"); 9529fc1944eSEnrico Granata int temp = *index_lower; 9539fc1944eSEnrico Granata *index_lower = *index_higher; 9549fc1944eSEnrico Granata *index_higher = temp; 9559fc1944eSEnrico Granata } 9569fc1944eSEnrico Granata } 957e992a089SEnrico Granata else if (log) 958e992a089SEnrico Granata log->Printf("no bracketed range, skipping entirely"); 9599fc1944eSEnrico Granata return true; 9609fc1944eSEnrico Granata } 9619fc1944eSEnrico Granata 9629fc1944eSEnrico Granata 9639fc1944eSEnrico Granata static ValueObjectSP 964c482a192SEnrico Granata ExpandExpressionPath (ValueObject* valobj, 9659fc1944eSEnrico Granata StackFrame* frame, 9669fc1944eSEnrico Granata bool* do_deref_pointer, 9679fc1944eSEnrico Granata const char* var_name_begin, 9689fc1944eSEnrico Granata const char* var_name_final, 9699fc1944eSEnrico Granata Error& error) 9709fc1944eSEnrico Granata { 971e992a089SEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 9729fc1944eSEnrico Granata StreamString sstring; 9739fc1944eSEnrico Granata VariableSP var_sp; 9749fc1944eSEnrico Granata 9759fc1944eSEnrico Granata if (*do_deref_pointer) 976e992a089SEnrico Granata { 977e992a089SEnrico Granata if (log) 978e992a089SEnrico Granata log->Printf("been told to deref_pointer by caller"); 9799fc1944eSEnrico Granata sstring.PutChar('*'); 980e992a089SEnrico Granata } 981c482a192SEnrico Granata else if (valobj->IsDereferenceOfParent() && ClangASTContext::IsPointerType(valobj->GetParent()->GetClangType()) && !valobj->IsArrayItemForPointer()) 9829fc1944eSEnrico Granata { 983e992a089SEnrico Granata if (log) 984e992a089SEnrico Granata log->Printf("decided to deref_pointer myself"); 9859fc1944eSEnrico Granata sstring.PutChar('*'); 9869fc1944eSEnrico Granata *do_deref_pointer = true; 9879fc1944eSEnrico Granata } 9889fc1944eSEnrico Granata 989c482a192SEnrico Granata valobj->GetExpressionPath(sstring, true, ValueObject::eHonorPointers); 990e992a089SEnrico Granata if (log) 991e992a089SEnrico Granata log->Printf("expression path to expand in phase 0: %s",sstring.GetData()); 9929fc1944eSEnrico Granata sstring.PutRawBytes(var_name_begin+3, var_name_final-var_name_begin-3); 993e992a089SEnrico Granata if (log) 994e992a089SEnrico Granata log->Printf("expression path to expand in phase 1: %s",sstring.GetData()); 9959fc1944eSEnrico Granata std::string name = std::string(sstring.GetData()); 9969fc1944eSEnrico Granata ValueObjectSP target = frame->GetValueForVariableExpressionPath (name.c_str(), 9979fc1944eSEnrico Granata eNoDynamicValues, 9989fc1944eSEnrico Granata 0, 9999fc1944eSEnrico Granata var_sp, 10009fc1944eSEnrico Granata error); 10019fc1944eSEnrico Granata return target; 10029fc1944eSEnrico Granata } 10039fc1944eSEnrico Granata 10049fc1944eSEnrico Granata static ValueObjectSP 1005c482a192SEnrico Granata ExpandIndexedExpression (ValueObject* valobj, 10069fc1944eSEnrico Granata uint32_t index, 10079fc1944eSEnrico Granata StackFrame* frame, 1008fc7a7f3bSEnrico Granata bool deref_pointer) 10099fc1944eSEnrico Granata { 1010e992a089SEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 1011fc7a7f3bSEnrico Granata const char* ptr_deref_format = "[%d]"; 1012fc7a7f3bSEnrico Granata std::auto_ptr<char> ptr_deref_buffer(new char[10]); 1013fc7a7f3bSEnrico Granata ::sprintf(ptr_deref_buffer.get(), ptr_deref_format, index); 1014e992a089SEnrico Granata if (log) 1015e992a089SEnrico Granata log->Printf("name to deref: %s",ptr_deref_buffer.get()); 1016fc7a7f3bSEnrico Granata const char* first_unparsed; 1017fc7a7f3bSEnrico Granata ValueObject::GetValueForExpressionPathOptions options; 1018fc7a7f3bSEnrico Granata ValueObject::ExpressionPathEndResultType final_value_type; 1019fc7a7f3bSEnrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop; 1020fc7a7f3bSEnrico Granata ValueObject::ExpressionPathAftermath what_next = (deref_pointer ? ValueObject::eDereference : ValueObject::eNothing); 1021c482a192SEnrico Granata ValueObjectSP item = valobj->GetValueForExpressionPath (ptr_deref_buffer.get(), 1022fc7a7f3bSEnrico Granata &first_unparsed, 1023fc7a7f3bSEnrico Granata &reason_to_stop, 1024fc7a7f3bSEnrico Granata &final_value_type, 1025fc7a7f3bSEnrico Granata options, 1026fc7a7f3bSEnrico Granata &what_next); 1027fc7a7f3bSEnrico Granata if (!item) 1028fc7a7f3bSEnrico Granata { 1029e992a089SEnrico Granata if (log) 1030e992a089SEnrico Granata log->Printf("ERROR: unparsed portion = %s, why stopping = %d," 1031e992a089SEnrico Granata " final_value_type %d", 1032fc7a7f3bSEnrico Granata first_unparsed, reason_to_stop, final_value_type); 1033fc7a7f3bSEnrico Granata } 10349fc1944eSEnrico Granata else 10359fc1944eSEnrico Granata { 1036e992a089SEnrico Granata if (log) 1037e992a089SEnrico Granata log->Printf("ALL RIGHT: unparsed portion = %s, why stopping = %d," 1038e992a089SEnrico Granata " final_value_type %d", 1039fc7a7f3bSEnrico Granata first_unparsed, reason_to_stop, final_value_type); 10409fc1944eSEnrico Granata } 10419fc1944eSEnrico Granata return item; 10429fc1944eSEnrico Granata } 10439fc1944eSEnrico Granata 10441b654882SGreg Clayton bool 10451b654882SGreg Clayton Debugger::FormatPrompt 10461b654882SGreg Clayton ( 10471b654882SGreg Clayton const char *format, 10481b654882SGreg Clayton const SymbolContext *sc, 10491b654882SGreg Clayton const ExecutionContext *exe_ctx, 10501b654882SGreg Clayton const Address *addr, 10511b654882SGreg Clayton Stream &s, 10524becb37eSEnrico Granata const char **end, 1053c482a192SEnrico Granata ValueObject* valobj 10541b654882SGreg Clayton ) 10551b654882SGreg Clayton { 1056c482a192SEnrico Granata ValueObject* realvalobj = NULL; // makes it super-easy to parse pointers 10571b654882SGreg Clayton bool success = true; 10581b654882SGreg Clayton const char *p; 1059e992a089SEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 10601b654882SGreg Clayton for (p = format; *p != '\0'; ++p) 10611b654882SGreg Clayton { 1062c482a192SEnrico Granata if (realvalobj) 10634becb37eSEnrico Granata { 1064c482a192SEnrico Granata valobj = realvalobj; 1065c482a192SEnrico Granata realvalobj = NULL; 10664becb37eSEnrico Granata } 10671b654882SGreg Clayton size_t non_special_chars = ::strcspn (p, "${}\\"); 10681b654882SGreg Clayton if (non_special_chars > 0) 10691b654882SGreg Clayton { 10701b654882SGreg Clayton if (success) 10711b654882SGreg Clayton s.Write (p, non_special_chars); 10721b654882SGreg Clayton p += non_special_chars; 10731b654882SGreg Clayton } 10741b654882SGreg Clayton 10751b654882SGreg Clayton if (*p == '\0') 10761b654882SGreg Clayton { 10771b654882SGreg Clayton break; 10781b654882SGreg Clayton } 10791b654882SGreg Clayton else if (*p == '{') 10801b654882SGreg Clayton { 10811b654882SGreg Clayton // Start a new scope that must have everything it needs if it is to 10821b654882SGreg Clayton // to make it into the final output stream "s". If you want to make 10831b654882SGreg Clayton // a format that only prints out the function or symbol name if there 10841b654882SGreg Clayton // is one in the symbol context you can use: 10851b654882SGreg Clayton // "{function =${function.name}}" 10861b654882SGreg Clayton // The first '{' starts a new scope that end with the matching '}' at 10871b654882SGreg Clayton // the end of the string. The contents "function =${function.name}" 10881b654882SGreg Clayton // will then be evaluated and only be output if there is a function 10891b654882SGreg Clayton // or symbol with a valid name. 10901b654882SGreg Clayton StreamString sub_strm; 10911b654882SGreg Clayton 10921b654882SGreg Clayton ++p; // Skip the '{' 10931b654882SGreg Clayton 1094c482a192SEnrico Granata if (FormatPrompt (p, sc, exe_ctx, addr, sub_strm, &p, valobj)) 10951b654882SGreg Clayton { 10961b654882SGreg Clayton // The stream had all it needed 10971b654882SGreg Clayton s.Write(sub_strm.GetData(), sub_strm.GetSize()); 10981b654882SGreg Clayton } 10991b654882SGreg Clayton if (*p != '}') 11001b654882SGreg Clayton { 11011b654882SGreg Clayton success = false; 11021b654882SGreg Clayton break; 11031b654882SGreg Clayton } 11041b654882SGreg Clayton } 11051b654882SGreg Clayton else if (*p == '}') 11061b654882SGreg Clayton { 11071b654882SGreg Clayton // End of a enclosing scope 11081b654882SGreg Clayton break; 11091b654882SGreg Clayton } 11101b654882SGreg Clayton else if (*p == '$') 11111b654882SGreg Clayton { 11121b654882SGreg Clayton // We have a prompt variable to print 11131b654882SGreg Clayton ++p; 11141b654882SGreg Clayton if (*p == '{') 11151b654882SGreg Clayton { 11161b654882SGreg Clayton ++p; 11171b654882SGreg Clayton const char *var_name_begin = p; 11181b654882SGreg Clayton const char *var_name_end = ::strchr (p, '}'); 11191b654882SGreg Clayton 11201b654882SGreg Clayton if (var_name_end && var_name_begin < var_name_end) 11211b654882SGreg Clayton { 11221b654882SGreg Clayton // if we have already failed to parse, skip this variable 11231b654882SGreg Clayton if (success) 11241b654882SGreg Clayton { 11251b654882SGreg Clayton const char *cstr = NULL; 11261b654882SGreg Clayton Address format_addr; 11271b654882SGreg Clayton bool calculate_format_addr_function_offset = false; 11281b654882SGreg Clayton // Set reg_kind and reg_num to invalid values 11291b654882SGreg Clayton RegisterKind reg_kind = kNumRegisterKinds; 11301b654882SGreg Clayton uint32_t reg_num = LLDB_INVALID_REGNUM; 11311b654882SGreg Clayton FileSpec format_file_spec; 1132e0d378b3SGreg Clayton const RegisterInfo *reg_info = NULL; 11331b654882SGreg Clayton RegisterContext *reg_ctx = NULL; 11349fc1944eSEnrico Granata bool do_deref_pointer = false; 1135e992a089SEnrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop = ValueObject::eEndOfString; 1136e992a089SEnrico Granata ValueObject::ExpressionPathEndResultType final_value_type = ValueObject::ePlain; 11371b654882SGreg Clayton 11381b654882SGreg Clayton // Each variable must set success to true below... 11391b654882SGreg Clayton bool var_success = false; 11401b654882SGreg Clayton switch (var_name_begin[0]) 11411b654882SGreg Clayton { 11424becb37eSEnrico Granata case '*': 11436f3533fbSEnrico Granata case 'v': 11446f3533fbSEnrico Granata case 's': 11454becb37eSEnrico Granata { 1146c482a192SEnrico Granata if (!valobj) 114734132754SGreg Clayton break; 11486f3533fbSEnrico Granata 1149c3e320a7SEnrico Granata if (log) 1150c3e320a7SEnrico Granata log->Printf("initial string: %s",var_name_begin); 1151c3e320a7SEnrico Granata 11526f3533fbSEnrico Granata // check for *var and *svar 11536f3533fbSEnrico Granata if (*var_name_begin == '*') 11546f3533fbSEnrico Granata { 11559fc1944eSEnrico Granata do_deref_pointer = true; 11569fc1944eSEnrico Granata var_name_begin++; 11579fc1944eSEnrico Granata } 1158c3e320a7SEnrico Granata 1159c3e320a7SEnrico Granata if (log) 1160c3e320a7SEnrico Granata log->Printf("initial string: %s",var_name_begin); 1161c3e320a7SEnrico Granata 11626f3533fbSEnrico Granata if (*var_name_begin == 's') 11634becb37eSEnrico Granata { 11644d122c40SGreg Clayton valobj = valobj->GetSyntheticValue(eUseSyntheticFilter).get(); 11656f3533fbSEnrico Granata var_name_begin++; 11666f3533fbSEnrico Granata } 11676f3533fbSEnrico Granata 1168c3e320a7SEnrico Granata if (log) 1169c3e320a7SEnrico Granata log->Printf("initial string: %s",var_name_begin); 1170c3e320a7SEnrico Granata 11716f3533fbSEnrico Granata // should be a 'v' by now 11726f3533fbSEnrico Granata if (*var_name_begin != 'v') 11736f3533fbSEnrico Granata break; 11746f3533fbSEnrico Granata 1175c3e320a7SEnrico Granata if (log) 1176c3e320a7SEnrico Granata log->Printf("initial string: %s",var_name_begin); 1177c3e320a7SEnrico Granata 1178fc7a7f3bSEnrico Granata ValueObject::ExpressionPathAftermath what_next = (do_deref_pointer ? 1179fc7a7f3bSEnrico Granata ValueObject::eDereference : ValueObject::eNothing); 1180fc7a7f3bSEnrico Granata ValueObject::GetValueForExpressionPathOptions options; 11818c9d3560SEnrico Granata options.DontCheckDotVsArrowSyntax().DoAllowBitfieldSyntax().DoAllowFragileIVar().DoAllowSyntheticChildren(); 11820a3958e0SEnrico Granata ValueObject::ValueObjectRepresentationStyle val_obj_display = ValueObject::eDisplaySummary; 118334132754SGreg Clayton ValueObject* target = NULL; 11844d122c40SGreg Clayton Format custom_format = eFormatInvalid; 118534132754SGreg Clayton const char* var_name_final = NULL; 11869fc1944eSEnrico Granata const char* var_name_final_if_array_range = NULL; 118734132754SGreg Clayton const char* close_bracket_position = NULL; 118834132754SGreg Clayton int64_t index_lower = -1; 118934132754SGreg Clayton int64_t index_higher = -1; 11909fc1944eSEnrico Granata bool is_array_range = false; 1191fc7a7f3bSEnrico Granata const char* first_unparsed; 119285933ed4SEnrico Granata bool was_plain_var = false; 119385933ed4SEnrico Granata bool was_var_format = false; 1194fc7a7f3bSEnrico Granata 1195c482a192SEnrico Granata if (!valobj) break; 1196c482a192SEnrico Granata // simplest case ${var}, just print valobj's value 11979fc1944eSEnrico Granata if (::strncmp (var_name_begin, "var}", strlen("var}")) == 0) 11980a3958e0SEnrico Granata { 119985933ed4SEnrico Granata was_plain_var = true; 1200c482a192SEnrico Granata target = valobj; 12010a3958e0SEnrico Granata val_obj_display = ValueObject::eDisplayValue; 12020a3958e0SEnrico Granata } 12039fc1944eSEnrico Granata else if (::strncmp(var_name_begin,"var%",strlen("var%")) == 0) 12049fc1944eSEnrico Granata { 120585933ed4SEnrico Granata was_var_format = true; 12069fc1944eSEnrico Granata // this is a variable with some custom format applied to it 12079fc1944eSEnrico Granata const char* percent_position; 1208c482a192SEnrico Granata target = valobj; 12090a3958e0SEnrico Granata val_obj_display = ValueObject::eDisplayValue; 12109fc1944eSEnrico Granata ScanFormatDescriptor (var_name_begin, 12119fc1944eSEnrico Granata var_name_end, 12129fc1944eSEnrico Granata &var_name_final, 12139fc1944eSEnrico Granata &percent_position, 12149fc1944eSEnrico Granata &custom_format, 12159fc1944eSEnrico Granata &val_obj_display); 12160a3958e0SEnrico Granata } 12179fc1944eSEnrico Granata // this is ${var.something} or multiple .something nested 12189fc1944eSEnrico Granata else if (::strncmp (var_name_begin, "var", strlen("var")) == 0) 12199fc1944eSEnrico Granata { 12209fc1944eSEnrico Granata 12219fc1944eSEnrico Granata const char* percent_position; 12229fc1944eSEnrico Granata ScanFormatDescriptor (var_name_begin, 12239fc1944eSEnrico Granata var_name_end, 12249fc1944eSEnrico Granata &var_name_final, 12259fc1944eSEnrico Granata &percent_position, 12269fc1944eSEnrico Granata &custom_format, 12279fc1944eSEnrico Granata &val_obj_display); 12289fc1944eSEnrico Granata 12299fc1944eSEnrico Granata const char* open_bracket_position; 12309fc1944eSEnrico Granata const char* separator_position; 12319fc1944eSEnrico Granata ScanBracketedRange (var_name_begin, 12329fc1944eSEnrico Granata var_name_end, 12339fc1944eSEnrico Granata var_name_final, 12349fc1944eSEnrico Granata &open_bracket_position, 12359fc1944eSEnrico Granata &separator_position, 12369fc1944eSEnrico Granata &close_bracket_position, 12379fc1944eSEnrico Granata &var_name_final_if_array_range, 12389fc1944eSEnrico Granata &index_lower, 12399fc1944eSEnrico Granata &index_higher); 12409fc1944eSEnrico Granata 12419fc1944eSEnrico Granata Error error; 12429fc1944eSEnrico Granata 1243fc7a7f3bSEnrico Granata std::auto_ptr<char> expr_path(new char[var_name_final-var_name_begin-1]); 1244fc7a7f3bSEnrico Granata ::memset(expr_path.get(), 0, var_name_final-var_name_begin-1); 1245fc7a7f3bSEnrico Granata memcpy(expr_path.get(), var_name_begin+3,var_name_final-var_name_begin-3); 1246fc7a7f3bSEnrico Granata 1247e992a089SEnrico Granata if (log) 1248e992a089SEnrico Granata log->Printf("symbol to expand: %s",expr_path.get()); 1249fc7a7f3bSEnrico Granata 1250c482a192SEnrico Granata target = valobj->GetValueForExpressionPath(expr_path.get(), 1251fc7a7f3bSEnrico Granata &first_unparsed, 1252fc7a7f3bSEnrico Granata &reason_to_stop, 1253fc7a7f3bSEnrico Granata &final_value_type, 1254fc7a7f3bSEnrico Granata options, 1255fc7a7f3bSEnrico Granata &what_next).get(); 1256fc7a7f3bSEnrico Granata 1257fc7a7f3bSEnrico Granata if (!target) 12589fc1944eSEnrico Granata { 1259e992a089SEnrico Granata if (log) 1260e992a089SEnrico Granata log->Printf("ERROR: unparsed portion = %s, why stopping = %d," 1261e992a089SEnrico Granata " final_value_type %d", 1262fc7a7f3bSEnrico Granata first_unparsed, reason_to_stop, final_value_type); 1263fc7a7f3bSEnrico Granata break; 12640a3958e0SEnrico Granata } 1265a7187d00SEnrico Granata else 1266fc7a7f3bSEnrico Granata { 1267e992a089SEnrico Granata if (log) 1268e992a089SEnrico Granata log->Printf("ALL RIGHT: unparsed portion = %s, why stopping = %d," 1269e992a089SEnrico Granata " final_value_type %d", 1270fc7a7f3bSEnrico Granata first_unparsed, reason_to_stop, final_value_type); 1271a7187d00SEnrico Granata } 12720a3958e0SEnrico Granata } 12730a3958e0SEnrico Granata else 12740a3958e0SEnrico Granata break; 12759fc1944eSEnrico Granata 1276fc7a7f3bSEnrico Granata is_array_range = (final_value_type == ValueObject::eBoundedRange || 1277fc7a7f3bSEnrico Granata final_value_type == ValueObject::eUnboundedRange); 1278fc7a7f3bSEnrico Granata 1279fc7a7f3bSEnrico Granata do_deref_pointer = (what_next == ValueObject::eDereference); 1280fc7a7f3bSEnrico Granata 1281a7187d00SEnrico Granata if (do_deref_pointer && !is_array_range) 12820a3958e0SEnrico Granata { 12839fc1944eSEnrico Granata // I have not deref-ed yet, let's do it 12849fc1944eSEnrico Granata // this happens when we are not going through GetValueForVariableExpressionPath 12859fc1944eSEnrico Granata // to get to the target ValueObject 12869fc1944eSEnrico Granata Error error; 12879fc1944eSEnrico Granata target = target->Dereference(error).get(); 1288dc940730SEnrico Granata if (error.Fail()) 1289dc940730SEnrico Granata { 1290dc940730SEnrico Granata if (log) 1291dc940730SEnrico Granata log->Printf("ERROR: %s\n", error.AsCString("unknown")); \ 1292dc940730SEnrico Granata break; 1293dc940730SEnrico Granata } 12949fc1944eSEnrico Granata do_deref_pointer = false; 12950a3958e0SEnrico Granata } 12960a3958e0SEnrico Granata 129785933ed4SEnrico Granata // TODO use flags for these 1298f4efecd9SEnrico Granata bool is_array = ClangASTContext::IsArrayType(target->GetClangType()); 1299f4efecd9SEnrico Granata bool is_pointer = ClangASTContext::IsPointerType(target->GetClangType()); 130085933ed4SEnrico Granata bool is_aggregate = ClangASTContext::IsAggregateType(target->GetClangType()); 1301f4efecd9SEnrico Granata 1302f4efecd9SEnrico Granata if ((is_array || is_pointer) && (!is_array_range) && val_obj_display == ValueObject::eDisplayValue) // this should be wrong, but there are some exceptions 1303f4efecd9SEnrico Granata { 130485933ed4SEnrico Granata StreamString str_temp; 1305e992a089SEnrico Granata if (log) 1306e992a089SEnrico Granata log->Printf("I am into array || pointer && !range"); 1307d64d0bc0SEnrico Granata 1308d64d0bc0SEnrico Granata if (target->HasSpecialCasesForPrintableRepresentation(val_obj_display, 1309d64d0bc0SEnrico Granata custom_format)) 1310d64d0bc0SEnrico Granata { 1311f4efecd9SEnrico Granata // try to use the special cases 131285933ed4SEnrico Granata var_success = target->DumpPrintableRepresentation(str_temp, 131385933ed4SEnrico Granata val_obj_display, 131485933ed4SEnrico Granata custom_format); 1315e992a089SEnrico Granata if (log) 1316e992a089SEnrico Granata log->Printf("special cases did%s match", var_success ? "" : "n't"); 1317d64d0bc0SEnrico Granata 1318d64d0bc0SEnrico Granata // should not happen 131985933ed4SEnrico Granata if (!var_success) 132085933ed4SEnrico Granata s << "<invalid usage of pointer value as object>"; 132185933ed4SEnrico Granata else 132285933ed4SEnrico Granata s << str_temp.GetData(); 1323d64d0bc0SEnrico Granata var_success = true; 1324d64d0bc0SEnrico Granata break; 1325d64d0bc0SEnrico Granata } 1326d64d0bc0SEnrico Granata else 1327d64d0bc0SEnrico Granata { 132888da35f8SEnrico Granata if (was_plain_var) // if ${var} 1329d64d0bc0SEnrico Granata { 1330d64d0bc0SEnrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 1331d64d0bc0SEnrico Granata } 133288da35f8SEnrico Granata else if (is_pointer) // if pointer, value is the address stored 133388da35f8SEnrico Granata { 133488da35f8SEnrico Granata var_success = target->GetPrintableRepresentation(s, 133588da35f8SEnrico Granata val_obj_display, 133688da35f8SEnrico Granata custom_format); 133788da35f8SEnrico Granata } 1338d64d0bc0SEnrico Granata else 1339d64d0bc0SEnrico Granata { 1340d64d0bc0SEnrico Granata s << "<invalid usage of pointer value as object>"; 1341d64d0bc0SEnrico Granata } 1342d64d0bc0SEnrico Granata var_success = true; 1343d64d0bc0SEnrico Granata break; 1344d64d0bc0SEnrico Granata } 1345d64d0bc0SEnrico Granata } 1346d64d0bc0SEnrico Granata 1347d64d0bc0SEnrico Granata // if directly trying to print ${var}, and this is an aggregate, display a nice 1348d64d0bc0SEnrico Granata // type @ location message 1349d64d0bc0SEnrico Granata if (is_aggregate && was_plain_var) 1350d64d0bc0SEnrico Granata { 1351d64d0bc0SEnrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 1352d64d0bc0SEnrico Granata var_success = true; 135385933ed4SEnrico Granata break; 135485933ed4SEnrico Granata } 135585933ed4SEnrico Granata 1356d64d0bc0SEnrico Granata // if directly trying to print ${var%V}, and this is an aggregate, do not let the user do it 1357d64d0bc0SEnrico Granata if (is_aggregate && ((was_var_format && val_obj_display == ValueObject::eDisplayValue))) 135885933ed4SEnrico Granata { 135985933ed4SEnrico Granata s << "<invalid use of aggregate type>"; 136085933ed4SEnrico Granata var_success = true; 1361f4efecd9SEnrico Granata break; 1362f4efecd9SEnrico Granata } 1363f4efecd9SEnrico Granata 13649fc1944eSEnrico Granata if (!is_array_range) 1365e992a089SEnrico Granata { 1366e992a089SEnrico Granata if (log) 1367e992a089SEnrico Granata log->Printf("dumping ordinary printable output"); 13689fc1944eSEnrico Granata var_success = target->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1369e992a089SEnrico Granata } 13709fc1944eSEnrico Granata else 13719fc1944eSEnrico Granata { 1372e992a089SEnrico Granata if (log) 1373e992a089SEnrico Granata log->Printf("checking if I can handle as array"); 13749fc1944eSEnrico Granata if (!is_array && !is_pointer) 13759fc1944eSEnrico Granata break; 1376e992a089SEnrico Granata if (log) 1377e992a089SEnrico Granata log->Printf("handle as array"); 1378fc7a7f3bSEnrico Granata const char* special_directions = NULL; 1379fc7a7f3bSEnrico Granata StreamString special_directions_writer; 13800a3958e0SEnrico Granata if (close_bracket_position && (var_name_end-close_bracket_position > 1)) 13810a3958e0SEnrico Granata { 1382fc7a7f3bSEnrico Granata ConstString additional_data; 1383fc7a7f3bSEnrico Granata additional_data.SetCStringWithLength(close_bracket_position+1, var_name_end-close_bracket_position-1); 1384fc7a7f3bSEnrico Granata special_directions_writer.Printf("${%svar%s}", 1385fc7a7f3bSEnrico Granata do_deref_pointer ? "*" : "", 1386fc7a7f3bSEnrico Granata additional_data.GetCString()); 1387fc7a7f3bSEnrico Granata special_directions = special_directions_writer.GetData(); 13880a3958e0SEnrico Granata } 13890a3958e0SEnrico Granata 13900a3958e0SEnrico Granata // let us display items index_lower thru index_higher of this array 13910a3958e0SEnrico Granata s.PutChar('['); 13920a3958e0SEnrico Granata var_success = true; 13930a3958e0SEnrico Granata 13949fc1944eSEnrico Granata if (index_higher < 0) 1395c482a192SEnrico Granata index_higher = valobj->GetNumChildren() - 1; 13960a3958e0SEnrico Granata 1397*cc4d0146SGreg Clayton uint32_t max_num_children = target->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); 139822c55d18SEnrico Granata 13990a3958e0SEnrico Granata for (;index_lower<=index_higher;index_lower++) 14000a3958e0SEnrico Granata { 1401fc7a7f3bSEnrico Granata ValueObject* item = ExpandIndexedExpression (target, 14029fc1944eSEnrico Granata index_lower, 1403c14ee32dSGreg Clayton exe_ctx->GetFramePtr(), 1404fc7a7f3bSEnrico Granata false).get(); 14050a3958e0SEnrico Granata 1406fc7a7f3bSEnrico Granata if (!item) 1407fc7a7f3bSEnrico Granata { 1408e992a089SEnrico Granata if (log) 1409fd54b368SJason Molenda log->Printf("ERROR in getting child item at index %lld", index_lower); 1410fc7a7f3bSEnrico Granata } 1411fc7a7f3bSEnrico Granata else 1412fc7a7f3bSEnrico Granata { 1413e992a089SEnrico Granata if (log) 1414e992a089SEnrico Granata log->Printf("special_directions for child item: %s",special_directions); 1415fc7a7f3bSEnrico Granata } 1416fc7a7f3bSEnrico Granata 14170a3958e0SEnrico Granata if (!special_directions) 14189fc1944eSEnrico Granata var_success &= item->DumpPrintableRepresentation(s,val_obj_display, custom_format); 14190a3958e0SEnrico Granata else 14200a3958e0SEnrico Granata var_success &= FormatPrompt(special_directions, sc, exe_ctx, addr, s, NULL, item); 14210a3958e0SEnrico Granata 142222c55d18SEnrico Granata if (--max_num_children == 0) 142322c55d18SEnrico Granata { 142422c55d18SEnrico Granata s.PutCString(", ..."); 142522c55d18SEnrico Granata break; 142622c55d18SEnrico Granata } 142722c55d18SEnrico Granata 14280a3958e0SEnrico Granata if (index_lower < index_higher) 14290a3958e0SEnrico Granata s.PutChar(','); 14300a3958e0SEnrico Granata } 14310a3958e0SEnrico Granata s.PutChar(']'); 14324becb37eSEnrico Granata } 14334becb37eSEnrico Granata } 143434132754SGreg Clayton break; 14351b654882SGreg Clayton case 'a': 14361b654882SGreg Clayton if (::strncmp (var_name_begin, "addr}", strlen("addr}")) == 0) 14371b654882SGreg Clayton { 14381b654882SGreg Clayton if (addr && addr->IsValid()) 14391b654882SGreg Clayton { 14401b654882SGreg Clayton var_success = true; 14411b654882SGreg Clayton format_addr = *addr; 14421b654882SGreg Clayton } 14431b654882SGreg Clayton } 14445a31471eSGreg Clayton else if (::strncmp (var_name_begin, "ansi.", strlen("ansi.")) == 0) 14455a31471eSGreg Clayton { 14465a31471eSGreg Clayton var_success = true; 14475a31471eSGreg Clayton var_name_begin += strlen("ansi."); // Skip the "ansi." 14485a31471eSGreg Clayton if (::strncmp (var_name_begin, "fg.", strlen("fg.")) == 0) 14495a31471eSGreg Clayton { 14505a31471eSGreg Clayton var_name_begin += strlen("fg."); // Skip the "fg." 14515a31471eSGreg Clayton if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0) 14525a31471eSGreg Clayton { 14535a31471eSGreg Clayton s.Printf ("%s%s%s", 14545a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 14555a31471eSGreg Clayton lldb_utility::ansi::k_fg_black, 14565a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 14575a31471eSGreg Clayton } 14585a31471eSGreg Clayton else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0) 14595a31471eSGreg Clayton { 14605a31471eSGreg Clayton s.Printf ("%s%s%s", 14615a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 14625a31471eSGreg Clayton lldb_utility::ansi::k_fg_red, 14635a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 14645a31471eSGreg Clayton } 14655a31471eSGreg Clayton else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0) 14665a31471eSGreg Clayton { 14675a31471eSGreg Clayton s.Printf ("%s%s%s", 14685a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 14695a31471eSGreg Clayton lldb_utility::ansi::k_fg_green, 14705a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 14715a31471eSGreg Clayton } 14725a31471eSGreg Clayton else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0) 14735a31471eSGreg Clayton { 14745a31471eSGreg Clayton s.Printf ("%s%s%s", 14755a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 14765a31471eSGreg Clayton lldb_utility::ansi::k_fg_yellow, 14775a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 14785a31471eSGreg Clayton } 14795a31471eSGreg Clayton else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0) 14805a31471eSGreg Clayton { 14815a31471eSGreg Clayton s.Printf ("%s%s%s", 14825a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 14835a31471eSGreg Clayton lldb_utility::ansi::k_fg_blue, 14845a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 14855a31471eSGreg Clayton } 14865a31471eSGreg Clayton else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0) 14875a31471eSGreg Clayton { 14885a31471eSGreg Clayton s.Printf ("%s%s%s", 14895a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 14905a31471eSGreg Clayton lldb_utility::ansi::k_fg_purple, 14915a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 14925a31471eSGreg Clayton } 14935a31471eSGreg Clayton else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0) 14945a31471eSGreg Clayton { 14955a31471eSGreg Clayton s.Printf ("%s%s%s", 14965a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 14975a31471eSGreg Clayton lldb_utility::ansi::k_fg_cyan, 14985a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 14995a31471eSGreg Clayton } 15005a31471eSGreg Clayton else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0) 15015a31471eSGreg Clayton { 15025a31471eSGreg Clayton s.Printf ("%s%s%s", 15035a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15045a31471eSGreg Clayton lldb_utility::ansi::k_fg_white, 15055a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15065a31471eSGreg Clayton } 15075a31471eSGreg Clayton else 15085a31471eSGreg Clayton { 15095a31471eSGreg Clayton var_success = false; 15105a31471eSGreg Clayton } 15115a31471eSGreg Clayton } 15125a31471eSGreg Clayton else if (::strncmp (var_name_begin, "bg.", strlen("bg.")) == 0) 15135a31471eSGreg Clayton { 15145a31471eSGreg Clayton var_name_begin += strlen("bg."); // Skip the "bg." 15155a31471eSGreg Clayton if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0) 15165a31471eSGreg Clayton { 15175a31471eSGreg Clayton s.Printf ("%s%s%s", 15185a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15195a31471eSGreg Clayton lldb_utility::ansi::k_bg_black, 15205a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15215a31471eSGreg Clayton } 15225a31471eSGreg Clayton else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0) 15235a31471eSGreg Clayton { 15245a31471eSGreg Clayton s.Printf ("%s%s%s", 15255a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15265a31471eSGreg Clayton lldb_utility::ansi::k_bg_red, 15275a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15285a31471eSGreg Clayton } 15295a31471eSGreg Clayton else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0) 15305a31471eSGreg Clayton { 15315a31471eSGreg Clayton s.Printf ("%s%s%s", 15325a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15335a31471eSGreg Clayton lldb_utility::ansi::k_bg_green, 15345a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15355a31471eSGreg Clayton } 15365a31471eSGreg Clayton else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0) 15375a31471eSGreg Clayton { 15385a31471eSGreg Clayton s.Printf ("%s%s%s", 15395a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15405a31471eSGreg Clayton lldb_utility::ansi::k_bg_yellow, 15415a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15425a31471eSGreg Clayton } 15435a31471eSGreg Clayton else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0) 15445a31471eSGreg Clayton { 15455a31471eSGreg Clayton s.Printf ("%s%s%s", 15465a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15475a31471eSGreg Clayton lldb_utility::ansi::k_bg_blue, 15485a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15495a31471eSGreg Clayton } 15505a31471eSGreg Clayton else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0) 15515a31471eSGreg Clayton { 15525a31471eSGreg Clayton s.Printf ("%s%s%s", 15535a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15545a31471eSGreg Clayton lldb_utility::ansi::k_bg_purple, 15555a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15565a31471eSGreg Clayton } 15575a31471eSGreg Clayton else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0) 15585a31471eSGreg Clayton { 15595a31471eSGreg Clayton s.Printf ("%s%s%s", 15605a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15615a31471eSGreg Clayton lldb_utility::ansi::k_bg_cyan, 15625a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15635a31471eSGreg Clayton } 15645a31471eSGreg Clayton else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0) 15655a31471eSGreg Clayton { 15665a31471eSGreg Clayton s.Printf ("%s%s%s", 15675a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15685a31471eSGreg Clayton lldb_utility::ansi::k_bg_white, 15695a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15705a31471eSGreg Clayton } 15715a31471eSGreg Clayton else 15725a31471eSGreg Clayton { 15735a31471eSGreg Clayton var_success = false; 15745a31471eSGreg Clayton } 15755a31471eSGreg Clayton } 15765a31471eSGreg Clayton else if (::strncmp (var_name_begin, "normal}", strlen ("normal}")) == 0) 15775a31471eSGreg Clayton { 15785a31471eSGreg Clayton s.Printf ("%s%s%s", 15795a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15805a31471eSGreg Clayton lldb_utility::ansi::k_ctrl_normal, 15815a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15825a31471eSGreg Clayton } 15835a31471eSGreg Clayton else if (::strncmp (var_name_begin, "bold}", strlen("bold}")) == 0) 15845a31471eSGreg Clayton { 15855a31471eSGreg Clayton s.Printf ("%s%s%s", 15865a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15875a31471eSGreg Clayton lldb_utility::ansi::k_ctrl_bold, 15885a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15895a31471eSGreg Clayton } 15905a31471eSGreg Clayton else if (::strncmp (var_name_begin, "faint}", strlen("faint}")) == 0) 15915a31471eSGreg Clayton { 15925a31471eSGreg Clayton s.Printf ("%s%s%s", 15935a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 15945a31471eSGreg Clayton lldb_utility::ansi::k_ctrl_faint, 15955a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 15965a31471eSGreg Clayton } 15975a31471eSGreg Clayton else if (::strncmp (var_name_begin, "italic}", strlen("italic}")) == 0) 15985a31471eSGreg Clayton { 15995a31471eSGreg Clayton s.Printf ("%s%s%s", 16005a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 16015a31471eSGreg Clayton lldb_utility::ansi::k_ctrl_italic, 16025a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 16035a31471eSGreg Clayton } 16045a31471eSGreg Clayton else if (::strncmp (var_name_begin, "underline}", strlen("underline}")) == 0) 16055a31471eSGreg Clayton { 16065a31471eSGreg Clayton s.Printf ("%s%s%s", 16075a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 16085a31471eSGreg Clayton lldb_utility::ansi::k_ctrl_underline, 16095a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 16105a31471eSGreg Clayton } 16115a31471eSGreg Clayton else if (::strncmp (var_name_begin, "slow-blink}", strlen("slow-blink}")) == 0) 16125a31471eSGreg Clayton { 16135a31471eSGreg Clayton s.Printf ("%s%s%s", 16145a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 16155a31471eSGreg Clayton lldb_utility::ansi::k_ctrl_slow_blink, 16165a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 16175a31471eSGreg Clayton } 16185a31471eSGreg Clayton else if (::strncmp (var_name_begin, "fast-blink}", strlen("fast-blink}")) == 0) 16195a31471eSGreg Clayton { 16205a31471eSGreg Clayton s.Printf ("%s%s%s", 16215a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 16225a31471eSGreg Clayton lldb_utility::ansi::k_ctrl_fast_blink, 16235a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 16245a31471eSGreg Clayton } 16255a31471eSGreg Clayton else if (::strncmp (var_name_begin, "negative}", strlen("negative}")) == 0) 16265a31471eSGreg Clayton { 16275a31471eSGreg Clayton s.Printf ("%s%s%s", 16285a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 16295a31471eSGreg Clayton lldb_utility::ansi::k_ctrl_negative, 16305a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 16315a31471eSGreg Clayton } 16325a31471eSGreg Clayton else if (::strncmp (var_name_begin, "conceal}", strlen("conceal}")) == 0) 16335a31471eSGreg Clayton { 16345a31471eSGreg Clayton s.Printf ("%s%s%s", 16355a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 16365a31471eSGreg Clayton lldb_utility::ansi::k_ctrl_conceal, 16375a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 16385a31471eSGreg Clayton 16395a31471eSGreg Clayton } 16405a31471eSGreg Clayton else if (::strncmp (var_name_begin, "crossed-out}", strlen("crossed-out}")) == 0) 16415a31471eSGreg Clayton { 16425a31471eSGreg Clayton s.Printf ("%s%s%s", 16435a31471eSGreg Clayton lldb_utility::ansi::k_escape_start, 16445a31471eSGreg Clayton lldb_utility::ansi::k_ctrl_crossed_out, 16455a31471eSGreg Clayton lldb_utility::ansi::k_escape_end); 16465a31471eSGreg Clayton } 16475a31471eSGreg Clayton else 16485a31471eSGreg Clayton { 16495a31471eSGreg Clayton var_success = false; 16505a31471eSGreg Clayton } 16515a31471eSGreg Clayton } 16521b654882SGreg Clayton break; 16531b654882SGreg Clayton 16541b654882SGreg Clayton case 'p': 16551b654882SGreg Clayton if (::strncmp (var_name_begin, "process.", strlen("process.")) == 0) 16561b654882SGreg Clayton { 1657c14ee32dSGreg Clayton if (exe_ctx) 1658c14ee32dSGreg Clayton { 1659c14ee32dSGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 1660c14ee32dSGreg Clayton if (process) 16611b654882SGreg Clayton { 16621b654882SGreg Clayton var_name_begin += ::strlen ("process."); 16631b654882SGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 16641b654882SGreg Clayton { 166581c22f61SGreg Clayton s.Printf("%llu", process->GetID()); 16661b654882SGreg Clayton var_success = true; 16671b654882SGreg Clayton } 16681b654882SGreg Clayton else if ((::strncmp (var_name_begin, "name}", strlen("name}")) == 0) || 16691b654882SGreg Clayton (::strncmp (var_name_begin, "file.basename}", strlen("file.basename}")) == 0) || 16701b654882SGreg Clayton (::strncmp (var_name_begin, "file.fullpath}", strlen("file.fullpath}")) == 0)) 16711b654882SGreg Clayton { 1672c14ee32dSGreg Clayton Module *exe_module = process->GetTarget().GetExecutableModulePointer(); 1673aa149cbdSGreg Clayton if (exe_module) 16741b654882SGreg Clayton { 16751b654882SGreg Clayton if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f') 16761b654882SGreg Clayton { 1677aa149cbdSGreg Clayton format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename(); 16781b654882SGreg Clayton var_success = format_file_spec; 16791b654882SGreg Clayton } 16801b654882SGreg Clayton else 16811b654882SGreg Clayton { 1682aa149cbdSGreg Clayton format_file_spec = exe_module->GetFileSpec(); 16831b654882SGreg Clayton var_success = format_file_spec; 16841b654882SGreg Clayton } 16851b654882SGreg Clayton } 16861b654882SGreg Clayton } 16871b654882SGreg Clayton } 16881b654882SGreg Clayton } 1689c14ee32dSGreg Clayton } 16901b654882SGreg Clayton break; 16911b654882SGreg Clayton 16921b654882SGreg Clayton case 't': 16931b654882SGreg Clayton if (::strncmp (var_name_begin, "thread.", strlen("thread.")) == 0) 16941b654882SGreg Clayton { 1695c14ee32dSGreg Clayton if (exe_ctx) 1696c14ee32dSGreg Clayton { 1697c14ee32dSGreg Clayton Thread *thread = exe_ctx->GetThreadPtr(); 1698c14ee32dSGreg Clayton if (thread) 16991b654882SGreg Clayton { 17001b654882SGreg Clayton var_name_begin += ::strlen ("thread."); 17011b654882SGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 17021b654882SGreg Clayton { 170381c22f61SGreg Clayton s.Printf("0x%4.4llx", thread->GetID()); 17041b654882SGreg Clayton var_success = true; 17051b654882SGreg Clayton } 17061b654882SGreg Clayton else if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) 17071b654882SGreg Clayton { 1708c14ee32dSGreg Clayton s.Printf("%u", thread->GetIndexID()); 17091b654882SGreg Clayton var_success = true; 17101b654882SGreg Clayton } 17111b654882SGreg Clayton else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) 17121b654882SGreg Clayton { 1713c14ee32dSGreg Clayton cstr = thread->GetName(); 17141b654882SGreg Clayton var_success = cstr && cstr[0]; 17151b654882SGreg Clayton if (var_success) 17161b654882SGreg Clayton s.PutCString(cstr); 17171b654882SGreg Clayton } 17181b654882SGreg Clayton else if (::strncmp (var_name_begin, "queue}", strlen("queue}")) == 0) 17191b654882SGreg Clayton { 1720c14ee32dSGreg Clayton cstr = thread->GetQueueName(); 17211b654882SGreg Clayton var_success = cstr && cstr[0]; 17221b654882SGreg Clayton if (var_success) 17231b654882SGreg Clayton s.PutCString(cstr); 17241b654882SGreg Clayton } 17251b654882SGreg Clayton else if (::strncmp (var_name_begin, "stop-reason}", strlen("stop-reason}")) == 0) 17261b654882SGreg Clayton { 1727c14ee32dSGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo (); 1728b15bfc75SJim Ingham if (stop_info_sp) 17291b654882SGreg Clayton { 1730b15bfc75SJim Ingham cstr = stop_info_sp->GetDescription(); 17311b654882SGreg Clayton if (cstr && cstr[0]) 17321b654882SGreg Clayton { 17331b654882SGreg Clayton s.PutCString(cstr); 17341b654882SGreg Clayton var_success = true; 17351b654882SGreg Clayton } 17361b654882SGreg Clayton } 17371b654882SGreg Clayton } 173873ca05a2SJim Ingham else if (::strncmp (var_name_begin, "return-value}", strlen("return-value}")) == 0) 173973ca05a2SJim Ingham { 174073ca05a2SJim Ingham StopInfoSP stop_info_sp = thread->GetStopInfo (); 174173ca05a2SJim Ingham if (stop_info_sp) 174273ca05a2SJim Ingham { 174373ca05a2SJim Ingham ValueObjectSP return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp); 174473ca05a2SJim Ingham if (return_valobj_sp) 174573ca05a2SJim Ingham { 1746ef651600SJim Ingham ValueObject::DumpValueObjectOptions dump_options; 1747ef651600SJim Ingham ValueObject::DumpValueObject (s, return_valobj_sp.get(), dump_options); 174873ca05a2SJim Ingham var_success = true; 174973ca05a2SJim Ingham } 175073ca05a2SJim Ingham } 175173ca05a2SJim Ingham } 175273ca05a2SJim Ingham } 17531b654882SGreg Clayton } 17541b654882SGreg Clayton } 17551b654882SGreg Clayton else if (::strncmp (var_name_begin, "target.", strlen("target.")) == 0) 17561b654882SGreg Clayton { 17570603aa9dSGreg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 17580603aa9dSGreg Clayton if (target) 17591b654882SGreg Clayton { 17601b654882SGreg Clayton var_name_begin += ::strlen ("target."); 17611b654882SGreg Clayton if (::strncmp (var_name_begin, "arch}", strlen("arch}")) == 0) 17621b654882SGreg Clayton { 17631b654882SGreg Clayton ArchSpec arch (target->GetArchitecture ()); 17641b654882SGreg Clayton if (arch.IsValid()) 17651b654882SGreg Clayton { 176664195a2cSGreg Clayton s.PutCString (arch.GetArchitectureName()); 17671b654882SGreg Clayton var_success = true; 17681b654882SGreg Clayton } 17691b654882SGreg Clayton } 17701b654882SGreg Clayton } 17711b654882SGreg Clayton } 17721b654882SGreg Clayton break; 17731b654882SGreg Clayton 17741b654882SGreg Clayton 17751b654882SGreg Clayton case 'm': 17761b654882SGreg Clayton if (::strncmp (var_name_begin, "module.", strlen("module.")) == 0) 17771b654882SGreg Clayton { 17780603aa9dSGreg Clayton if (sc && sc->module_sp.get()) 17791b654882SGreg Clayton { 17800603aa9dSGreg Clayton Module *module = sc->module_sp.get(); 17811b654882SGreg Clayton var_name_begin += ::strlen ("module."); 17821b654882SGreg Clayton 17831b654882SGreg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 17841b654882SGreg Clayton { 17851b654882SGreg Clayton if (module->GetFileSpec()) 17861b654882SGreg Clayton { 17871b654882SGreg Clayton var_name_begin += ::strlen ("file."); 17881b654882SGreg Clayton 17891b654882SGreg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 17901b654882SGreg Clayton { 17911b654882SGreg Clayton format_file_spec.GetFilename() = module->GetFileSpec().GetFilename(); 17921b654882SGreg Clayton var_success = format_file_spec; 17931b654882SGreg Clayton } 17941b654882SGreg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 17951b654882SGreg Clayton { 17961b654882SGreg Clayton format_file_spec = module->GetFileSpec(); 17971b654882SGreg Clayton var_success = format_file_spec; 17981b654882SGreg Clayton } 17991b654882SGreg Clayton } 18001b654882SGreg Clayton } 18011b654882SGreg Clayton } 18021b654882SGreg Clayton } 18031b654882SGreg Clayton break; 18041b654882SGreg Clayton 18051b654882SGreg Clayton 18061b654882SGreg Clayton case 'f': 18071b654882SGreg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 18081b654882SGreg Clayton { 18091b654882SGreg Clayton if (sc && sc->comp_unit != NULL) 18101b654882SGreg Clayton { 18111b654882SGreg Clayton var_name_begin += ::strlen ("file."); 18121b654882SGreg Clayton 18131b654882SGreg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 18141b654882SGreg Clayton { 18151b654882SGreg Clayton format_file_spec.GetFilename() = sc->comp_unit->GetFilename(); 18161b654882SGreg Clayton var_success = format_file_spec; 18171b654882SGreg Clayton } 18181b654882SGreg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 18191b654882SGreg Clayton { 18201b654882SGreg Clayton format_file_spec = *sc->comp_unit; 18211b654882SGreg Clayton var_success = format_file_spec; 18221b654882SGreg Clayton } 18231b654882SGreg Clayton } 18241b654882SGreg Clayton } 18251b654882SGreg Clayton else if (::strncmp (var_name_begin, "frame.", strlen("frame.")) == 0) 18261b654882SGreg Clayton { 1827c14ee32dSGreg Clayton if (exe_ctx) 1828c14ee32dSGreg Clayton { 1829c14ee32dSGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 1830c14ee32dSGreg Clayton if (frame) 18311b654882SGreg Clayton { 18321b654882SGreg Clayton var_name_begin += ::strlen ("frame."); 18331b654882SGreg Clayton if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) 18341b654882SGreg Clayton { 1835c14ee32dSGreg Clayton s.Printf("%u", frame->GetFrameIndex()); 18361b654882SGreg Clayton var_success = true; 18371b654882SGreg Clayton } 18381b654882SGreg Clayton else if (::strncmp (var_name_begin, "pc}", strlen("pc}")) == 0) 18391b654882SGreg Clayton { 18401b654882SGreg Clayton reg_kind = eRegisterKindGeneric; 18411b654882SGreg Clayton reg_num = LLDB_REGNUM_GENERIC_PC; 18421b654882SGreg Clayton var_success = true; 18431b654882SGreg Clayton } 18441b654882SGreg Clayton else if (::strncmp (var_name_begin, "sp}", strlen("sp}")) == 0) 18451b654882SGreg Clayton { 18461b654882SGreg Clayton reg_kind = eRegisterKindGeneric; 18471b654882SGreg Clayton reg_num = LLDB_REGNUM_GENERIC_SP; 18481b654882SGreg Clayton var_success = true; 18491b654882SGreg Clayton } 18501b654882SGreg Clayton else if (::strncmp (var_name_begin, "fp}", strlen("fp}")) == 0) 18511b654882SGreg Clayton { 18521b654882SGreg Clayton reg_kind = eRegisterKindGeneric; 18531b654882SGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FP; 18541b654882SGreg Clayton var_success = true; 18551b654882SGreg Clayton } 18561b654882SGreg Clayton else if (::strncmp (var_name_begin, "flags}", strlen("flags}")) == 0) 18571b654882SGreg Clayton { 18581b654882SGreg Clayton reg_kind = eRegisterKindGeneric; 18591b654882SGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FLAGS; 18601b654882SGreg Clayton var_success = true; 18611b654882SGreg Clayton } 18621b654882SGreg Clayton else if (::strncmp (var_name_begin, "reg.", strlen ("reg.")) == 0) 18631b654882SGreg Clayton { 1864c14ee32dSGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 18651b654882SGreg Clayton if (reg_ctx) 18661b654882SGreg Clayton { 18671b654882SGreg Clayton var_name_begin += ::strlen ("reg."); 18681b654882SGreg Clayton if (var_name_begin < var_name_end) 18691b654882SGreg Clayton { 18701b654882SGreg Clayton std::string reg_name (var_name_begin, var_name_end); 18711b654882SGreg Clayton reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str()); 18721b654882SGreg Clayton if (reg_info) 18731b654882SGreg Clayton var_success = true; 18741b654882SGreg Clayton } 18751b654882SGreg Clayton } 18761b654882SGreg Clayton } 18771b654882SGreg Clayton } 18781b654882SGreg Clayton } 1879c14ee32dSGreg Clayton } 18801b654882SGreg Clayton else if (::strncmp (var_name_begin, "function.", strlen("function.")) == 0) 18811b654882SGreg Clayton { 18821b654882SGreg Clayton if (sc && (sc->function != NULL || sc->symbol != NULL)) 18831b654882SGreg Clayton { 18841b654882SGreg Clayton var_name_begin += ::strlen ("function."); 18851b654882SGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 18861b654882SGreg Clayton { 18871b654882SGreg Clayton if (sc->function) 188881c22f61SGreg Clayton s.Printf("function{0x%8.8llx}", sc->function->GetID()); 18891b654882SGreg Clayton else 18901b654882SGreg Clayton s.Printf("symbol[%u]", sc->symbol->GetID()); 18911b654882SGreg Clayton 18921b654882SGreg Clayton var_success = true; 18931b654882SGreg Clayton } 18941b654882SGreg Clayton else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) 18951b654882SGreg Clayton { 18961b654882SGreg Clayton if (sc->function) 18971b654882SGreg Clayton cstr = sc->function->GetName().AsCString (NULL); 18981b654882SGreg Clayton else if (sc->symbol) 18991b654882SGreg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 19001b654882SGreg Clayton if (cstr) 19011b654882SGreg Clayton { 19021b654882SGreg Clayton s.PutCString(cstr); 19030d9c9934SGreg Clayton 19040d9c9934SGreg Clayton if (sc->block) 19050d9c9934SGreg Clayton { 19060d9c9934SGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 19070d9c9934SGreg Clayton if (inline_block) 19080d9c9934SGreg Clayton { 19090d9c9934SGreg Clayton const InlineFunctionInfo *inline_info = sc->block->GetInlinedFunctionInfo(); 19100d9c9934SGreg Clayton if (inline_info) 19110d9c9934SGreg Clayton { 19120d9c9934SGreg Clayton s.PutCString(" [inlined] "); 19130d9c9934SGreg Clayton inline_info->GetName().Dump(&s); 19140d9c9934SGreg Clayton } 19150d9c9934SGreg Clayton } 19160d9c9934SGreg Clayton } 19171b654882SGreg Clayton var_success = true; 19181b654882SGreg Clayton } 19191b654882SGreg Clayton } 19206d3dbf51SGreg Clayton else if (::strncmp (var_name_begin, "name-with-args}", strlen("name-with-args}")) == 0) 19216d3dbf51SGreg Clayton { 19226d3dbf51SGreg Clayton // Print the function name with arguments in it 19236d3dbf51SGreg Clayton 19246d3dbf51SGreg Clayton if (sc->function) 19256d3dbf51SGreg Clayton { 19266d3dbf51SGreg Clayton var_success = true; 19276d3dbf51SGreg Clayton ExecutionContextScope *exe_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL; 19286d3dbf51SGreg Clayton cstr = sc->function->GetName().AsCString (NULL); 19296d3dbf51SGreg Clayton if (cstr) 19306d3dbf51SGreg Clayton { 19316d3dbf51SGreg Clayton const InlineFunctionInfo *inline_info = NULL; 19326d3dbf51SGreg Clayton VariableListSP variable_list_sp; 19336d3dbf51SGreg Clayton bool get_function_vars = true; 19346d3dbf51SGreg Clayton if (sc->block) 19356d3dbf51SGreg Clayton { 19366d3dbf51SGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 19376d3dbf51SGreg Clayton 19386d3dbf51SGreg Clayton if (inline_block) 19396d3dbf51SGreg Clayton { 19406d3dbf51SGreg Clayton get_function_vars = false; 19416d3dbf51SGreg Clayton inline_info = sc->block->GetInlinedFunctionInfo(); 19426d3dbf51SGreg Clayton if (inline_info) 19436d3dbf51SGreg Clayton variable_list_sp = inline_block->GetBlockVariableList (true); 19446d3dbf51SGreg Clayton } 19456d3dbf51SGreg Clayton } 19466d3dbf51SGreg Clayton 19476d3dbf51SGreg Clayton if (get_function_vars) 19486d3dbf51SGreg Clayton { 19496d3dbf51SGreg Clayton variable_list_sp = sc->function->GetBlock(true).GetBlockVariableList (true); 19506d3dbf51SGreg Clayton } 19516d3dbf51SGreg Clayton 19526d3dbf51SGreg Clayton if (inline_info) 19536d3dbf51SGreg Clayton { 19546d3dbf51SGreg Clayton s.PutCString (cstr); 19556d3dbf51SGreg Clayton s.PutCString (" [inlined] "); 19566d3dbf51SGreg Clayton cstr = inline_info->GetName().GetCString(); 19576d3dbf51SGreg Clayton } 19586d3dbf51SGreg Clayton 19596d3dbf51SGreg Clayton VariableList args; 19606d3dbf51SGreg Clayton if (variable_list_sp) 19616d3dbf51SGreg Clayton { 19626d3dbf51SGreg Clayton const size_t num_variables = variable_list_sp->GetSize(); 19636d3dbf51SGreg Clayton for (size_t var_idx = 0; var_idx < num_variables; ++var_idx) 19646d3dbf51SGreg Clayton { 19656d3dbf51SGreg Clayton VariableSP var_sp (variable_list_sp->GetVariableAtIndex(var_idx)); 19666d3dbf51SGreg Clayton if (var_sp->GetScope() == eValueTypeVariableArgument) 19676d3dbf51SGreg Clayton args.AddVariable (var_sp); 19686d3dbf51SGreg Clayton } 19696d3dbf51SGreg Clayton 19706d3dbf51SGreg Clayton } 19716d3dbf51SGreg Clayton if (args.GetSize() > 0) 19726d3dbf51SGreg Clayton { 19736d3dbf51SGreg Clayton const char *open_paren = strchr (cstr, '('); 19746d3dbf51SGreg Clayton const char *close_paren = NULL; 19756d3dbf51SGreg Clayton if (open_paren) 19766d3dbf51SGreg Clayton close_paren = strchr (open_paren, ')'); 19776d3dbf51SGreg Clayton 19786d3dbf51SGreg Clayton if (open_paren) 19796d3dbf51SGreg Clayton s.Write(cstr, open_paren - cstr + 1); 19806d3dbf51SGreg Clayton else 19816d3dbf51SGreg Clayton { 19826d3dbf51SGreg Clayton s.PutCString (cstr); 19836d3dbf51SGreg Clayton s.PutChar ('('); 19846d3dbf51SGreg Clayton } 19855b6889b1SGreg Clayton const size_t num_args = args.GetSize(); 19866d3dbf51SGreg Clayton for (size_t arg_idx = 0; arg_idx < num_args; ++arg_idx) 19876d3dbf51SGreg Clayton { 19886d3dbf51SGreg Clayton VariableSP var_sp (args.GetVariableAtIndex (arg_idx)); 19896d3dbf51SGreg Clayton ValueObjectSP var_value_sp (ValueObjectVariable::Create (exe_scope, var_sp)); 19906d3dbf51SGreg Clayton const char *var_name = var_value_sp->GetName().GetCString(); 19916d3dbf51SGreg Clayton const char *var_value = var_value_sp->GetValueAsCString(); 19926d3dbf51SGreg Clayton if (var_value_sp->GetError().Success()) 19936d3dbf51SGreg Clayton { 19946d3dbf51SGreg Clayton if (arg_idx > 0) 19956d3dbf51SGreg Clayton s.PutCString (", "); 19966d3dbf51SGreg Clayton s.Printf ("%s=%s", var_name, var_value); 19976d3dbf51SGreg Clayton } 19986d3dbf51SGreg Clayton } 19996d3dbf51SGreg Clayton 20006d3dbf51SGreg Clayton if (close_paren) 20016d3dbf51SGreg Clayton s.PutCString (close_paren); 20026d3dbf51SGreg Clayton else 20036d3dbf51SGreg Clayton s.PutChar(')'); 20046d3dbf51SGreg Clayton 20056d3dbf51SGreg Clayton } 20066d3dbf51SGreg Clayton else 20076d3dbf51SGreg Clayton { 20086d3dbf51SGreg Clayton s.PutCString(cstr); 20096d3dbf51SGreg Clayton } 20106d3dbf51SGreg Clayton } 20116d3dbf51SGreg Clayton } 20126d3dbf51SGreg Clayton else if (sc->symbol) 20136d3dbf51SGreg Clayton { 20146d3dbf51SGreg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 20156d3dbf51SGreg Clayton if (cstr) 20166d3dbf51SGreg Clayton { 20176d3dbf51SGreg Clayton s.PutCString(cstr); 20186d3dbf51SGreg Clayton var_success = true; 20196d3dbf51SGreg Clayton } 20206d3dbf51SGreg Clayton } 20216d3dbf51SGreg Clayton } 20221b654882SGreg Clayton else if (::strncmp (var_name_begin, "addr-offset}", strlen("addr-offset}")) == 0) 20231b654882SGreg Clayton { 20241b654882SGreg Clayton var_success = addr != NULL; 20251b654882SGreg Clayton if (var_success) 20261b654882SGreg Clayton { 20271b654882SGreg Clayton format_addr = *addr; 20281b654882SGreg Clayton calculate_format_addr_function_offset = true; 20291b654882SGreg Clayton } 20301b654882SGreg Clayton } 20311b654882SGreg Clayton else if (::strncmp (var_name_begin, "line-offset}", strlen("line-offset}")) == 0) 20321b654882SGreg Clayton { 20331b654882SGreg Clayton var_success = sc->line_entry.range.GetBaseAddress().IsValid(); 20341b654882SGreg Clayton if (var_success) 20351b654882SGreg Clayton { 20361b654882SGreg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 20371b654882SGreg Clayton calculate_format_addr_function_offset = true; 20381b654882SGreg Clayton } 20391b654882SGreg Clayton } 20401b654882SGreg Clayton else if (::strncmp (var_name_begin, "pc-offset}", strlen("pc-offset}")) == 0) 20411b654882SGreg Clayton { 2042c14ee32dSGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2043c14ee32dSGreg Clayton var_success = frame != NULL; 20441b654882SGreg Clayton if (var_success) 20451b654882SGreg Clayton { 2046c14ee32dSGreg Clayton format_addr = frame->GetFrameCodeAddress(); 20471b654882SGreg Clayton calculate_format_addr_function_offset = true; 20481b654882SGreg Clayton } 20491b654882SGreg Clayton } 20501b654882SGreg Clayton } 20511b654882SGreg Clayton } 20521b654882SGreg Clayton break; 20531b654882SGreg Clayton 20541b654882SGreg Clayton case 'l': 20551b654882SGreg Clayton if (::strncmp (var_name_begin, "line.", strlen("line.")) == 0) 20561b654882SGreg Clayton { 20571b654882SGreg Clayton if (sc && sc->line_entry.IsValid()) 20581b654882SGreg Clayton { 20591b654882SGreg Clayton var_name_begin += ::strlen ("line."); 20601b654882SGreg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 20611b654882SGreg Clayton { 20621b654882SGreg Clayton var_name_begin += ::strlen ("file."); 20631b654882SGreg Clayton 20641b654882SGreg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 20651b654882SGreg Clayton { 20661b654882SGreg Clayton format_file_spec.GetFilename() = sc->line_entry.file.GetFilename(); 20671b654882SGreg Clayton var_success = format_file_spec; 20681b654882SGreg Clayton } 20691b654882SGreg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 20701b654882SGreg Clayton { 20711b654882SGreg Clayton format_file_spec = sc->line_entry.file; 20721b654882SGreg Clayton var_success = format_file_spec; 20731b654882SGreg Clayton } 20741b654882SGreg Clayton } 20751b654882SGreg Clayton else if (::strncmp (var_name_begin, "number}", strlen("number}")) == 0) 20761b654882SGreg Clayton { 20771b654882SGreg Clayton var_success = true; 20781b654882SGreg Clayton s.Printf("%u", sc->line_entry.line); 20791b654882SGreg Clayton } 20801b654882SGreg Clayton else if ((::strncmp (var_name_begin, "start-addr}", strlen("start-addr}")) == 0) || 20811b654882SGreg Clayton (::strncmp (var_name_begin, "end-addr}", strlen("end-addr}")) == 0)) 20821b654882SGreg Clayton { 20831b654882SGreg Clayton var_success = sc && sc->line_entry.range.GetBaseAddress().IsValid(); 20841b654882SGreg Clayton if (var_success) 20851b654882SGreg Clayton { 20861b654882SGreg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 20871b654882SGreg Clayton if (var_name_begin[0] == 'e') 20881b654882SGreg Clayton format_addr.Slide (sc->line_entry.range.GetByteSize()); 20891b654882SGreg Clayton } 20901b654882SGreg Clayton } 20911b654882SGreg Clayton } 20921b654882SGreg Clayton } 20931b654882SGreg Clayton break; 20941b654882SGreg Clayton } 20951b654882SGreg Clayton 20961b654882SGreg Clayton if (var_success) 20971b654882SGreg Clayton { 20981b654882SGreg Clayton // If format addr is valid, then we need to print an address 20991b654882SGreg Clayton if (reg_num != LLDB_INVALID_REGNUM) 21001b654882SGreg Clayton { 2101c14ee32dSGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 21021b654882SGreg Clayton // We have a register value to display... 21031b654882SGreg Clayton if (reg_num == LLDB_REGNUM_GENERIC_PC && reg_kind == eRegisterKindGeneric) 21041b654882SGreg Clayton { 2105c14ee32dSGreg Clayton format_addr = frame->GetFrameCodeAddress(); 21061b654882SGreg Clayton } 21071b654882SGreg Clayton else 21081b654882SGreg Clayton { 21091b654882SGreg Clayton if (reg_ctx == NULL) 2110c14ee32dSGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 21111b654882SGreg Clayton 21121b654882SGreg Clayton if (reg_ctx) 21131b654882SGreg Clayton { 21141b654882SGreg Clayton if (reg_kind != kNumRegisterKinds) 21151b654882SGreg Clayton reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(reg_kind, reg_num); 21161b654882SGreg Clayton reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_num); 21171b654882SGreg Clayton var_success = reg_info != NULL; 21181b654882SGreg Clayton } 21191b654882SGreg Clayton } 21201b654882SGreg Clayton } 21211b654882SGreg Clayton 21221b654882SGreg Clayton if (reg_info != NULL) 21231b654882SGreg Clayton { 21247349bd90SGreg Clayton RegisterValue reg_value; 21257349bd90SGreg Clayton var_success = reg_ctx->ReadRegister (reg_info, reg_value); 21267349bd90SGreg Clayton if (var_success) 21271b654882SGreg Clayton { 21289a8fa916SGreg Clayton reg_value.Dump(&s, reg_info, false, false, eFormatDefault); 21291b654882SGreg Clayton } 21301b654882SGreg Clayton } 21311b654882SGreg Clayton 21321b654882SGreg Clayton if (format_file_spec) 21331b654882SGreg Clayton { 21341b654882SGreg Clayton s << format_file_spec; 21351b654882SGreg Clayton } 21361b654882SGreg Clayton 21371b654882SGreg Clayton // If format addr is valid, then we need to print an address 21381b654882SGreg Clayton if (format_addr.IsValid()) 21391b654882SGreg Clayton { 21400603aa9dSGreg Clayton var_success = false; 21410603aa9dSGreg Clayton 21421b654882SGreg Clayton if (calculate_format_addr_function_offset) 21431b654882SGreg Clayton { 21441b654882SGreg Clayton Address func_addr; 21450603aa9dSGreg Clayton 21460603aa9dSGreg Clayton if (sc) 21470603aa9dSGreg Clayton { 21481b654882SGreg Clayton if (sc->function) 21490d9c9934SGreg Clayton { 21501b654882SGreg Clayton func_addr = sc->function->GetAddressRange().GetBaseAddress(); 21510d9c9934SGreg Clayton if (sc->block) 21520d9c9934SGreg Clayton { 21530d9c9934SGreg Clayton // Check to make sure we aren't in an inline 21540d9c9934SGreg Clayton // function. If we are, use the inline block 21550d9c9934SGreg Clayton // range that contains "format_addr" since 21560d9c9934SGreg Clayton // blocks can be discontiguous. 21570d9c9934SGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 21580d9c9934SGreg Clayton AddressRange inline_range; 21590d9c9934SGreg Clayton if (inline_block && inline_block->GetRangeContainingAddress (format_addr, inline_range)) 21600d9c9934SGreg Clayton func_addr = inline_range.GetBaseAddress(); 21610d9c9934SGreg Clayton } 21620d9c9934SGreg Clayton } 21631b654882SGreg Clayton else if (sc->symbol && sc->symbol->GetAddressRangePtr()) 21641b654882SGreg Clayton func_addr = sc->symbol->GetAddressRangePtr()->GetBaseAddress(); 21650603aa9dSGreg Clayton } 21661b654882SGreg Clayton 21670603aa9dSGreg Clayton if (func_addr.IsValid()) 21681b654882SGreg Clayton { 21691b654882SGreg Clayton if (func_addr.GetSection() == format_addr.GetSection()) 21701b654882SGreg Clayton { 21711b654882SGreg Clayton addr_t func_file_addr = func_addr.GetFileAddress(); 21721b654882SGreg Clayton addr_t addr_file_addr = format_addr.GetFileAddress(); 21731b654882SGreg Clayton if (addr_file_addr > func_file_addr) 21741b654882SGreg Clayton s.Printf(" + %llu", addr_file_addr - func_file_addr); 21751b654882SGreg Clayton else if (addr_file_addr < func_file_addr) 21761b654882SGreg Clayton s.Printf(" - %llu", func_file_addr - addr_file_addr); 21770603aa9dSGreg Clayton var_success = true; 21781b654882SGreg Clayton } 21791b654882SGreg Clayton else 21800603aa9dSGreg Clayton { 21810603aa9dSGreg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 21820603aa9dSGreg Clayton if (target) 21830603aa9dSGreg Clayton { 21840603aa9dSGreg Clayton addr_t func_load_addr = func_addr.GetLoadAddress (target); 21850603aa9dSGreg Clayton addr_t addr_load_addr = format_addr.GetLoadAddress (target); 21860603aa9dSGreg Clayton if (addr_load_addr > func_load_addr) 21870603aa9dSGreg Clayton s.Printf(" + %llu", addr_load_addr - func_load_addr); 21880603aa9dSGreg Clayton else if (addr_load_addr < func_load_addr) 21890603aa9dSGreg Clayton s.Printf(" - %llu", func_load_addr - addr_load_addr); 21900603aa9dSGreg Clayton var_success = true; 21910603aa9dSGreg Clayton } 21920603aa9dSGreg Clayton } 21931b654882SGreg Clayton } 21941b654882SGreg Clayton } 21951b654882SGreg Clayton else 21961b654882SGreg Clayton { 21970603aa9dSGreg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 21981b654882SGreg Clayton addr_t vaddr = LLDB_INVALID_ADDRESS; 21990603aa9dSGreg Clayton if (exe_ctx && !target->GetSectionLoadList().IsEmpty()) 22000603aa9dSGreg Clayton vaddr = format_addr.GetLoadAddress (target); 22011b654882SGreg Clayton if (vaddr == LLDB_INVALID_ADDRESS) 22021b654882SGreg Clayton vaddr = format_addr.GetFileAddress (); 22031b654882SGreg Clayton 22041b654882SGreg Clayton if (vaddr != LLDB_INVALID_ADDRESS) 22050603aa9dSGreg Clayton { 2206514487e8SGreg Clayton int addr_width = target->GetArchitecture().GetAddressByteSize() * 2; 220735f1a0d5SGreg Clayton if (addr_width == 0) 220835f1a0d5SGreg Clayton addr_width = 16; 220935f1a0d5SGreg Clayton s.Printf("0x%*.*llx", addr_width, addr_width, vaddr); 22100603aa9dSGreg Clayton var_success = true; 22110603aa9dSGreg Clayton } 22121b654882SGreg Clayton } 22131b654882SGreg Clayton } 22141b654882SGreg Clayton } 22151b654882SGreg Clayton 22161b654882SGreg Clayton if (var_success == false) 22171b654882SGreg Clayton success = false; 22181b654882SGreg Clayton } 22191b654882SGreg Clayton p = var_name_end; 22201b654882SGreg Clayton } 22211b654882SGreg Clayton else 22221b654882SGreg Clayton break; 22231b654882SGreg Clayton } 22241b654882SGreg Clayton else 22251b654882SGreg Clayton { 22261b654882SGreg Clayton // We got a dollar sign with no '{' after it, it must just be a dollar sign 22271b654882SGreg Clayton s.PutChar(*p); 22281b654882SGreg Clayton } 22291b654882SGreg Clayton } 22301b654882SGreg Clayton else if (*p == '\\') 22311b654882SGreg Clayton { 22321b654882SGreg Clayton ++p; // skip the slash 22331b654882SGreg Clayton switch (*p) 22341b654882SGreg Clayton { 22351b654882SGreg Clayton case 'a': s.PutChar ('\a'); break; 22361b654882SGreg Clayton case 'b': s.PutChar ('\b'); break; 22371b654882SGreg Clayton case 'f': s.PutChar ('\f'); break; 22381b654882SGreg Clayton case 'n': s.PutChar ('\n'); break; 22391b654882SGreg Clayton case 'r': s.PutChar ('\r'); break; 22401b654882SGreg Clayton case 't': s.PutChar ('\t'); break; 22411b654882SGreg Clayton case 'v': s.PutChar ('\v'); break; 22421b654882SGreg Clayton case '\'': s.PutChar ('\''); break; 22431b654882SGreg Clayton case '\\': s.PutChar ('\\'); break; 22441b654882SGreg Clayton case '0': 22451b654882SGreg Clayton // 1 to 3 octal chars 22461b654882SGreg Clayton { 22470603aa9dSGreg Clayton // Make a string that can hold onto the initial zero char, 22480603aa9dSGreg Clayton // up to 3 octal digits, and a terminating NULL. 22490603aa9dSGreg Clayton char oct_str[5] = { 0, 0, 0, 0, 0 }; 22500603aa9dSGreg Clayton 22510603aa9dSGreg Clayton int i; 22520603aa9dSGreg Clayton for (i=0; (p[i] >= '0' && p[i] <= '7') && i<4; ++i) 22530603aa9dSGreg Clayton oct_str[i] = p[i]; 22540603aa9dSGreg Clayton 22550603aa9dSGreg Clayton // We don't want to consume the last octal character since 22560603aa9dSGreg Clayton // the main for loop will do this for us, so we advance p by 22570603aa9dSGreg Clayton // one less than i (even if i is zero) 22580603aa9dSGreg Clayton p += i - 1; 22590603aa9dSGreg Clayton unsigned long octal_value = ::strtoul (oct_str, NULL, 8); 22600603aa9dSGreg Clayton if (octal_value <= UINT8_MAX) 22611b654882SGreg Clayton { 22620603aa9dSGreg Clayton char octal_char = octal_value; 22630603aa9dSGreg Clayton s.Write (&octal_char, 1); 22641b654882SGreg Clayton } 22651b654882SGreg Clayton } 22661b654882SGreg Clayton break; 22671b654882SGreg Clayton 22681b654882SGreg Clayton case 'x': 22691b654882SGreg Clayton // hex number in the format 22700603aa9dSGreg Clayton if (isxdigit(p[1])) 22711b654882SGreg Clayton { 22720603aa9dSGreg Clayton ++p; // Skip the 'x' 22731b654882SGreg Clayton 22740603aa9dSGreg Clayton // Make a string that can hold onto two hex chars plus a 22750603aa9dSGreg Clayton // NULL terminator 22761b654882SGreg Clayton char hex_str[3] = { 0,0,0 }; 22771b654882SGreg Clayton hex_str[0] = *p; 22780603aa9dSGreg Clayton if (isxdigit(p[1])) 22790603aa9dSGreg Clayton { 22800603aa9dSGreg Clayton ++p; // Skip the first of the two hex chars 22811b654882SGreg Clayton hex_str[1] = *p; 22820603aa9dSGreg Clayton } 22830603aa9dSGreg Clayton 22841b654882SGreg Clayton unsigned long hex_value = strtoul (hex_str, NULL, 16); 22850603aa9dSGreg Clayton if (hex_value <= UINT8_MAX) 22861b654882SGreg Clayton s.PutChar (hex_value); 22871b654882SGreg Clayton } 22881b654882SGreg Clayton else 22891b654882SGreg Clayton { 22900603aa9dSGreg Clayton s.PutChar('x'); 22911b654882SGreg Clayton } 22921b654882SGreg Clayton break; 22931b654882SGreg Clayton 22941b654882SGreg Clayton default: 22950603aa9dSGreg Clayton // Just desensitize any other character by just printing what 22960603aa9dSGreg Clayton // came after the '\' 22970603aa9dSGreg Clayton s << *p; 22981b654882SGreg Clayton break; 22991b654882SGreg Clayton 23001b654882SGreg Clayton } 23011b654882SGreg Clayton 23021b654882SGreg Clayton } 23031b654882SGreg Clayton } 23041b654882SGreg Clayton if (end) 23051b654882SGreg Clayton *end = p; 23061b654882SGreg Clayton return success; 23071b654882SGreg Clayton } 23081b654882SGreg Clayton 23091b654882SGreg Clayton #pragma mark Debugger::SettingsController 23101b654882SGreg Clayton 23113df9a8dfSCaroline Tice //-------------------------------------------------- 23121b654882SGreg Clayton // class Debugger::SettingsController 23133df9a8dfSCaroline Tice //-------------------------------------------------- 23143df9a8dfSCaroline Tice 23151b654882SGreg Clayton Debugger::SettingsController::SettingsController () : 23164d122c40SGreg Clayton UserSettingsController ("", UserSettingsControllerSP()) 23173df9a8dfSCaroline Tice { 23183df9a8dfSCaroline Tice } 23193df9a8dfSCaroline Tice 23201b654882SGreg Clayton Debugger::SettingsController::~SettingsController () 23213df9a8dfSCaroline Tice { 23223df9a8dfSCaroline Tice } 23233df9a8dfSCaroline Tice 23243df9a8dfSCaroline Tice 23254d122c40SGreg Clayton InstanceSettingsSP 23261b654882SGreg Clayton Debugger::SettingsController::CreateInstanceSettings (const char *instance_name) 23273df9a8dfSCaroline Tice { 2328b9556accSGreg Clayton InstanceSettingsSP new_settings_sp (new DebuggerInstanceSettings (GetSettingsController(), 2329b9556accSGreg Clayton false, 2330b9556accSGreg Clayton instance_name)); 23313df9a8dfSCaroline Tice return new_settings_sp; 23323df9a8dfSCaroline Tice } 23333df9a8dfSCaroline Tice 23341b654882SGreg Clayton #pragma mark DebuggerInstanceSettings 23353df9a8dfSCaroline Tice //-------------------------------------------------- 23363df9a8dfSCaroline Tice // class DebuggerInstanceSettings 23373df9a8dfSCaroline Tice //-------------------------------------------------- 23383df9a8dfSCaroline Tice 2339a7015092SGreg Clayton DebuggerInstanceSettings::DebuggerInstanceSettings 2340a7015092SGreg Clayton ( 2341b9556accSGreg Clayton const UserSettingsControllerSP &m_owner_sp, 2342a7015092SGreg Clayton bool live_instance, 2343a7015092SGreg Clayton const char *name 2344a7015092SGreg Clayton ) : 2345b9556accSGreg Clayton InstanceSettings (m_owner_sp, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance), 2346a7015092SGreg Clayton m_term_width (80), 2347e372b98dSGreg Clayton m_stop_source_before_count (3), 2348e372b98dSGreg Clayton m_stop_source_after_count (3), 2349e372b98dSGreg Clayton m_stop_disassembly_count (4), 2350e372b98dSGreg Clayton m_stop_disassembly_display (eStopDisassemblyTypeNoSource), 23513df9a8dfSCaroline Tice m_prompt (), 23520603aa9dSGreg Clayton m_frame_format (), 23530603aa9dSGreg Clayton m_thread_format (), 2354daccaa9eSCaroline Tice m_script_lang (), 23553bcdb29cSJim Ingham m_use_external_editor (false), 23563bcdb29cSJim Ingham m_auto_confirm_on (false) 23573df9a8dfSCaroline Tice { 2358f20e8239SCaroline Tice // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called 2359f20e8239SCaroline Tice // until the vtables for DebuggerInstanceSettings are properly set up, i.e. AFTER all the initializers. 2360f20e8239SCaroline Tice // For this reason it has to be called here, rather than in the initializer or in the parent constructor. 23619e41c15dSCaroline Tice // The same is true of CreateInstanceName(). 23629e41c15dSCaroline Tice 23639e41c15dSCaroline Tice if (GetInstanceName() == InstanceSettings::InvalidName()) 23649e41c15dSCaroline Tice { 23659e41c15dSCaroline Tice ChangeInstanceName (std::string (CreateInstanceName().AsCString())); 2366b9556accSGreg Clayton m_owner_sp->RegisterInstanceSettings (this); 23679e41c15dSCaroline Tice } 2368f20e8239SCaroline Tice 2369f20e8239SCaroline Tice if (live_instance) 23703df9a8dfSCaroline Tice { 2371b9556accSGreg Clayton const InstanceSettingsSP &pending_settings = m_owner_sp->FindPendingSettings (m_instance_name); 23723df9a8dfSCaroline Tice CopyInstanceSettings (pending_settings, false); 23733df9a8dfSCaroline Tice } 23743df9a8dfSCaroline Tice } 23753df9a8dfSCaroline Tice 23763df9a8dfSCaroline Tice DebuggerInstanceSettings::DebuggerInstanceSettings (const DebuggerInstanceSettings &rhs) : 2377b9556accSGreg Clayton InstanceSettings (Debugger::GetSettingsController(), CreateInstanceName ().AsCString()), 23783df9a8dfSCaroline Tice m_prompt (rhs.m_prompt), 23790603aa9dSGreg Clayton m_frame_format (rhs.m_frame_format), 23800603aa9dSGreg Clayton m_thread_format (rhs.m_thread_format), 2381daccaa9eSCaroline Tice m_script_lang (rhs.m_script_lang), 23823bcdb29cSJim Ingham m_use_external_editor (rhs.m_use_external_editor), 23833bcdb29cSJim Ingham m_auto_confirm_on(rhs.m_auto_confirm_on) 23843df9a8dfSCaroline Tice { 2385b9556accSGreg Clayton UserSettingsControllerSP owner_sp (m_owner_wp.lock()); 2386b9556accSGreg Clayton if (owner_sp) 2387b9556accSGreg Clayton { 2388b9556accSGreg Clayton CopyInstanceSettings (owner_sp->FindPendingSettings (m_instance_name), false); 2389b9556accSGreg Clayton owner_sp->RemovePendingSettings (m_instance_name); 2390b9556accSGreg Clayton } 23913df9a8dfSCaroline Tice } 23923df9a8dfSCaroline Tice 23933df9a8dfSCaroline Tice DebuggerInstanceSettings::~DebuggerInstanceSettings () 23943df9a8dfSCaroline Tice { 23953df9a8dfSCaroline Tice } 23963df9a8dfSCaroline Tice 23973df9a8dfSCaroline Tice DebuggerInstanceSettings& 23983df9a8dfSCaroline Tice DebuggerInstanceSettings::operator= (const DebuggerInstanceSettings &rhs) 23993df9a8dfSCaroline Tice { 24003df9a8dfSCaroline Tice if (this != &rhs) 24013df9a8dfSCaroline Tice { 24021b654882SGreg Clayton m_term_width = rhs.m_term_width; 24033df9a8dfSCaroline Tice m_prompt = rhs.m_prompt; 24040603aa9dSGreg Clayton m_frame_format = rhs.m_frame_format; 24050603aa9dSGreg Clayton m_thread_format = rhs.m_thread_format; 24063df9a8dfSCaroline Tice m_script_lang = rhs.m_script_lang; 2407daccaa9eSCaroline Tice m_use_external_editor = rhs.m_use_external_editor; 24083bcdb29cSJim Ingham m_auto_confirm_on = rhs.m_auto_confirm_on; 24093df9a8dfSCaroline Tice } 24103df9a8dfSCaroline Tice 24113df9a8dfSCaroline Tice return *this; 24123df9a8dfSCaroline Tice } 24133df9a8dfSCaroline Tice 24141b654882SGreg Clayton bool 24151b654882SGreg Clayton DebuggerInstanceSettings::ValidTermWidthValue (const char *value, Error err) 24161b654882SGreg Clayton { 24171b654882SGreg Clayton bool valid = false; 24181b654882SGreg Clayton 24191b654882SGreg Clayton // Verify we have a value string. 24201b654882SGreg Clayton if (value == NULL || value[0] == '\0') 24211b654882SGreg Clayton { 242286edbf41SGreg Clayton err.SetErrorString ("missing value, can't set terminal width without a value"); 24231b654882SGreg Clayton } 24241b654882SGreg Clayton else 24251b654882SGreg Clayton { 24261b654882SGreg Clayton char *end = NULL; 24271b654882SGreg Clayton const uint32_t width = ::strtoul (value, &end, 0); 24281b654882SGreg Clayton 2429ea9fc181SJohnny Chen if (end && end[0] == '\0') 24301b654882SGreg Clayton { 2431433d7741SJohnny Chen if (width >= 10 && width <= 1024) 24321b654882SGreg Clayton valid = true; 24331b654882SGreg Clayton else 243486edbf41SGreg Clayton err.SetErrorString ("invalid term-width value; value must be between 10 and 1024"); 24351b654882SGreg Clayton } 24361b654882SGreg Clayton else 243786edbf41SGreg Clayton err.SetErrorStringWithFormat ("'%s' is not a valid unsigned integer string", value); 24381b654882SGreg Clayton } 24391b654882SGreg Clayton 24401b654882SGreg Clayton return valid; 24411b654882SGreg Clayton } 24421b654882SGreg Clayton 24431b654882SGreg Clayton 24443df9a8dfSCaroline Tice void 24453df9a8dfSCaroline Tice DebuggerInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name, 24463df9a8dfSCaroline Tice const char *index_value, 24473df9a8dfSCaroline Tice const char *value, 24483df9a8dfSCaroline Tice const ConstString &instance_name, 24493df9a8dfSCaroline Tice const SettingEntry &entry, 2450e0d378b3SGreg Clayton VarSetOperationType op, 24513df9a8dfSCaroline Tice Error &err, 24523df9a8dfSCaroline Tice bool pending) 24533df9a8dfSCaroline Tice { 24540603aa9dSGreg Clayton 24550603aa9dSGreg Clayton if (var_name == TermWidthVarName()) 24560603aa9dSGreg Clayton { 24570603aa9dSGreg Clayton if (ValidTermWidthValue (value, err)) 24580603aa9dSGreg Clayton { 24590603aa9dSGreg Clayton m_term_width = ::strtoul (value, NULL, 0); 24600603aa9dSGreg Clayton } 24610603aa9dSGreg Clayton } 24620603aa9dSGreg Clayton else if (var_name == PromptVarName()) 24633df9a8dfSCaroline Tice { 24643df9a8dfSCaroline Tice UserSettingsController::UpdateStringVariable (op, m_prompt, value, err); 24653df9a8dfSCaroline Tice if (!pending) 24663df9a8dfSCaroline Tice { 246749e2737eSCaroline Tice // 'instance_name' is actually (probably) in the form '[<instance_name>]'; if so, we need to 246849e2737eSCaroline Tice // strip off the brackets before passing it to BroadcastPromptChange. 246949e2737eSCaroline Tice 247049e2737eSCaroline Tice std::string tmp_instance_name (instance_name.AsCString()); 247149e2737eSCaroline Tice if ((tmp_instance_name[0] == '[') 247249e2737eSCaroline Tice && (tmp_instance_name[instance_name.GetLength() - 1] == ']')) 247349e2737eSCaroline Tice tmp_instance_name = tmp_instance_name.substr (1, instance_name.GetLength() - 2); 247449e2737eSCaroline Tice ConstString new_name (tmp_instance_name.c_str()); 247549e2737eSCaroline Tice 247649e2737eSCaroline Tice BroadcastPromptChange (new_name, m_prompt.c_str()); 24773df9a8dfSCaroline Tice } 24783df9a8dfSCaroline Tice } 24790603aa9dSGreg Clayton else if (var_name == GetFrameFormatName()) 24800603aa9dSGreg Clayton { 24810603aa9dSGreg Clayton UserSettingsController::UpdateStringVariable (op, m_frame_format, value, err); 24820603aa9dSGreg Clayton } 24830603aa9dSGreg Clayton else if (var_name == GetThreadFormatName()) 24840603aa9dSGreg Clayton { 24850603aa9dSGreg Clayton UserSettingsController::UpdateStringVariable (op, m_thread_format, value, err); 24860603aa9dSGreg Clayton } 24873df9a8dfSCaroline Tice else if (var_name == ScriptLangVarName()) 24883df9a8dfSCaroline Tice { 24893df9a8dfSCaroline Tice bool success; 24903df9a8dfSCaroline Tice m_script_lang = Args::StringToScriptLanguage (value, eScriptLanguageDefault, 24913df9a8dfSCaroline Tice &success); 24923df9a8dfSCaroline Tice } 2493daccaa9eSCaroline Tice else if (var_name == UseExternalEditorVarName ()) 2494daccaa9eSCaroline Tice { 2495385aa28cSGreg Clayton UserSettingsController::UpdateBooleanVariable (op, m_use_external_editor, value, false, err); 2496daccaa9eSCaroline Tice } 24973bcdb29cSJim Ingham else if (var_name == AutoConfirmName ()) 24983bcdb29cSJim Ingham { 2499385aa28cSGreg Clayton UserSettingsController::UpdateBooleanVariable (op, m_auto_confirm_on, value, false, err); 25003bcdb29cSJim Ingham } 2501e372b98dSGreg Clayton else if (var_name == StopSourceContextBeforeName ()) 2502e372b98dSGreg Clayton { 2503e372b98dSGreg Clayton uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL); 2504e372b98dSGreg Clayton if (new_value != UINT32_MAX) 2505e372b98dSGreg Clayton m_stop_source_before_count = new_value; 2506e372b98dSGreg Clayton else 2507e372b98dSGreg Clayton err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopSourceContextAfterName ().GetCString()); 2508e372b98dSGreg Clayton } 2509e372b98dSGreg Clayton else if (var_name == StopSourceContextAfterName ()) 2510e372b98dSGreg Clayton { 2511e372b98dSGreg Clayton uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL); 2512e372b98dSGreg Clayton if (new_value != UINT32_MAX) 2513e372b98dSGreg Clayton m_stop_source_after_count = new_value; 2514e372b98dSGreg Clayton else 2515e372b98dSGreg Clayton err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopSourceContextBeforeName ().GetCString()); 2516e372b98dSGreg Clayton } 2517e372b98dSGreg Clayton else if (var_name == StopDisassemblyCountName ()) 2518e372b98dSGreg Clayton { 2519e372b98dSGreg Clayton uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL); 2520e372b98dSGreg Clayton if (new_value != UINT32_MAX) 2521e372b98dSGreg Clayton m_stop_disassembly_count = new_value; 2522e372b98dSGreg Clayton else 2523e372b98dSGreg Clayton err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopDisassemblyCountName ().GetCString()); 2524e372b98dSGreg Clayton } 2525e372b98dSGreg Clayton else if (var_name == StopDisassemblyDisplayName ()) 2526e372b98dSGreg Clayton { 2527e372b98dSGreg Clayton int new_value; 2528e372b98dSGreg Clayton UserSettingsController::UpdateEnumVariable (g_show_disassembly_enum_values, &new_value, value, err); 2529e372b98dSGreg Clayton if (err.Success()) 2530e372b98dSGreg Clayton m_stop_disassembly_display = (StopDisassemblyType)new_value; 2531e372b98dSGreg Clayton } 25323df9a8dfSCaroline Tice } 25333df9a8dfSCaroline Tice 253412cecd74SCaroline Tice bool 25353df9a8dfSCaroline Tice DebuggerInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, 25363df9a8dfSCaroline Tice const ConstString &var_name, 2537daccaa9eSCaroline Tice StringList &value, 253812cecd74SCaroline Tice Error *err) 25393df9a8dfSCaroline Tice { 25403df9a8dfSCaroline Tice if (var_name == PromptVarName()) 25413df9a8dfSCaroline Tice { 25420603aa9dSGreg Clayton value.AppendString (m_prompt.c_str(), m_prompt.size()); 25433df9a8dfSCaroline Tice 25443df9a8dfSCaroline Tice } 25453df9a8dfSCaroline Tice else if (var_name == ScriptLangVarName()) 25463df9a8dfSCaroline Tice { 25473df9a8dfSCaroline Tice value.AppendString (ScriptInterpreter::LanguageToString (m_script_lang).c_str()); 25483df9a8dfSCaroline Tice } 2549101c7c20SCaroline Tice else if (var_name == TermWidthVarName()) 2550101c7c20SCaroline Tice { 2551101c7c20SCaroline Tice StreamString width_str; 2552e372b98dSGreg Clayton width_str.Printf ("%u", m_term_width); 2553101c7c20SCaroline Tice value.AppendString (width_str.GetData()); 2554101c7c20SCaroline Tice } 25550603aa9dSGreg Clayton else if (var_name == GetFrameFormatName ()) 25560603aa9dSGreg Clayton { 25570603aa9dSGreg Clayton value.AppendString(m_frame_format.c_str(), m_frame_format.size()); 25580603aa9dSGreg Clayton } 25590603aa9dSGreg Clayton else if (var_name == GetThreadFormatName ()) 25600603aa9dSGreg Clayton { 25610603aa9dSGreg Clayton value.AppendString(m_thread_format.c_str(), m_thread_format.size()); 25620603aa9dSGreg Clayton } 2563daccaa9eSCaroline Tice else if (var_name == UseExternalEditorVarName()) 2564daccaa9eSCaroline Tice { 2565daccaa9eSCaroline Tice if (m_use_external_editor) 2566daccaa9eSCaroline Tice value.AppendString ("true"); 2567daccaa9eSCaroline Tice else 2568daccaa9eSCaroline Tice value.AppendString ("false"); 2569daccaa9eSCaroline Tice } 25703bcdb29cSJim Ingham else if (var_name == AutoConfirmName()) 25713bcdb29cSJim Ingham { 25723bcdb29cSJim Ingham if (m_auto_confirm_on) 25733bcdb29cSJim Ingham value.AppendString ("true"); 25743bcdb29cSJim Ingham else 25753bcdb29cSJim Ingham value.AppendString ("false"); 25763bcdb29cSJim Ingham } 2577e372b98dSGreg Clayton else if (var_name == StopSourceContextAfterName ()) 2578e372b98dSGreg Clayton { 2579e372b98dSGreg Clayton StreamString strm; 2580e372b98dSGreg Clayton strm.Printf ("%u", m_stop_source_before_count); 2581e372b98dSGreg Clayton value.AppendString (strm.GetData()); 2582e372b98dSGreg Clayton } 2583e372b98dSGreg Clayton else if (var_name == StopSourceContextBeforeName ()) 2584e372b98dSGreg Clayton { 2585e372b98dSGreg Clayton StreamString strm; 2586e372b98dSGreg Clayton strm.Printf ("%u", m_stop_source_after_count); 2587e372b98dSGreg Clayton value.AppendString (strm.GetData()); 2588e372b98dSGreg Clayton } 2589e372b98dSGreg Clayton else if (var_name == StopDisassemblyCountName ()) 2590e372b98dSGreg Clayton { 2591e372b98dSGreg Clayton StreamString strm; 2592e372b98dSGreg Clayton strm.Printf ("%u", m_stop_disassembly_count); 2593e372b98dSGreg Clayton value.AppendString (strm.GetData()); 2594e372b98dSGreg Clayton } 2595e372b98dSGreg Clayton else if (var_name == StopDisassemblyDisplayName ()) 2596e372b98dSGreg Clayton { 2597e372b98dSGreg Clayton if (m_stop_disassembly_display >= eStopDisassemblyTypeNever && m_stop_disassembly_display <= eStopDisassemblyTypeAlways) 2598e372b98dSGreg Clayton value.AppendString (g_show_disassembly_enum_values[m_stop_disassembly_display].string_value); 2599e372b98dSGreg Clayton else 2600e372b98dSGreg Clayton value.AppendString ("<invalid>"); 2601e372b98dSGreg Clayton } 2602daccaa9eSCaroline Tice else 260312cecd74SCaroline Tice { 260412cecd74SCaroline Tice if (err) 260512cecd74SCaroline Tice err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString()); 260612cecd74SCaroline Tice return false; 260712cecd74SCaroline Tice } 260812cecd74SCaroline Tice return true; 26093df9a8dfSCaroline Tice } 26103df9a8dfSCaroline Tice 26113df9a8dfSCaroline Tice void 26124d122c40SGreg Clayton DebuggerInstanceSettings::CopyInstanceSettings (const InstanceSettingsSP &new_settings, 26133df9a8dfSCaroline Tice bool pending) 26143df9a8dfSCaroline Tice { 26153df9a8dfSCaroline Tice if (new_settings.get() == NULL) 26163df9a8dfSCaroline Tice return; 26173df9a8dfSCaroline Tice 26183df9a8dfSCaroline Tice DebuggerInstanceSettings *new_debugger_settings = (DebuggerInstanceSettings *) new_settings.get(); 26193df9a8dfSCaroline Tice 26203df9a8dfSCaroline Tice m_prompt = new_debugger_settings->m_prompt; 26213df9a8dfSCaroline Tice if (!pending) 262249e2737eSCaroline Tice { 262349e2737eSCaroline Tice // 'instance_name' is actually (probably) in the form '[<instance_name>]'; if so, we need to 262449e2737eSCaroline Tice // strip off the brackets before passing it to BroadcastPromptChange. 262549e2737eSCaroline Tice 262649e2737eSCaroline Tice std::string tmp_instance_name (m_instance_name.AsCString()); 262749e2737eSCaroline Tice if ((tmp_instance_name[0] == '[') 262849e2737eSCaroline Tice && (tmp_instance_name[m_instance_name.GetLength() - 1] == ']')) 262949e2737eSCaroline Tice tmp_instance_name = tmp_instance_name.substr (1, m_instance_name.GetLength() - 2); 263049e2737eSCaroline Tice ConstString new_name (tmp_instance_name.c_str()); 263149e2737eSCaroline Tice 263249e2737eSCaroline Tice BroadcastPromptChange (new_name, m_prompt.c_str()); 263349e2737eSCaroline Tice } 26340603aa9dSGreg Clayton m_frame_format = new_debugger_settings->m_frame_format; 26350603aa9dSGreg Clayton m_thread_format = new_debugger_settings->m_thread_format; 2636daccaa9eSCaroline Tice m_term_width = new_debugger_settings->m_term_width; 26373df9a8dfSCaroline Tice m_script_lang = new_debugger_settings->m_script_lang; 2638daccaa9eSCaroline Tice m_use_external_editor = new_debugger_settings->m_use_external_editor; 26393bcdb29cSJim Ingham m_auto_confirm_on = new_debugger_settings->m_auto_confirm_on; 26403df9a8dfSCaroline Tice } 26413df9a8dfSCaroline Tice 26423df9a8dfSCaroline Tice 26433df9a8dfSCaroline Tice bool 26443df9a8dfSCaroline Tice DebuggerInstanceSettings::BroadcastPromptChange (const ConstString &instance_name, const char *new_prompt) 26453df9a8dfSCaroline Tice { 26463df9a8dfSCaroline Tice std::string tmp_prompt; 26473df9a8dfSCaroline Tice 26483df9a8dfSCaroline Tice if (new_prompt != NULL) 26493df9a8dfSCaroline Tice { 26503df9a8dfSCaroline Tice tmp_prompt = new_prompt ; 26513df9a8dfSCaroline Tice int len = tmp_prompt.size(); 26523df9a8dfSCaroline Tice if (len > 1 26533df9a8dfSCaroline Tice && (tmp_prompt[0] == '\'' || tmp_prompt[0] == '"') 26543df9a8dfSCaroline Tice && (tmp_prompt[len-1] == tmp_prompt[0])) 26553df9a8dfSCaroline Tice { 26563df9a8dfSCaroline Tice tmp_prompt = tmp_prompt.substr(1,len-2); 26573df9a8dfSCaroline Tice } 26583df9a8dfSCaroline Tice len = tmp_prompt.size(); 26593df9a8dfSCaroline Tice if (tmp_prompt[len-1] != ' ') 26603df9a8dfSCaroline Tice tmp_prompt.append(" "); 26613df9a8dfSCaroline Tice } 26623df9a8dfSCaroline Tice EventSP new_event_sp; 26633df9a8dfSCaroline Tice new_event_sp.reset (new Event(CommandInterpreter::eBroadcastBitResetPrompt, 26643df9a8dfSCaroline Tice new EventDataBytes (tmp_prompt.c_str()))); 26653df9a8dfSCaroline Tice 26663df9a8dfSCaroline Tice if (instance_name.GetLength() != 0) 26673df9a8dfSCaroline Tice { 26683df9a8dfSCaroline Tice // Set prompt for a particular instance. 26693df9a8dfSCaroline Tice Debugger *dbg = Debugger::FindDebuggerWithInstanceName (instance_name).get(); 26703df9a8dfSCaroline Tice if (dbg != NULL) 26713df9a8dfSCaroline Tice { 26723df9a8dfSCaroline Tice dbg->GetCommandInterpreter().BroadcastEvent (new_event_sp); 26733df9a8dfSCaroline Tice } 26743df9a8dfSCaroline Tice } 26753df9a8dfSCaroline Tice 26763df9a8dfSCaroline Tice return true; 26773df9a8dfSCaroline Tice } 26783df9a8dfSCaroline Tice 26793df9a8dfSCaroline Tice const ConstString 26803df9a8dfSCaroline Tice DebuggerInstanceSettings::CreateInstanceName () 26813df9a8dfSCaroline Tice { 26823df9a8dfSCaroline Tice static int instance_count = 1; 26833df9a8dfSCaroline Tice StreamString sstr; 26843df9a8dfSCaroline Tice 26853df9a8dfSCaroline Tice sstr.Printf ("debugger_%d", instance_count); 26863df9a8dfSCaroline Tice ++instance_count; 26873df9a8dfSCaroline Tice 26883df9a8dfSCaroline Tice const ConstString ret_val (sstr.GetData()); 26893df9a8dfSCaroline Tice 26903df9a8dfSCaroline Tice return ret_val; 26913df9a8dfSCaroline Tice } 26923df9a8dfSCaroline Tice 26933bcdb29cSJim Ingham 26943df9a8dfSCaroline Tice //-------------------------------------------------- 26951b654882SGreg Clayton // SettingsController Variable Tables 26963df9a8dfSCaroline Tice //-------------------------------------------------- 26973df9a8dfSCaroline Tice 26983df9a8dfSCaroline Tice 26993df9a8dfSCaroline Tice SettingEntry 27001b654882SGreg Clayton Debugger::SettingsController::global_settings_table[] = 27013df9a8dfSCaroline Tice { 27023df9a8dfSCaroline Tice //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"}, 2703101c7c20SCaroline Tice // The Debugger level global table should always be empty; all Debugger settable variables should be instance 2704101c7c20SCaroline Tice // variables. 27053df9a8dfSCaroline Tice { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } 27063df9a8dfSCaroline Tice }; 27073df9a8dfSCaroline Tice 2708bb562b13SGreg Clayton #define MODULE_WITH_FUNC "{ ${module.file.basename}{`${function.name}${function.pc-offset}}}" 27090603aa9dSGreg Clayton #define FILE_AND_LINE "{ at ${line.file.basename}:${line.number}}" 27103df9a8dfSCaroline Tice 27110603aa9dSGreg Clayton #define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id}"\ 27120603aa9dSGreg Clayton "{, ${frame.pc}}"\ 27130603aa9dSGreg Clayton MODULE_WITH_FUNC\ 2714cf4b9078SGreg Clayton FILE_AND_LINE\ 27150603aa9dSGreg Clayton "{, stop reason = ${thread.stop-reason}}"\ 2716ef651600SJim Ingham "{\\nReturn value: ${thread.return-value}}"\ 27170603aa9dSGreg Clayton "\\n" 27180603aa9dSGreg Clayton 2719315d2cabSGreg Clayton //#define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id}"\ 2720315d2cabSGreg Clayton // "{, ${frame.pc}}"\ 2721315d2cabSGreg Clayton // MODULE_WITH_FUNC\ 2722315d2cabSGreg Clayton // FILE_AND_LINE\ 2723315d2cabSGreg Clayton // "{, stop reason = ${thread.stop-reason}}"\ 2724315d2cabSGreg Clayton // "{, name = ${thread.name}}"\ 2725315d2cabSGreg Clayton // "{, queue = ${thread.queue}}"\ 2726315d2cabSGreg Clayton // "\\n" 2727315d2cabSGreg Clayton 27280603aa9dSGreg Clayton #define DEFAULT_FRAME_FORMAT "frame #${frame.index}: ${frame.pc}"\ 27290603aa9dSGreg Clayton MODULE_WITH_FUNC\ 27300603aa9dSGreg Clayton FILE_AND_LINE\ 27310603aa9dSGreg Clayton "\\n" 27323df9a8dfSCaroline Tice 27333df9a8dfSCaroline Tice SettingEntry 27341b654882SGreg Clayton Debugger::SettingsController::instance_settings_table[] = 27353df9a8dfSCaroline Tice { 27360603aa9dSGreg Clayton // NAME Setting variable type Default Enum Init'd Hidden Help 27370603aa9dSGreg Clayton // ======================= ======================= ====================== ==== ====== ====== ====================== 27380603aa9dSGreg Clayton { "frame-format", eSetVarTypeString, DEFAULT_FRAME_FORMAT, NULL, false, false, "The default frame format string to use when displaying thread information." }, 27393bcdb29cSJim Ingham { "prompt", eSetVarTypeString, "(lldb) ", NULL, false, false, "The debugger command line prompt displayed for the user." }, 27403bcdb29cSJim Ingham { "script-lang", eSetVarTypeString, "python", NULL, false, false, "The script language to be used for evaluating user-written scripts." }, 27413bcdb29cSJim Ingham { "term-width", eSetVarTypeInt, "80" , NULL, false, false, "The maximum number of columns to use for displaying text." }, 27420603aa9dSGreg Clayton { "thread-format", eSetVarTypeString, DEFAULT_THREAD_FORMAT, NULL, false, false, "The default thread format string to use when displaying thread information." }, 274306e827ccSJim Ingham { "use-external-editor", eSetVarTypeBoolean, "false", NULL, false, false, "Whether to use an external editor or not." }, 274406e827ccSJim Ingham { "auto-confirm", eSetVarTypeBoolean, "false", NULL, false, false, "If true all confirmation prompts will receive their default reply." }, 2745e372b98dSGreg Clayton { "stop-line-count-before",eSetVarTypeInt, "3", NULL, false, false, "The number of sources lines to display that come before the current source line when displaying a stopped context." }, 2746e372b98dSGreg Clayton { "stop-line-count-after", eSetVarTypeInt, "3", NULL, false, false, "The number of sources lines to display that come after the current source line when displaying a stopped context." }, 2747e372b98dSGreg Clayton { "stop-disassembly-count", eSetVarTypeInt, "0", NULL, false, false, "The number of disassembly lines to show when displaying a stopped context." }, 2748e372b98dSGreg Clayton { "stop-disassembly-display", eSetVarTypeEnum, "no-source", g_show_disassembly_enum_values, false, false, "Control when to display disassembly when displaying a stopped context." }, 27490603aa9dSGreg Clayton { NULL, eSetVarTypeNone, NULL, NULL, false, false, NULL } 27503df9a8dfSCaroline Tice }; 2751