Debugger.cpp revision cf09f885c201becf51acc4a5cfac00b3df53f2a8
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Debugger.cpp --------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/Debugger.h" 115c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 125c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include <map> 135c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 141391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/DeclCXX.h" 151391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/Type.h" 161391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConnectionFileDescriptor.h" 195c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/FormatManager.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/InputReader.h" 21061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 23e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham#include "lldb/Core/StreamAsynchronousIO.h" 246c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham#include "lldb/Core/StreamCallback.h" 25d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Core/StreamString.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 271391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "lldb/Core/ValueObject.h" 28f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton#include "lldb/Core/ValueObjectVariable.h" 290fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton#include "lldb/Host/Terminal.h" 3063094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h" 31f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton#include "lldb/Symbol/VariableList.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 34d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/RegisterContext.h" 35d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/StopInfo.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 37f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton#include "lldb/Utility/AnsiTerminal.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic uint32_t g_shared_debugger_refcount = 0; 44558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Ticestatic lldb::user_id_t g_unique_id = 1; 45558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 46d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Static Functions 47d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 48d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic Mutex & 49d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerListMutex () 50d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 51d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton static Mutex g_mutex(Mutex::eMutexTypeRecursive); 52d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return g_mutex; 53d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 54d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 55d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytontypedef std::vector<DebuggerSP> DebuggerList; 56d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 57d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic DebuggerList & 58d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerList() 59d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 60d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // hide the static debugger list inside a singleton accessor to avoid 61d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // global init contructors 62d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton static DebuggerList g_list; 63d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return g_list; 64d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 65d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 66d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 67be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 68be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonPromptVarName () 69be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 70be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("prompt"); 71be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 72be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 73be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 74be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 75be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonGetFrameFormatName () 76be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 77be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("frame-format"); 78be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 79be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 80be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 81be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 82be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonGetThreadFormatName () 83be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 84be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("thread-format"); 85be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 86be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 87be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 88be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 89be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonScriptLangVarName () 90be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 91be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("script-lang"); 92be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 93be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 94be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 95be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 96be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonTermWidthVarName () 97be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 98be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("term-width"); 99be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 100be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 101be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 102be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 103be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonUseExternalEditorVarName () 104be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 105be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("use-external-editor"); 106be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 107be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 108be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 109be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 110be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonAutoConfirmName () 111be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 112be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("auto-confirm"); 113be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 114be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 115be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 116be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 117be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonStopSourceContextBeforeName () 118be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 119be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("stop-line-count-before"); 120be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 121be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 122be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 123be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 124be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonStopSourceContextAfterName () 125be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 126be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("stop-line-count-after"); 127be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 128be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 129be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 130be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 131be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonStopDisassemblyCountName () 132be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 133be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("stop-disassembly-count"); 134be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 135be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 136be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 137be9875dc16a839be592110d9de6dc2c9285c5b61Greg Claytonstatic const ConstString & 138be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonStopDisassemblyDisplayName () 139be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 140be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton static ConstString g_const_string ("stop-disassembly-display"); 141be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton return g_const_string; 142be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 143be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 144be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonOptionEnumValueElement 145be9875dc16a839be592110d9de6dc2c9285c5b61Greg ClaytonDebuggerInstanceSettings::g_show_disassembly_enum_values[] = 146be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 147be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { eStopDisassemblyTypeNever, "never", "Never show disassembly when displaying a stop context."}, 148be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { eStopDisassemblyTypeNoSource, "no-source", "Show disassembly when there is no source information, or the source file is missing when displaying a stop context."}, 149be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { eStopDisassemblyTypeAlways, "always", "Always show disassembly when displaying a stop context."}, 150be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { 0, NULL, NULL } 151be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton}; 152be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 153be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 154be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 155d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Debugger 156d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 157990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonUserSettingsControllerSP & 158990de7bb41d3afec6b789155408ff322187d8682Greg ClaytonDebugger::GetSettingsController () 159990de7bb41d3afec6b789155408ff322187d8682Greg Clayton{ 160334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton static UserSettingsControllerSP g_settings_controller_sp; 161334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton if (!g_settings_controller_sp) 162334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton { 163334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton g_settings_controller_sp.reset (new Debugger::SettingsController); 164334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton 165334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // The first shared pointer to Debugger::SettingsController in 166334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // g_settings_controller_sp must be fully created above so that 167334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // the DebuggerInstanceSettings can use a weak_ptr to refer back 168334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton // to the master setttings controller 169334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton InstanceSettingsSP default_instance_settings_sp (new DebuggerInstanceSettings (g_settings_controller_sp, 170334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton false, 171334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton InstanceSettings::GetDefaultName().AsCString())); 172334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton g_settings_controller_sp->SetDefaultInstanceSettings (default_instance_settings_sp); 173334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton } 174334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton return g_settings_controller_sp; 175990de7bb41d3afec6b789155408ff322187d8682Greg Clayton} 176990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 1770aa2e55f0e9422405ad33675adc1e35044537adbCaroline Ticeint 1780aa2e55f0e9422405ad33675adc1e35044537adbCaroline TiceDebugger::TestDebuggerRefCount () 1790aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice{ 1800aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice return g_shared_debugger_refcount; 1810aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice} 1820aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Initialize () 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18663094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount == 0) 187990de7bb41d3afec6b789155408ff322187d8682Greg Clayton { 188c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::Initialize(); 189990de7bb41d3afec6b789155408ff322187d8682Greg Clayton } 19063094e0bb161580564954dee512955c1c79d3476Greg Clayton g_shared_debugger_refcount++; 191990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Terminate () 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19763094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount > 0) 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19963094e0bb161580564954dee512955c1c79d3476Greg Clayton g_shared_debugger_refcount--; 20063094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount == 0) 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 202c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::WillTerminate(); 203c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::Terminate(); 204202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice 205202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice // Clear our master list of debugger objects 206202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 207202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice GetDebuggerList().clear(); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2122a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid 2132a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsInitialize () 2142a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 2152a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice static bool g_initialized = false; 2162a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 2172a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice if (!g_initialized) 2182a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice { 2192a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice g_initialized = true; 220334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton UserSettingsController::InitializeSettingsController (GetSettingsController(), 2212a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice SettingsController::global_settings_table, 2222a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice SettingsController::instance_settings_table); 2232a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Now call SettingsInitialize for each settings 'child' of Debugger 2242a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice Target::SettingsInitialize (); 2252a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice } 2262a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 2272a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 2282a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid 2292a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsTerminate () 2302a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 2312a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 2322a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Must call SettingsTerminate() for each settings 'child' of Debugger, before terminating the Debugger's 2332a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Settings. 2342a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 2352a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice Target::SettingsTerminate (); 2362a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 2372a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice // Now terminate the Debugger Settings. 2382a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 2392a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice UserSettingsControllerSP &usc = GetSettingsController(); 2402a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice UserSettingsController::FinalizeSettingsController (usc); 2412a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice usc.reset(); 2422a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 2432a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 24463094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebuggerSP 2456c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::CreateInstance (lldb::LogOutputCallback log_callback, void *baton) 24663094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 2476c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham DebuggerSP debugger_sp (new Debugger(log_callback, baton)); 24863094e0bb161580564954dee512955c1c79d3476Greg Clayton // Scope for locker 24963094e0bb161580564954dee512955c1c79d3476Greg Clayton { 25063094e0bb161580564954dee512955c1c79d3476Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 25163094e0bb161580564954dee512955c1c79d3476Greg Clayton GetDebuggerList().push_back(debugger_sp); 25263094e0bb161580564954dee512955c1c79d3476Greg Clayton } 25363094e0bb161580564954dee512955c1c79d3476Greg Clayton return debugger_sp; 25463094e0bb161580564954dee512955c1c79d3476Greg Clayton} 25563094e0bb161580564954dee512955c1c79d3476Greg Clayton 256c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Ticevoid 257987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::Destroy (DebuggerSP &debugger_sp) 258c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice{ 259c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice if (debugger_sp.get() == NULL) 260c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice return; 261c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice 262c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham debugger_sp->Clear(); 263c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham 264c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 265c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice DebuggerList &debugger_list = GetDebuggerList (); 266c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice DebuggerList::iterator pos, end = debugger_list.end(); 267c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice for (pos = debugger_list.begin (); pos != end; ++pos) 268c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice { 269c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice if ((*pos).get() == debugger_sp.get()) 270c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice { 271c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice debugger_list.erase (pos); 272c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice return; 273c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice } 274c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice } 275c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice} 276c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice 277987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebuggerSP 2786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::FindDebuggerWithInstanceName (const ConstString &instance_name) 2796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 280987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton DebuggerSP debugger_sp; 2816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 2836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice DebuggerList &debugger_list = GetDebuggerList(); 2846e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice DebuggerList::iterator pos, end = debugger_list.end(); 2856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice for (pos = debugger_list.begin(); pos != end; ++pos) 2876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 2886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if ((*pos).get()->m_instance_name == instance_name) 2896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 2906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice debugger_sp = *pos; 2916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice break; 2926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 2936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 2946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return debugger_sp; 2956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 29663094e0bb161580564954dee512955c1c79d3476Greg Clayton 29763094e0bb161580564954dee512955c1c79d3476Greg ClaytonTargetSP 29863094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::FindTargetWithProcessID (lldb::pid_t pid) 29963094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 300987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton TargetSP target_sp; 30163094e0bb161580564954dee512955c1c79d3476Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 30263094e0bb161580564954dee512955c1c79d3476Greg Clayton DebuggerList &debugger_list = GetDebuggerList(); 30363094e0bb161580564954dee512955c1c79d3476Greg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 30463094e0bb161580564954dee512955c1c79d3476Greg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 30563094e0bb161580564954dee512955c1c79d3476Greg Clayton { 30663094e0bb161580564954dee512955c1c79d3476Greg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid); 30763094e0bb161580564954dee512955c1c79d3476Greg Clayton if (target_sp) 30863094e0bb161580564954dee512955c1c79d3476Greg Clayton break; 30963094e0bb161580564954dee512955c1c79d3476Greg Clayton } 31063094e0bb161580564954dee512955c1c79d3476Greg Clayton return target_sp; 31163094e0bb161580564954dee512955c1c79d3476Greg Clayton} 31263094e0bb161580564954dee512955c1c79d3476Greg Clayton 3131c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonTargetSP 3141c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonDebugger::FindTargetWithProcess (Process *process) 3151c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton{ 3161c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton TargetSP target_sp; 3171c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 3181c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton DebuggerList &debugger_list = GetDebuggerList(); 3191c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 3201c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 3211c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton { 3221c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcess (process); 3231c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton if (target_sp) 3241c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton break; 3251c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton } 3261c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton return target_sp; 3271c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton} 3281c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 32963094e0bb161580564954dee512955c1c79d3476Greg Clayton 3306c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::Debugger (lldb::LogOutputCallback log_callback, void *baton) : 331558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice UserID (g_unique_id++), 332334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton DebuggerInstanceSettings (GetSettingsController()), 333eecb0f3b5021e37311f9588f14bcab38a35b8e9aGreg Clayton m_input_comm("debugger.input"), 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_file (), 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_output_file (), 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error_file (), 3375a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_target_list (*this), 338b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_platform_list (), 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_listener ("lldb.Debugger"), 340cc637461f6c59851302836c64e0cb002de4f4571Jim Ingham m_source_manager(*this), 341cc637461f6c59851302836c64e0cb002de4f4571Jim Ingham m_source_file_cache(), 34263094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)), 343d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack (), 3444b40711e7950310afb74835820eb669004cd8c44Greg Clayton m_input_reader_data () 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3466c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_callback) 3476c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 34863094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->Initialize (); 349b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Always add our default platform to the platform list 350b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP default_platform_sp (Platform::GetDefaultPlatform()); 351b1888f24fa181489840b9acf193e224d125d0776Greg Clayton assert (default_platform_sp.get()); 352b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_platform_list.Append (default_platform_sp, true); 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::~Debugger () 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 357c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham Clear(); 358c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham} 359c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham 360c0c53249938e49e006a982057e9106a97da5ea89Jim Inghamvoid 361c0c53249938e49e006a982057e9106a97da5ea89Jim InghamDebugger::Clear() 362c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham{ 363c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice CleanUpInputReaders(); 3642f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton m_listener.Clear(); 36563094e0bb161580564954dee512955c1c79d3476Greg Clayton int num_targets = m_target_list.GetNumTargets(); 36663094e0bb161580564954dee512955c1c79d3476Greg Clayton for (int i = 0; i < num_targets; i++) 36763094e0bb161580564954dee512955c1c79d3476Greg Clayton { 3682fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton TargetSP target_sp (m_target_list.GetTargetAtIndex (i)); 3692fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (target_sp) 370c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham { 3712fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 3722fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (process_sp) 3732fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton { 3742fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (process_sp->GetShouldDetach()) 3752fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton process_sp->Detach(); 3762fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton } 3772fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton target_sp->Destroy(); 378c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham } 37963094e0bb161580564954dee512955c1c79d3476Greg Clayton } 3805a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham BroadcasterManager::Clear (); 38163094e0bb161580564954dee512955c1c79d3476Greg Clayton DisconnectInput(); 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 383c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham} 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 386421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::GetCloseInputOnEOF () const 387421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{ 388421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton return m_input_comm.GetCloseOnEOF(); 389421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton} 390421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton 391421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonvoid 392421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::SetCloseInputOnEOF (bool b) 393421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{ 394421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton m_input_comm.SetCloseOnEOF(b); 395421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton} 396421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton 397421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonbool 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetAsyncExecution () 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40063094e0bb161580564954dee512955c1c79d3476Greg Clayton return !m_command_interpreter_ap->GetSynchronous(); 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetAsyncExecution (bool async_execution) 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40663094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->SetSynchronous (!async_execution); 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership) 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4135892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &in_file = GetInputFile(); 4145892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton in_file.SetStream (fh, tranfer_ownership); 4155892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (in_file.IsValid() == false) 4165892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton in_file.SetStream (stdin, true); 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Disconnect from any old connection if we had one 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.Disconnect (); 420bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // Pass false as the second argument to ConnectionFileDescriptor below because 421bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // our "in_file" above will already take ownership if requested and we don't 422bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // want to objects trying to own and close a file descriptor. 423bba48364984bada19ba2aff2993ec583927d8150Greg Clayton m_input_comm.SetConnection (new ConnectionFileDescriptor (in_file.GetDescriptor(), false)); 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this); 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_comm.StartReadThread (&error) == false) 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4295892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &err_file = GetErrorFile(); 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4315892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.Printf ("error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error"); 4325892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton exit(1); 4335892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton } 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership) 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4395892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &out_file = GetOutputFile(); 4405892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton out_file.SetStream (fh, tranfer_ownership); 4415892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (out_file.IsValid() == false) 4425892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton out_file.SetStream (stdout, false); 4430aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 4440aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice GetCommandInterpreter().GetScriptInterpreter()->ResetOutputFileHandle (fh); 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership) 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4505892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &err_file = GetErrorFile(); 4515892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.SetStream (fh, tranfer_ownership); 4525892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (err_file.IsValid() == false) 4535892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.SetStream (stderr, false); 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerExecutionContext 457c833295baeec641086f536e78050388af36784f8Jim InghamDebugger::GetSelectedExecutionContext () 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExecutionContext exe_ctx; 460567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton TargetSP target_sp(GetSelectedTarget()); 461567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetTargetSP (target_sp); 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 465567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 466567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetProcessSP (process_sp); 467567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process_sp && process_sp->IsRunning() == false) 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 469567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread()); 470567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread_sp) 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 472567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetThreadSP (thread_sp); 473567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetSelectedFrame()); 474567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr() == NULL) 475567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetStackFrameAtIndex (0)); 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return exe_ctx; 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4837f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceInputReaderSP 4847f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceDebugger::GetCurrentInputReader () 4857f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice{ 4867f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp; 4877f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 488d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 4897f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice { 4907f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Clear any finished readers from the stack 4917f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice while (CheckIfTopInputReaderIsDone()) ; 4927f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 493d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 494d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice reader_sp = m_input_reader_stack.Top(); 4957f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice } 4967f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 4977f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice return reader_sp; 4987f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice} 4997f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len) 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 503c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (bytes_len > 0) 504c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len); 505c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice else 506c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice ((Debugger *)baton)->DispatchInputEndOfFile (); 507c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInput (const char *bytes, size_t bytes_len) 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 513c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (bytes == NULL || bytes_len == 0) 514c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice return; 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WriteToDefaultReader (bytes, bytes_len); 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 520c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputInterrupt () 521c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{ 522c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_input_reader_data.clear(); 523c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 5247f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 5257f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (reader_sp) 526c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice { 5277f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice reader_sp->Notify (eInputReaderInterrupt); 528c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 5297f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // If notifying the reader of the interrupt finished the reader, we should pop it off the stack. 530c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 531c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 532c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 533c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 534c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid 535c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputEndOfFile () 536c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{ 537c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_input_reader_data.clear(); 538c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 5397f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 5407f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (reader_sp) 541c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice { 5427f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 543c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 5447f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // If notifying the reader of the end-of-file finished the reader, we should pop it off the stack. 545c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 546c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 547c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 548c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 549c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid 550c0446861315ac0d5994f93510e24cbcac9f534adCaroline TiceDebugger::CleanUpInputReaders () 551c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice{ 552c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice m_input_reader_data.clear(); 553c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice 5547f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // The bottom input reader should be the main debugger input reader. We do not want to close that one here. 555d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice while (m_input_reader_stack.GetSize() > 1) 556c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice { 5577f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 558c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice if (reader_sp) 559c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice { 560c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 561c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice reader_sp->SetIsDone (true); 562c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice } 563c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice } 564c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice} 565c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice 566c0446861315ac0d5994f93510e24cbcac9f534adCaroline Ticevoid 5674a348081030cdd2af758fddc869518357d9befd3Caroline TiceDebugger::NotifyTopInputReader (InputReaderAction notification) 5684a348081030cdd2af758fddc869518357d9befd3Caroline Tice{ 5694a348081030cdd2af758fddc869518357d9befd3Caroline Tice InputReaderSP reader_sp (GetCurrentInputReader()); 5704a348081030cdd2af758fddc869518357d9befd3Caroline Tice if (reader_sp) 5714a348081030cdd2af758fddc869518357d9befd3Caroline Tice { 5724a348081030cdd2af758fddc869518357d9befd3Caroline Tice reader_sp->Notify (notification); 5734a348081030cdd2af758fddc869518357d9befd3Caroline Tice 5744a348081030cdd2af758fddc869518357d9befd3Caroline Tice // Flush out any input readers that are done. 5754a348081030cdd2af758fddc869518357d9befd3Caroline Tice while (CheckIfTopInputReaderIsDone ()) 5764a348081030cdd2af758fddc869518357d9befd3Caroline Tice /* Do nothing. */; 5774a348081030cdd2af758fddc869518357d9befd3Caroline Tice } 5784a348081030cdd2af758fddc869518357d9befd3Caroline Tice} 5794a348081030cdd2af758fddc869518357d9befd3Caroline Tice 580b38df1e945846a5d956974ec157902a6ad748868Caroline Ticebool 581987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::InputReaderIsTopReader (const InputReaderSP& reader_sp) 582b38df1e945846a5d956974ec157902a6ad748868Caroline Tice{ 583892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader()); 584b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 585892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice return (reader_sp.get() == top_reader_sp.get()); 586b38df1e945846a5d956974ec157902a6ad748868Caroline Tice} 587b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 588b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 5894a348081030cdd2af758fddc869518357d9befd3Caroline Ticevoid 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::WriteToDefaultReader (const char *bytes, size_t bytes_len) 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes && bytes_len) 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.append (bytes, bytes_len); 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_reader_data.empty()) 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 598d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice while (!m_input_reader_stack.IsEmpty() && !m_input_reader_data.empty()) 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the input reader from the top of the stack 6017f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60553d68e749f0715691a95f23e9490d97e484b15daGreg Clayton size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(), 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.size()); 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_handled) 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.erase (0, bytes_handled); 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No bytes were handled, we might not have reached our 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // granularity, just return and wait for more data 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6197f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Flush out any input readers that are done. 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (CheckIfTopInputReaderIsDone ()) 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /* Do nothing. */; 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PushInputReader (const InputReaderSP& reader_sp) 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 6307f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 6317f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Deactivate the old top reader 6327f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader ()); 6337f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 6347f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (top_reader_sp) 6357f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice top_reader_sp->Notify (eInputReaderDeactivate); 6367f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 637d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack.Push (reader_sp); 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderActivate); 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 643987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::PopInputReader (const InputReaderSP& pop_reader_sp) 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The reader on the stop of the stack is done, so let the next 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // read on the stack referesh its prompt and if there is one... 649d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6517f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 652d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get()) 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 656d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack.Pop (); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDeactivate); 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDone); 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 661d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 663d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice reader_sp = m_input_reader_stack.Top(); 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp) 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderReactivate); 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::CheckIfTopInputReaderIsDone () 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 679d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6817f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 682d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp && reader_sp->IsDone()) 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PopInputReader (reader_sp); 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::ActivateInputReader (const InputReaderSP &reader_sp) 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6965892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton int input_fd = m_input_file.GetFile().GetDescriptor(); 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6985892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (input_fd >= 0) 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7005892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton Terminal tty(input_fd); 7010fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 7020fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetEcho(reader_sp->GetEcho()); 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7040fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton switch (reader_sp->GetGranularity()) 7050fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton { 7060fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityByte: 7070fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityWord: 7080fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetCanonical (false); 7090fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 7100fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 7110fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityLine: 7120fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityAll: 7130fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetCanonical (true); 7140fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 7150fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 7160fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton default: 7170fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72163094e0bb161580564954dee512955c1c79d3476Greg Clayton 722e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP 723e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncOutputStream () 724e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{ 725e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 726e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham CommandInterpreter::eBroadcastBitAsynchronousOutputData)); 727e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham} 728e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham 729e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP 730e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncErrorStream () 731e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{ 732e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 733e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham CommandInterpreter::eBroadcastBitAsynchronousErrorData)); 734e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham} 735e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham 73616376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granatauint32_t 73716376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico GranataDebugger::GetNumDebuggers() 73816376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata{ 73916376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata Mutex::Locker locker (GetDebuggerListMutex ()); 74016376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata return GetDebuggerList().size(); 74116376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata} 74216376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 74316376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granatalldb::DebuggerSP 74416376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico GranataDebugger::GetDebuggerAtIndex (uint32_t index) 74516376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata{ 74616376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata DebuggerSP debugger_sp; 74716376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 74816376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata Mutex::Locker locker (GetDebuggerListMutex ()); 74916376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata DebuggerList &debugger_list = GetDebuggerList(); 75016376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 75116376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata if (index < debugger_list.size()) 75216376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata debugger_sp = debugger_list[index]; 75316376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 75416376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata return debugger_sp; 75516376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata} 75616376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 757558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebuggerSP 758558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebugger::FindDebuggerWithID (lldb::user_id_t id) 759558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice{ 760987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton DebuggerSP debugger_sp; 761558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 762558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 763558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice DebuggerList &debugger_list = GetDebuggerList(); 764558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice DebuggerList::iterator pos, end = debugger_list.end(); 765558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice for (pos = debugger_list.begin(); pos != end; ++pos) 766558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 767558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice if ((*pos).get()->GetID() == id) 768558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 769558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice debugger_sp = *pos; 770558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice break; 771558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 772558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 773558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice return debugger_sp; 774558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice} 7756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 776d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic void 777d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonTestPromptFormats (StackFrame *frame) 778d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 779d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (frame == NULL) 780d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return; 781d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 782d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton StreamString s; 783d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *prompt_format = 784d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{addr = '${addr}'\n}" 785d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.id = '${process.id}'\n}" 786d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.name = '${process.name}'\n}" 787d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.file.basename = '${process.file.basename}'\n}" 788d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.file.fullpath = '${process.file.fullpath}'\n}" 789d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.id = '${thread.id}'\n}" 790d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.index = '${thread.index}'\n}" 791d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.name = '${thread.name}'\n}" 792d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.queue = '${thread.queue}'\n}" 793d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.stop-reason = '${thread.stop-reason}'\n}" 794d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{target.arch = '${target.arch}'\n}" 795d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{module.file.basename = '${module.file.basename}'\n}" 796d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{module.file.fullpath = '${module.file.fullpath}'\n}" 797d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{file.basename = '${file.basename}'\n}" 798d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{file.fullpath = '${file.fullpath}'\n}" 799d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.index = '${frame.index}'\n}" 800d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.pc = '${frame.pc}'\n}" 801d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.sp = '${frame.sp}'\n}" 802d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.fp = '${frame.fp}'\n}" 803d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.flags = '${frame.flags}'\n}" 804d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rdi = '${frame.reg.rdi}'\n}" 805d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rip = '${frame.reg.rip}'\n}" 806d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rsp = '${frame.reg.rsp}'\n}" 807d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rbp = '${frame.reg.rbp}'\n}" 808d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rflags = '${frame.reg.rflags}'\n}" 809d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.xmm0 = '${frame.reg.xmm0}'\n}" 810d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.carp = '${frame.reg.carp}'\n}" 811d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.id = '${function.id}'\n}" 812d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.name = '${function.name}'\n}" 8132fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton "{function.name-with-args = '${function.name-with-args}'\n}" 814d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.addr-offset = '${function.addr-offset}'\n}" 815d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.line-offset = '${function.line-offset}'\n}" 816d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.pc-offset = '${function.pc-offset}'\n}" 817d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.file.basename = '${line.file.basename}'\n}" 818d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.file.fullpath = '${line.file.fullpath}'\n}" 819d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.number = '${line.number}'\n}" 820d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.start-addr = '${line.start-addr}'\n}" 821d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.end-addr = '${line.end-addr}'\n}" 822d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton; 823d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 824d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextEverything)); 825d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ExecutionContext exe_ctx; 826a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton frame->CalculateExecutionContext(exe_ctx); 827d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *end = NULL; 828d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (Debugger::FormatPrompt (prompt_format, &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, &end)) 829d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 830d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf("%s\n", s.GetData()); 831d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 832d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 833d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 834d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf ("error: at '%s'\n", end); 835d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf ("what we got: %s\n", s.GetData()); 836d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 837d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 838d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 8399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool 8402c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanFormatDescriptor (const char* var_name_begin, 8412c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_end, 8422c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** var_name_final, 8432c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** percent_position, 844987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Format* custom_format, 8452c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata ValueObject::ValueObjectRepresentationStyle* val_obj_display) 8469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 847de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 8489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *percent_position = ::strchr(var_name_begin,'%'); 849107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!*percent_position || *percent_position > var_name_end) 850de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 851de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 852de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("no format descriptor in string, skipping"); 8539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final = var_name_end; 854de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 8559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 8569762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 8579762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final = *percent_position; 8589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char* format_name = new char[var_name_end-*var_name_final]; format_name[var_name_end-*var_name_final-1] = '\0'; 8599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata memcpy(format_name, *var_name_final+1, var_name_end-*var_name_final-1); 860de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 861de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("parsing %s as a format descriptor", format_name); 8629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if ( !FormatManager::GetFormatFromCString(format_name, 8639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata true, 8649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *custom_format) ) 8659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 866de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 867de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("%s is an unknown format", format_name); 8689762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // if this is an @ sign, print ObjC description 869107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*format_name == '@') 870cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleLanguageSpecific; 8719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // if this is a V, print the value using the default format 872de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'V') 873cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 874e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // if this is an L, print the location of the value 875de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'L') 876cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleLocation; 877e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // if this is an S, print the summary after all 878de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'S') 879cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleSummary; 8804e5397c1127d698c61df295f30909e573a1c9876Enrico Granata else if (*format_name == '#') 881cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleChildrenCount; 8826f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata else if (*format_name == 'T') 883cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleType; 884de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (log) 885de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("%s is an error, leaving the previous value alone", format_name); 8869762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 8879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // a good custom format tells us to print the value using it 8889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 889de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 890de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 891de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("will display value for this VO"); 892cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 893de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 8949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata delete format_name; 8959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 896de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 897de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("final format description outcome: custom_format = %d, val_obj_display = %d", 898de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata *custom_format, 899de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata *val_obj_display); 9009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 9019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 9029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 9039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool 9042c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanBracketedRange (const char* var_name_begin, 9052c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_end, 9062c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_final, 9072c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** open_bracket_position, 9082c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** separator_position, 9092c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** close_bracket_position, 9102c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** var_name_final_if_array_range, 9112c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata int64_t* index_lower, 9122c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata int64_t* index_higher) 9139762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 914de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 9159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *open_bracket_position = ::strchr(var_name_begin,'['); 916107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*open_bracket_position && *open_bracket_position < var_name_final) 9179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 9189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *separator_position = ::strchr(*open_bracket_position,'-'); // might be NULL if this is a simple var[N] bitfield 9199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *close_bracket_position = ::strchr(*open_bracket_position,']'); 9209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // as usual, we assume that [] will come before % 9219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata //printf("trying to expand a []\n"); 9229762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final_if_array_range = *open_bracket_position; 923107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*close_bracket_position - *open_bracket_position == 1) 9249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 925de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 926de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("[] detected.. going from 0 to end of data"); 9279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = 0; 9289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 9299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else if (*separator_position == NULL || *separator_position > var_name_end) 9309762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 9319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char *end = NULL; 9329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 9339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = *index_lower; 934de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 9357e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda log->Printf("[%lld] detected, high index is same", *index_lower); 9369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 937107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (*close_bracket_position && *close_bracket_position < var_name_end) 9389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 9399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char *end = NULL; 9409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 9419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = ::strtoul (*separator_position+1, &end, 0); 942de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 9437e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda log->Printf("[%lld-%lld] detected", *index_lower, *index_higher); 9449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 9459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 946de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 947de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 948de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("expression is erroneous, cannot extract indices out of it"); 9499762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return false; 950de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 9519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (*index_lower > *index_higher && *index_higher > 0) 9529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 953de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 954de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("swapping indices"); 9559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata int temp = *index_lower; 9569762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = *index_higher; 9579762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = temp; 9589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 9599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 960de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (log) 961de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("no bracketed range, skipping entirely"); 9629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 9639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 9649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 9659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 9669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic ValueObjectSP 9672c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataExpandExpressionPath (ValueObject* valobj, 9682c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata StackFrame* frame, 9692c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata bool* do_deref_pointer, 9702c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_begin, 9712c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_final, 9722c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata Error& error) 9739762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 974de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 9759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata StreamString sstring; 9769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata VariableSP var_sp; 9779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 978107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*do_deref_pointer) 979de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 980de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 981de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("been told to deref_pointer by caller"); 9829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata sstring.PutChar('*'); 983de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 984f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata else if (valobj->IsDereferenceOfParent() && ClangASTContext::IsPointerType(valobj->GetParent()->GetClangType()) && !valobj->IsArrayItemForPointer()) 9859762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 986de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 987de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("decided to deref_pointer myself"); 9889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata sstring.PutChar('*'); 9899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *do_deref_pointer = true; 9909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 9919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 992cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata valobj->GetExpressionPath(sstring, true, ValueObject::eGetExpressionPathFormatHonorPointers); 993de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 994de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("expression path to expand in phase 0: %s",sstring.GetData()); 9959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata sstring.PutRawBytes(var_name_begin+3, var_name_final-var_name_begin-3); 996de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 997de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("expression path to expand in phase 1: %s",sstring.GetData()); 9989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata std::string name = std::string(sstring.GetData()); 9999762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata ValueObjectSP target = frame->GetValueForVariableExpressionPath (name.c_str(), 10009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata eNoDynamicValues, 10019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 0, 10029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata var_sp, 10039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata error); 10049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return target; 10059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 10069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 10079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic ValueObjectSP 10082c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataExpandIndexedExpression (ValueObject* valobj, 10092c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata uint32_t index, 10102c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata StackFrame* frame, 10112c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata bool deref_pointer) 10129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1013de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 1014ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* ptr_deref_format = "[%d]"; 1015ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata std::auto_ptr<char> ptr_deref_buffer(new char[10]); 1016ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ::sprintf(ptr_deref_buffer.get(), ptr_deref_format, index); 1017de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1018de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("name to deref: %s",ptr_deref_buffer.get()); 1019ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* first_unparsed; 1020ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::GetValueForExpressionPathOptions options; 1021ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathEndResultType final_value_type; 1022ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop; 1023cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathAftermath what_next = (deref_pointer ? ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); 1024f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObjectSP item = valobj->GetValueForExpressionPath (ptr_deref_buffer.get(), 1025ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &first_unparsed, 1026ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &reason_to_stop, 1027ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &final_value_type, 1028ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1029ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &what_next); 1030ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!item) 1031ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1032de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1033de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("ERROR: unparsed portion = %s, why stopping = %d," 1034de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1035ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 10369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1037ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1038ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1039de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1040de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("ALL RIGHT: unparsed portion = %s, why stopping = %d," 1041de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1042ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1043ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 10449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return item; 10459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 10469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1047d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonbool 1048d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::FormatPrompt 1049d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton( 1050d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *format, 1051d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const SymbolContext *sc, 1052d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const ExecutionContext *exe_ctx, 1053d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const Address *addr, 1054d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Stream &s, 10551391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char **end, 1056f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObject* valobj 1057d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton) 1058d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 1059f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObject* realvalobj = NULL; // makes it super-easy to parse pointers 1060d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool success = true; 1061d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *p; 1062de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 1063d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton for (p = format; *p != '\0'; ++p) 1064d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1065f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (realvalobj) 10661391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1067f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata valobj = realvalobj; 1068f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata realvalobj = NULL; 10691391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 1070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton size_t non_special_chars = ::strcspn (p, "${}\\"); 1071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (non_special_chars > 0) 1072d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1073d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (success) 1074d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Write (p, non_special_chars); 1075d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton p += non_special_chars; 1076d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1077d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1078d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p == '\0') 1079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1081d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '{') 1083d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1084d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Start a new scope that must have everything it needs if it is to 1085d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // to make it into the final output stream "s". If you want to make 1086d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // a format that only prints out the function or symbol name if there 1087d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // is one in the symbol context you can use: 1088d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // "{function =${function.name}}" 1089d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // The first '{' starts a new scope that end with the matching '}' at 1090d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // the end of the string. The contents "function =${function.name}" 1091d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // will then be evaluated and only be output if there is a function 1092d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // or symbol with a valid name. 1093d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton StreamString sub_strm; 1094d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1095d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; // Skip the '{' 1096d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1097f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (FormatPrompt (p, sc, exe_ctx, addr, sub_strm, &p, valobj)) 1098d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1099d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // The stream had all it needed 1100d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Write(sub_strm.GetData(), sub_strm.GetSize()); 1101d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1102d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p != '}') 1103d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1104d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton success = false; 1105d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1106d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1107d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1108d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '}') 1109d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1110d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // End of a enclosing scope 1111d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1112d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1113d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '$') 1114d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1115d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We have a prompt variable to print 1116d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; 1117d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p == '{') 1118d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1119d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; 1120d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *var_name_begin = p; 1121d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *var_name_end = ::strchr (p, '}'); 1122d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1123d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_name_end && var_name_begin < var_name_end) 1124d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1125d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // if we have already failed to parse, skip this variable 1126d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (success) 1127d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1128d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *cstr = NULL; 1129d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Address format_addr; 1130d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool calculate_format_addr_function_offset = false; 1131d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Set reg_kind and reg_num to invalid values 1132d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton RegisterKind reg_kind = kNumRegisterKinds; 1133d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton uint32_t reg_num = LLDB_INVALID_REGNUM; 1134d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton FileSpec format_file_spec; 1135b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info = NULL; 1136d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton RegisterContext *reg_ctx = NULL; 11379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata bool do_deref_pointer = false; 1138cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 1139cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathEndResultType final_value_type = ValueObject::eExpressionPathEndResultTypePlain; 1140ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1141d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Each variable must set success to true below... 1142d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool var_success = false; 1143d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton switch (var_name_begin[0]) 1144d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 11451391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata case '*': 11461391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata case 'v': 1147979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata case 's': 11481391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1149f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (!valobj) 1150979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 1151979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1152afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 1153afb7c85df796f74262917e44dd68f668dade3911Enrico Granata log->Printf("initial string: %s",var_name_begin); 1154afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1155979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // check for *var and *svar 1156979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin == '*') 1157979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1158979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata do_deref_pointer = true; 1159979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata var_name_begin++; 1160979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1161afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1162afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 1163afb7c85df796f74262917e44dd68f668dade3911Enrico Granata log->Printf("initial string: %s",var_name_begin); 1164afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1165979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin == 's') 1166979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1167cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata valobj = valobj->GetSyntheticValue().get(); 1168cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!valobj) 1169cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1170979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata var_name_begin++; 1171979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1172979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1173afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 1174afb7c85df796f74262917e44dd68f668dade3911Enrico Granata log->Printf("initial string: %s",var_name_begin); 1175afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1176979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // should be a 'v' by now 1177979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin != 'v') 1178979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 1179979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1180afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 1181afb7c85df796f74262917e44dd68f668dade3911Enrico Granata log->Printf("initial string: %s",var_name_begin); 1182afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1183ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathAftermath what_next = (do_deref_pointer ? 1184cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); 1185ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::GetValueForExpressionPathOptions options; 11869c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata options.DontCheckDotVsArrowSyntax().DoAllowBitfieldSyntax().DoAllowFragileIVar().DoAllowSyntheticChildren(); 1187cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ValueObjectRepresentationStyle val_obj_display = ValueObject::eValueObjectRepresentationStyleSummary; 1188107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ValueObject* target = NULL; 1189987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Format custom_format = eFormatInvalid; 1190107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* var_name_final = NULL; 1191107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* var_name_final_if_array_range = NULL; 1192107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* close_bracket_position = NULL; 1193107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton int64_t index_lower = -1; 1194107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton int64_t index_higher = -1; 1195107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton bool is_array_range = false; 1196ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* first_unparsed; 11971c61743af946076e988d88baf725382e99d905deEnrico Granata bool was_plain_var = false; 11981c61743af946076e988d88baf725382e99d905deEnrico Granata bool was_var_format = false; 1199ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1200f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (!valobj) break; 1201f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata // simplest case ${var}, just print valobj's value 1202107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (::strncmp (var_name_begin, "var}", strlen("var}")) == 0) 1203107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 12041c61743af946076e988d88baf725382e99d905deEnrico Granata was_plain_var = true; 1205f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj; 1206cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1207107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1208107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (::strncmp(var_name_begin,"var%",strlen("var%")) == 0) 1209107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 12101c61743af946076e988d88baf725382e99d905deEnrico Granata was_var_format = true; 1211107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this is a variable with some custom format applied to it 1212107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* percent_position; 1213f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj; 1214cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1215107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanFormatDescriptor (var_name_begin, 1216107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1217107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final, 1218107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &percent_position, 1219107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &custom_format, 1220107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &val_obj_display); 1221107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1222107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this is ${var.something} or multiple .something nested 1223107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (::strncmp (var_name_begin, "var", strlen("var")) == 0) 12241391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1225107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1226107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* percent_position; 1227107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanFormatDescriptor (var_name_begin, 1228107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1229107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final, 1230107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &percent_position, 1231107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &custom_format, 1232107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &val_obj_display); 1233107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1234107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* open_bracket_position; 1235107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* separator_position; 1236107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanBracketedRange (var_name_begin, 1237107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1238107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_final, 1239107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &open_bracket_position, 1240107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &separator_position, 1241107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &close_bracket_position, 1242107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final_if_array_range, 1243107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &index_lower, 1244107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &index_higher); 1245107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1246107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton Error error; 1247ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1248ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata std::auto_ptr<char> expr_path(new char[var_name_final-var_name_begin-1]); 1249ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ::memset(expr_path.get(), 0, var_name_final-var_name_begin-1); 1250ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata memcpy(expr_path.get(), var_name_begin+3,var_name_final-var_name_begin-3); 1251ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1252de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1253de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("symbol to expand: %s",expr_path.get()); 1254ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1255f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj->GetValueForExpressionPath(expr_path.get(), 1256ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &first_unparsed, 1257ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &reason_to_stop, 1258ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &final_value_type, 1259ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1260ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &what_next).get(); 1261ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1262ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!target) 1263107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1264de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1265de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("ERROR: unparsed portion = %s, why stopping = %d," 1266de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1267ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1268ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 12699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1270ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1271ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1272de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1273de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("ALL RIGHT: unparsed portion = %s, why stopping = %d," 1274de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1275ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1276ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1277107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1278107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 12799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata break; 1280ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1281cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata is_array_range = (final_value_type == ValueObject::eExpressionPathEndResultTypeBoundedRange || 1282cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata final_value_type == ValueObject::eExpressionPathEndResultTypeUnboundedRange); 1283ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1284cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata do_deref_pointer = (what_next == ValueObject::eExpressionPathAftermathDereference); 1285107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 128613cb5406e7f013ca7c15b370ec2fa72f9a911ab5Enrico Granata if (do_deref_pointer && !is_array_range) 12879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1288107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // I have not deref-ed yet, let's do it 1289107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this happens when we are not going through GetValueForVariableExpressionPath 1290107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // to get to the target ValueObject 1291107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton Error error; 1292107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton target = target->Dereference(error).get(); 12932c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata if (error.Fail()) 12942c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata { 12952c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata if (log) 12962c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata log->Printf("ERROR: %s\n", error.AsCString("unknown")); \ 12972c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata break; 12982c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata } 1299107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton do_deref_pointer = false; 13009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 130186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 13021c61743af946076e988d88baf725382e99d905deEnrico Granata // TODO use flags for these 130386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool is_array = ClangASTContext::IsArrayType(target->GetClangType()); 130486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool is_pointer = ClangASTContext::IsPointerType(target->GetClangType()); 13051c61743af946076e988d88baf725382e99d905deEnrico Granata bool is_aggregate = ClangASTContext::IsAggregateType(target->GetClangType()); 130686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1307cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((is_array || is_pointer) && (!is_array_range) && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) // this should be wrong, but there are some exceptions 130886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 13091c61743af946076e988d88baf725382e99d905deEnrico Granata StreamString str_temp; 1310de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1311de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("I am into array || pointer && !range"); 13126f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 1313cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (target->HasSpecialPrintableRepresentation(val_obj_display, 1314cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format)) 13151c61743af946076e988d88baf725382e99d905deEnrico Granata { 13166f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // try to use the special cases 13176f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = target->DumpPrintableRepresentation(str_temp, 13186f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata val_obj_display, 13196f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata custom_format); 13206f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (log) 13216f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata log->Printf("special cases did%s match", var_success ? "" : "n't"); 13226f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 13236f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // should not happen 13246f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (!var_success) 13256f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << "<invalid usage of pointer value as object>"; 13266f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata else 13276f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << str_temp.GetData(); 13281c61743af946076e988d88baf725382e99d905deEnrico Granata var_success = true; 13296f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata break; 13301c61743af946076e988d88baf725382e99d905deEnrico Granata } 13311c61743af946076e988d88baf725382e99d905deEnrico Granata else 13326f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 1333ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata if (was_plain_var) // if ${var} 13346f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 13356f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 13366f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 1337ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata else if (is_pointer) // if pointer, value is the address stored 1338ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata { 1339cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata var_success = target->DumpPrintableRepresentation(s, 1340ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata val_obj_display, 1341cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format, 1342cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ePrintableRepresentationSpecialCasesDisable); 1343ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata } 13446f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata else 13456f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 13466f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << "<invalid usage of pointer value as object>"; 13476f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 13486f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = true; 13496f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata break; 13506f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 13516f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 13526f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 13536f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // if directly trying to print ${var}, and this is an aggregate, display a nice 13546f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // type @ location message 13556f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (is_aggregate && was_plain_var) 13566f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 13576f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 13586f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = true; 13591c61743af946076e988d88baf725382e99d905deEnrico Granata break; 13601c61743af946076e988d88baf725382e99d905deEnrico Granata } 13611c61743af946076e988d88baf725382e99d905deEnrico Granata 13626f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // if directly trying to print ${var%V}, and this is an aggregate, do not let the user do it 1363cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_aggregate && ((was_var_format && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue))) 13641c61743af946076e988d88baf725382e99d905deEnrico Granata { 13651c61743af946076e988d88baf725382e99d905deEnrico Granata s << "<invalid use of aggregate type>"; 13661c61743af946076e988d88baf725382e99d905deEnrico Granata var_success = true; 136786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata break; 136886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 1369107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1370107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!is_array_range) 1371de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1372de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1373de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("dumping ordinary printable output"); 1374107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success = target->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1375de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 1376107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 1377de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1378de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1379de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("checking if I can handle as array"); 1380107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!is_array && !is_pointer) 1381107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton break; 1382de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1383de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("handle as array"); 1384ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* special_directions = NULL; 1385ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata StreamString special_directions_writer; 1386107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (close_bracket_position && (var_name_end-close_bracket_position > 1)) 1387107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1388ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString additional_data; 1389ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata additional_data.SetCStringWithLength(close_bracket_position+1, var_name_end-close_bracket_position-1); 1390ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata special_directions_writer.Printf("${%svar%s}", 1391ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata do_deref_pointer ? "*" : "", 1392ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata additional_data.GetCString()); 1393ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata special_directions = special_directions_writer.GetData(); 1394107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 13959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1396107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // let us display items index_lower thru index_higher of this array 1397107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar('['); 1398107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success = true; 1399107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1400107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (index_higher < 0) 1401f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata index_higher = valobj->GetNumChildren() - 1; 1402107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1403b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton uint32_t max_num_children = target->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); 1404018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 1405107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton for (;index_lower<=index_higher;index_lower++) 1406107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1407567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObject* item = ExpandIndexedExpression (target, 1408567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton index_lower, 1409567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx->GetFramePtr(), 1410567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton false).get(); 1411107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1412ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!item) 1413ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1414de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 14157e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda log->Printf("ERROR in getting child item at index %lld", index_lower); 1416ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1417ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1418ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1419de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1420de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata log->Printf("special_directions for child item: %s",special_directions); 1421ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1422ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1423107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!special_directions) 1424107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success &= item->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1425107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 1426107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success &= FormatPrompt(special_directions, sc, exe_ctx, addr, s, NULL, item); 1427107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1428018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata if (--max_num_children == 0) 1429018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata { 1430018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata s.PutCString(", ..."); 1431018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata break; 1432018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata } 1433018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 1434107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (index_lower < index_higher) 1435107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar(','); 1436107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1437107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar(']'); 14389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 14391391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 14409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata break; 1441d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'a': 1442d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "addr}", strlen("addr}")) == 0) 1443d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1444d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (addr && addr->IsValid()) 1445d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1446d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 1447d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = *addr; 1448d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1449d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1450f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "ansi.", strlen("ansi.")) == 0) 1451f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1452f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = true; 1453f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("ansi."); // Skip the "ansi." 1454f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "fg.", strlen("fg.")) == 0) 1455f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1456f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("fg."); // Skip the "fg." 1457f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0) 1458f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1459f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1460f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1461f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_black, 1462f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1463f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1464f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0) 1465f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1466f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1467f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1468f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_red, 1469f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1470f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1471f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0) 1472f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1473f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1474f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1475f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_green, 1476f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1477f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1478f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0) 1479f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1480f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1481f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1482f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_yellow, 1483f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1484f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1485f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0) 1486f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1487f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1488f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1489f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_blue, 1490f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1491f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1492f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0) 1493f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1494f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1495f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1496f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_purple, 1497f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1498f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1499f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0) 1500f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1501f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1502f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1503f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_cyan, 1504f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1505f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1506f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0) 1507f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1508f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1509f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1510f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_white, 1511f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1512f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1513f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1514f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1515f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1516f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1517f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1518f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "bg.", strlen("bg.")) == 0) 1519f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1520f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("bg."); // Skip the "bg." 1521f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0) 1522f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1523f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1524f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1525f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_black, 1526f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1527f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1528f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0) 1529f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1530f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1531f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1532f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_red, 1533f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1534f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1535f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0) 1536f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1537f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1538f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1539f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_green, 1540f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1541f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1542f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0) 1543f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1544f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1545f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1546f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_yellow, 1547f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1548f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1549f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0) 1550f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1551f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1552f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1553f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_blue, 1554f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1555f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1556f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0) 1557f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1558f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1559f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1560f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_purple, 1561f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1562f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1563f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0) 1564f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1565f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1566f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1567f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_cyan, 1568f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1569f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1570f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0) 1571f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1572f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1573f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1574f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_white, 1575f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1576f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1577f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1578f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1579f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1580f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1581f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1582f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "normal}", strlen ("normal}")) == 0) 1583f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1584f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1585f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1586f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_normal, 1587f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1588f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1589f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "bold}", strlen("bold}")) == 0) 1590f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1591f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1592f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1593f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_bold, 1594f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1595f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1596f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "faint}", strlen("faint}")) == 0) 1597f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1598f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1599f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1600f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_faint, 1601f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1602f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1603f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "italic}", strlen("italic}")) == 0) 1604f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1605f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1606f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1607f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_italic, 1608f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1609f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1610f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "underline}", strlen("underline}")) == 0) 1611f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1612f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1613f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1614f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_underline, 1615f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1616f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1617f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "slow-blink}", strlen("slow-blink}")) == 0) 1618f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1619f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1620f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1621f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_slow_blink, 1622f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1623f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1624f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "fast-blink}", strlen("fast-blink}")) == 0) 1625f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1626f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1627f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1628f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_fast_blink, 1629f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1630f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1631f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "negative}", strlen("negative}")) == 0) 1632f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1633f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1634f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1635f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_negative, 1636f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1637f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1638f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "conceal}", strlen("conceal}")) == 0) 1639f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1640f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1641f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1642f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_conceal, 1643f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1644f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton 1645f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1646f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "crossed-out}", strlen("crossed-out}")) == 0) 1647f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1648f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1649f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1650f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_crossed_out, 1651f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1652f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1653f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1654f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1655f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1656f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1657f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1658d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1659d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1660d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'p': 1661d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "process.", strlen("process.")) == 0) 1662d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1663567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1664d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1665567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 1666567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 1667d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1668567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("process."); 1669567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 1670d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1671444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton s.Printf("%llu", process->GetID()); 1672567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1673567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1674567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if ((::strncmp (var_name_begin, "name}", strlen("name}")) == 0) || 1675567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton (::strncmp (var_name_begin, "file.basename}", strlen("file.basename}")) == 0) || 1676567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton (::strncmp (var_name_begin, "file.fullpath}", strlen("file.fullpath}")) == 0)) 1677567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1678567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Module *exe_module = process->GetTarget().GetExecutableModulePointer(); 1679567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_module) 1680d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1681567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f') 1682567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1683567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename(); 1684567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = format_file_spec; 1685567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1686567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else 1687567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1688567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_file_spec = exe_module->GetFileSpec(); 1689567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = format_file_spec; 1690567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1691d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1692d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1693d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1694567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1695d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1696d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1697d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1698d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 't': 1699d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "thread.", strlen("thread.")) == 0) 1700d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1701567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1702d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1703567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Thread *thread = exe_ctx->GetThreadPtr(); 1704567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread) 1705d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1706567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("thread."); 1707567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 1708d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1709444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton s.Printf("0x%4.4llx", thread->GetID()); 1710567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1711567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1712567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) 1713567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1714567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.Printf("%u", thread->GetIndexID()); 1715567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1716567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1717567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) 1718567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1719567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = thread->GetName(); 1720567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = cstr && cstr[0]; 1721567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_success) 1722d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutCString(cstr); 1723567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1724567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "queue}", strlen("queue}")) == 0) 1725567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1726567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = thread->GetQueueName(); 1727567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = cstr && cstr[0]; 1728567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_success) 1729567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.PutCString(cstr); 1730567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1731567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "stop-reason}", strlen("stop-reason}")) == 0) 1732567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1733567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo (); 1734567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (stop_info_sp) 1735567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1736567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = stop_info_sp->GetDescription(); 1737567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (cstr && cstr[0]) 1738567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1739567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.PutCString(cstr); 1740567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1741567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1742d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1743d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 17441586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham else if (::strncmp (var_name_begin, "return-value}", strlen("return-value}")) == 0) 17451586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 17461586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham StopInfoSP stop_info_sp = thread->GetStopInfo (); 17471586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham if (stop_info_sp) 17481586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 17491586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham ValueObjectSP return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp); 17501586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham if (return_valobj_sp) 17511586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 1752016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham ValueObject::DumpValueObjectOptions dump_options; 1753016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham ValueObject::DumpValueObject (s, return_valobj_sp.get(), dump_options); 1754016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham var_success = true; 17551586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 17561586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 17571586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 1758d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1759d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1760d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1761d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "target.", strlen("target.")) == 0) 1762d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1763a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 1764a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (target) 1765d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1766d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("target."); 1767d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "arch}", strlen("arch}")) == 0) 1768d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1769d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ArchSpec arch (target->GetArchitecture ()); 1770d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (arch.IsValid()) 1771d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1772940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton s.PutCString (arch.GetArchitectureName()); 1773d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 1774d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1775d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1776d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1777d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1778d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1779d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1780d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1781d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'm': 1782d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "module.", strlen("module.")) == 0) 1783d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1784a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc && sc->module_sp.get()) 1785d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1786a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Module *module = sc->module_sp.get(); 1787d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("module."); 1788d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1789d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 1790d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1791d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (module->GetFileSpec()) 1792d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1793d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 1794d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1795d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 1796d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1797d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = module->GetFileSpec().GetFilename(); 1798d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 1799d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1800d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 1801d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1802d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = module->GetFileSpec(); 1803d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 1804d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1805d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1806d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1807d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1808d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1809d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1810d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1811d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1812d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'f': 1813d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 1814d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1815d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && sc->comp_unit != NULL) 1816d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1817d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 1818d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1819d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 1820d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1821d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = sc->comp_unit->GetFilename(); 1822d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 1823d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1824d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 1825d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1826d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = *sc->comp_unit; 1827d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 1828d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1829d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1830d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1831d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "frame.", strlen("frame.")) == 0) 1832d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1833567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1834d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1835567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 1836567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame) 1837d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1838567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("frame."); 1839567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) 1840567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1841567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.Printf("%u", frame->GetFrameIndex()); 1842567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1843567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1844567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "pc}", strlen("pc}")) == 0) 1845567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1846567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 1847567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_PC; 1848567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1849567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1850567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "sp}", strlen("sp}")) == 0) 1851567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1852567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 1853567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_SP; 1854567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1855567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1856567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "fp}", strlen("fp}")) == 0) 1857567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1858567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 1859567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FP; 1860567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1861567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1862567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "flags}", strlen("flags}")) == 0) 1863567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1864567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 1865567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FLAGS; 1866567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1867567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1868567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "reg.", strlen ("reg.")) == 0) 1869d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1870567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 1871567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (reg_ctx) 1872d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1873567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("reg."); 1874567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_name_begin < var_name_end) 1875567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1876567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton std::string reg_name (var_name_begin, var_name_end); 1877567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str()); 1878567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (reg_info) 1879567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1880567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1881d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1882d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1883d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1884d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1885d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1886d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "function.", strlen("function.")) == 0) 1887d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1888d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && (sc->function != NULL || sc->symbol != NULL)) 1889d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1890d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("function."); 1891d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 1892d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1893d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc->function) 1894444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton s.Printf("function{0x%8.8llx}", sc->function->GetID()); 1895d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 1896d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf("symbol[%u]", sc->symbol->GetID()); 1897d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1898d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 1899d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1900d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) 1901d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1902d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc->function) 1903d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton cstr = sc->function->GetName().AsCString (NULL); 1904d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (sc->symbol) 1905d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 1906d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (cstr) 1907d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1908d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutCString(cstr); 1909b7af177d19c625088864845c89c16465c424df5aGreg Clayton 1910b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (sc->block) 1911b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 1912b7af177d19c625088864845c89c16465c424df5aGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 1913b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_block) 1914b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 1915b7af177d19c625088864845c89c16465c424df5aGreg Clayton const InlineFunctionInfo *inline_info = sc->block->GetInlinedFunctionInfo(); 1916b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_info) 1917b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 1918b7af177d19c625088864845c89c16465c424df5aGreg Clayton s.PutCString(" [inlined] "); 1919b7af177d19c625088864845c89c16465c424df5aGreg Clayton inline_info->GetName().Dump(&s); 1920b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 1921b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 1922b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 1923d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 1924d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1925d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1926f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else if (::strncmp (var_name_begin, "name-with-args}", strlen("name-with-args}")) == 0) 1927f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1928f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton // Print the function name with arguments in it 1929f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 1930f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (sc->function) 1931f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1932f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton var_success = true; 1933f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton ExecutionContextScope *exe_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL; 1934f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = sc->function->GetName().AsCString (NULL); 1935f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (cstr) 1936f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1937f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const InlineFunctionInfo *inline_info = NULL; 1938f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableListSP variable_list_sp; 1939f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton bool get_function_vars = true; 1940f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (sc->block) 1941f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1942f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 1943f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 1944f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_block) 1945f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1946f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton get_function_vars = false; 1947f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton inline_info = sc->block->GetInlinedFunctionInfo(); 1948f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_info) 1949f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton variable_list_sp = inline_block->GetBlockVariableList (true); 1950f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 1951f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 1952f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 1953f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (get_function_vars) 1954f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1955f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton variable_list_sp = sc->function->GetBlock(true).GetBlockVariableList (true); 1956f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 1957f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 1958f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_info) 1959f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1960f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (cstr); 1961f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (" [inlined] "); 1962f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = inline_info->GetName().GetCString(); 1963f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 1964f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 1965f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableList args; 1966f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (variable_list_sp) 1967f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1968f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const size_t num_variables = variable_list_sp->GetSize(); 1969f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton for (size_t var_idx = 0; var_idx < num_variables; ++var_idx) 1970f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1971f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableSP var_sp (variable_list_sp->GetVariableAtIndex(var_idx)); 1972f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (var_sp->GetScope() == eValueTypeVariableArgument) 1973f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton args.AddVariable (var_sp); 1974f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 1975f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 1976f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 1977f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (args.GetSize() > 0) 1978f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1979f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *open_paren = strchr (cstr, '('); 1980f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *close_paren = NULL; 1981f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (open_paren) 1982f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton close_paren = strchr (open_paren, ')'); 1983f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 1984f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (open_paren) 1985f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.Write(cstr, open_paren - cstr + 1); 1986f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 1987f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1988f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (cstr); 1989f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutChar ('('); 1990f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 1991c43e7b88339a0267220c56b7207955d035fea4cbGreg Clayton const size_t num_args = args.GetSize(); 1992f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton for (size_t arg_idx = 0; arg_idx < num_args; ++arg_idx) 1993f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 1994f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableSP var_sp (args.GetVariableAtIndex (arg_idx)); 1995f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton ValueObjectSP var_value_sp (ValueObjectVariable::Create (exe_scope, var_sp)); 1996f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *var_name = var_value_sp->GetName().GetCString(); 1997f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *var_value = var_value_sp->GetValueAsCString(); 1998f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (var_value_sp->GetError().Success()) 1999f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2000f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (arg_idx > 0) 2001f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (", "); 2002f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.Printf ("%s=%s", var_name, var_value); 2003f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2004f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2005f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2006f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (close_paren) 2007f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (close_paren); 2008f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2009f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutChar(')'); 2010f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2011f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2012f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2013f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2014f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString(cstr); 2015f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2016f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2017f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2018f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else if (sc->symbol) 2019f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2020f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 2021f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (cstr) 2022f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2023f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString(cstr); 2024f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton var_success = true; 2025f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2026f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2027f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2028d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "addr-offset}", strlen("addr-offset}")) == 0) 2029d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2030d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = addr != NULL; 2031d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2032d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2033d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = *addr; 2034d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2035d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2036d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2037d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "line-offset}", strlen("line-offset}")) == 0) 2038d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2039d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = sc->line_entry.range.GetBaseAddress().IsValid(); 2040d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2041d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2042d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 2043d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2044d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2045d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2046d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "pc-offset}", strlen("pc-offset}")) == 0) 2047d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2048567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2049567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = frame != NULL; 2050d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2051d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2052567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_addr = frame->GetFrameCodeAddress(); 2053d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2054d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2055d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2056d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2057d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2058d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2059d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2060d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'l': 2061d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "line.", strlen("line.")) == 0) 2062d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2063d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && sc->line_entry.IsValid()) 2064d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2065d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("line."); 2066d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 2067d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2068d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2069d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 2071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2072d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = sc->line_entry.file.GetFilename(); 2073d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2074d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2075d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 2076d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2077d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = sc->line_entry.file; 2078d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2081d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "number}", strlen("number}")) == 0) 2082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2083d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2084d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf("%u", sc->line_entry.line); 2085d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2086d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if ((::strncmp (var_name_begin, "start-addr}", strlen("start-addr}")) == 0) || 2087d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton (::strncmp (var_name_begin, "end-addr}", strlen("end-addr}")) == 0)) 2088d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2089d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = sc && sc->line_entry.range.GetBaseAddress().IsValid(); 2090d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2091d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2092d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 2093d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_name_begin[0] == 'e') 2094d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr.Slide (sc->line_entry.range.GetByteSize()); 2095d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2096d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2097d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2098d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2099d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2100d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2101d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2102d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2103d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2104d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // If format addr is valid, then we need to print an address 2105d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_num != LLDB_INVALID_REGNUM) 2106d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2107567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2108d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We have a register value to display... 2109d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_num == LLDB_REGNUM_GENERIC_PC && reg_kind == eRegisterKindGeneric) 2110d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2111567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_addr = frame->GetFrameCodeAddress(); 2112d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2113d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2114d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2115d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_ctx == NULL) 2116567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 2117d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2118d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_ctx) 2119d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2120d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_kind != kNumRegisterKinds) 2121d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(reg_kind, reg_num); 2122d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_num); 2123d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = reg_info != NULL; 2124d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2125d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2126d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2127d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2128d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_info != NULL) 2129d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2130061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 2131061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton var_success = reg_ctx->ReadRegister (reg_info, reg_value); 2132061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (var_success) 2133d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2134997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton reg_value.Dump(&s, reg_info, false, false, eFormatDefault); 2135d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2136d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2137d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2138d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (format_file_spec) 2139d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2140d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s << format_file_spec; 2141d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2142d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2143d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // If format addr is valid, then we need to print an address 2144d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (format_addr.IsValid()) 2145d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2146a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = false; 2147a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2148d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (calculate_format_addr_function_offset) 2149d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2150d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Address func_addr; 2151d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2152a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc) 2153a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2154a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc->function) 2155b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2156a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton func_addr = sc->function->GetAddressRange().GetBaseAddress(); 2157b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (sc->block) 2158b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2159b7af177d19c625088864845c89c16465c424df5aGreg Clayton // Check to make sure we aren't in an inline 2160b7af177d19c625088864845c89c16465c424df5aGreg Clayton // function. If we are, use the inline block 2161b7af177d19c625088864845c89c16465c424df5aGreg Clayton // range that contains "format_addr" since 2162b7af177d19c625088864845c89c16465c424df5aGreg Clayton // blocks can be discontiguous. 2163b7af177d19c625088864845c89c16465c424df5aGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2164b7af177d19c625088864845c89c16465c424df5aGreg Clayton AddressRange inline_range; 2165b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_block && inline_block->GetRangeContainingAddress (format_addr, inline_range)) 2166b7af177d19c625088864845c89c16465c424df5aGreg Clayton func_addr = inline_range.GetBaseAddress(); 2167b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2168b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 21690c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton else if (sc->symbol && sc->symbol->ValueIsAddress()) 21700c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton func_addr = sc->symbol->GetAddress(); 2171a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2172a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2173a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (func_addr.IsValid()) 2174d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2175d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (func_addr.GetSection() == format_addr.GetSection()) 2176d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2177d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t func_file_addr = func_addr.GetFileAddress(); 2178d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t addr_file_addr = format_addr.GetFileAddress(); 2179d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (addr_file_addr > func_file_addr) 2180d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf(" + %llu", addr_file_addr - func_file_addr); 2181d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (addr_file_addr < func_file_addr) 2182d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf(" - %llu", func_file_addr - addr_file_addr); 2183a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2184d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2185d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2186a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2187a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2188a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (target) 2189a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2190a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton addr_t func_load_addr = func_addr.GetLoadAddress (target); 2191a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton addr_t addr_load_addr = format_addr.GetLoadAddress (target); 2192a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (addr_load_addr > func_load_addr) 2193a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.Printf(" + %llu", addr_load_addr - func_load_addr); 2194a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else if (addr_load_addr < func_load_addr) 2195a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.Printf(" - %llu", func_load_addr - addr_load_addr); 2196a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2197a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2198a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2199d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2200d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2201d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2202d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2203a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2204d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t vaddr = LLDB_INVALID_ADDRESS; 2205a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (exe_ctx && !target->GetSectionLoadList().IsEmpty()) 2206a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton vaddr = format_addr.GetLoadAddress (target); 2207d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (vaddr == LLDB_INVALID_ADDRESS) 2208d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton vaddr = format_addr.GetFileAddress (); 2209d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2210d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (vaddr != LLDB_INVALID_ADDRESS) 2211a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2212395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton int addr_width = target->GetArchitecture().GetAddressByteSize() * 2; 22137fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton if (addr_width == 0) 22147fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton addr_width = 16; 22157fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton s.Printf("0x%*.*llx", addr_width, addr_width, vaddr); 2216a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2217a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2218d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2219d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2220d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2221d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2222d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success == false) 2223d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton success = false; 2224d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2225d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton p = var_name_end; 2226d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2227d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2228d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2229d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2230d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2231d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2232d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We got a dollar sign with no '{' after it, it must just be a dollar sign 2233d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutChar(*p); 2234d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2235d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2236d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '\\') 2237d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2238d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; // skip the slash 2239d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton switch (*p) 2240d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2241d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'a': s.PutChar ('\a'); break; 2242d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'b': s.PutChar ('\b'); break; 2243d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'f': s.PutChar ('\f'); break; 2244d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'n': s.PutChar ('\n'); break; 2245d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'r': s.PutChar ('\r'); break; 2246d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 't': s.PutChar ('\t'); break; 2247d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'v': s.PutChar ('\v'); break; 2248d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '\'': s.PutChar ('\''); break; 2249d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '\\': s.PutChar ('\\'); break; 2250d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '0': 2251d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // 1 to 3 octal chars 2252d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2253a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Make a string that can hold onto the initial zero char, 2254a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // up to 3 octal digits, and a terminating NULL. 2255a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char oct_str[5] = { 0, 0, 0, 0, 0 }; 2256a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2257a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton int i; 2258a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton for (i=0; (p[i] >= '0' && p[i] <= '7') && i<4; ++i) 2259a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton oct_str[i] = p[i]; 2260a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2261a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // We don't want to consume the last octal character since 2262a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // the main for loop will do this for us, so we advance p by 2263a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // one less than i (even if i is zero) 2264a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton p += i - 1; 2265a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton unsigned long octal_value = ::strtoul (oct_str, NULL, 8); 2266a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (octal_value <= UINT8_MAX) 2267d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2268a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char octal_char = octal_value; 2269a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.Write (&octal_char, 1); 2270d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2271d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2272d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2273d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2274d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'x': 2275d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // hex number in the format 2276a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (isxdigit(p[1])) 2277d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2278a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton ++p; // Skip the 'x' 2279d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2280a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Make a string that can hold onto two hex chars plus a 2281a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // NULL terminator 2282a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char hex_str[3] = { 0,0,0 }; 2283a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton hex_str[0] = *p; 2284a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (isxdigit(p[1])) 2285d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2286a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton ++p; // Skip the first of the two hex chars 2287a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton hex_str[1] = *p; 2288d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2289a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2290a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton unsigned long hex_value = strtoul (hex_str, NULL, 16); 2291a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (hex_value <= UINT8_MAX) 2292a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.PutChar (hex_value); 2293a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2294a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else 2295a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2296a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.PutChar('x'); 2297d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2298d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2299d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2300d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton default: 2301a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Just desensitize any other character by just printing what 2302a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // came after the '\' 2303a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s << *p; 2304d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2305d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2306d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2307d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2308d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2309d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2310d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (end) 2311d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton *end = p; 2312d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return success; 2313d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 2314d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 23156c530f2201be4788dedf3d5970399220fbd50b11Jim Inghamvoid 23166c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton) 23176c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham{ 2318d8465214c43d29755822670ad21ced2506faae7aJim Ingham // For simplicity's sake, I am not going to deal with how to close down any 2319d8465214c43d29755822670ad21ced2506faae7aJim Ingham // open logging streams, I just redirect everything from here on out to the 2320d8465214c43d29755822670ad21ced2506faae7aJim Ingham // callback. 23216c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 23226c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham} 23236c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 23246c530f2201be4788dedf3d5970399220fbd50b11Jim Inghambool 23256c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::EnableLog (const char *channel, const char **categories, const char *log_file, uint32_t log_options, Stream &error_stream) 23266c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham{ 23276c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham Log::Callbacks log_callbacks; 23286c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 23296c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham StreamSP log_stream_sp; 23306c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (m_log_callback_stream_sp != NULL) 23316c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 23326c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp = m_log_callback_stream_sp; 23336c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham // For now when using the callback mode you always get thread & timestamp. 23346c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME; 23356c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 23366c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else if (log_file == NULL || *log_file == '\0') 23376c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 23386c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp.reset(new StreamFile(GetOutputFile().GetDescriptor(), false)); 23396c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 23406c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 23416c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 23426c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham LogStreamMap::iterator pos = m_log_streams.find(log_file); 23436c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (pos == m_log_streams.end()) 23446c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 23456c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp.reset (new StreamFile (log_file)); 23466c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_streams[log_file] = log_stream_sp; 23476c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 23486c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 23496c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp = pos->second; 23506c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 23516c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham assert (log_stream_sp.get()); 23526c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 23536c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_options == 0) 23546c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 23556c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 23566c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (Log::GetLogChannelCallbacks (channel, log_callbacks)) 23576c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 23586c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_callbacks.enable (log_stream_sp, log_options, categories, &error_stream); 23596c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return true; 23606c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 23616c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 23626c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 23636c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham LogChannelSP log_channel_sp (LogChannel::FindPlugin (channel)); 23646c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_channel_sp) 23656c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 23666c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_channel_sp->Enable (log_stream_sp, log_options, &error_stream, categories)) 23676c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 23686c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return true; 23696c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 23706c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 23716c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 23726c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham error_stream.Printf ("Invalid log channel '%s'.\n", channel); 23736c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 23746c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 23756c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 23766c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 23776c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 23786c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham error_stream.Printf ("Invalid log channel '%s'.\n", channel); 23796c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 23806c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 23816c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 23826c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 23836c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham} 23846c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 2385d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Debugger::SettingsController 2386d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 23876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 2388d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// class Debugger::SettingsController 23896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 23906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2391d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::SettingsController::SettingsController () : 2392987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton UserSettingsController ("", UserSettingsControllerSP()) 23936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 23946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 23956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2396d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::SettingsController::~SettingsController () 23976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 23986e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 23996e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 24006e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2401987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonInstanceSettingsSP 2402d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::SettingsController::CreateInstanceSettings (const char *instance_name) 24036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 2404334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton InstanceSettingsSP new_settings_sp (new DebuggerInstanceSettings (GetSettingsController(), 2405334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton false, 2406334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton instance_name)); 24076e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return new_settings_sp; 24086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 24096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2410d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark DebuggerInstanceSettings 24116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 24126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice// class DebuggerInstanceSettings 24136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 24146e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2415238c0a1e7b733cee539258faa656159c63f9e893Greg ClaytonDebuggerInstanceSettings::DebuggerInstanceSettings 2416238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton( 2417334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton const UserSettingsControllerSP &m_owner_sp, 2418238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton bool live_instance, 2419238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton const char *name 2420238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton) : 2421334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton InstanceSettings (m_owner_sp, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance), 2422238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_term_width (80), 2423be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton m_stop_source_before_count (3), 2424be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton m_stop_source_after_count (3), 2425be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton m_stop_disassembly_count (4), 2426be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton m_stop_disassembly_display (eStopDisassemblyTypeNoSource), 24276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_prompt (), 2428a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton m_frame_format (), 2429a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton m_thread_format (), 24305bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice m_script_lang (), 24319305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham m_use_external_editor (false), 24329305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham m_auto_confirm_on (false) 24336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 2434396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // CopyInstanceSettings is a pure virtual function in InstanceSettings; it therefore cannot be called 2435396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // until the vtables for DebuggerInstanceSettings are properly set up, i.e. AFTER all the initializers. 2436396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice // For this reason it has to be called here, rather than in the initializer or in the parent constructor. 243775b11a343a035ab426473a785a045f0614af9984Caroline Tice // The same is true of CreateInstanceName(). 243875b11a343a035ab426473a785a045f0614af9984Caroline Tice 243975b11a343a035ab426473a785a045f0614af9984Caroline Tice if (GetInstanceName() == InstanceSettings::InvalidName()) 244075b11a343a035ab426473a785a045f0614af9984Caroline Tice { 244175b11a343a035ab426473a785a045f0614af9984Caroline Tice ChangeInstanceName (std::string (CreateInstanceName().AsCString())); 2442334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton m_owner_sp->RegisterInstanceSettings (this); 244375b11a343a035ab426473a785a045f0614af9984Caroline Tice } 2444396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice 2445396704be65012c4bdebdd9072e6b77f09cf0384bCaroline Tice if (live_instance) 24466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 2447334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton const InstanceSettingsSP &pending_settings = m_owner_sp->FindPendingSettings (m_instance_name); 24486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice CopyInstanceSettings (pending_settings, false); 24496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 24506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 24516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 24526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::DebuggerInstanceSettings (const DebuggerInstanceSettings &rhs) : 2453334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton InstanceSettings (Debugger::GetSettingsController(), CreateInstanceName ().AsCString()), 24546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_prompt (rhs.m_prompt), 2455a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton m_frame_format (rhs.m_frame_format), 2456a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton m_thread_format (rhs.m_thread_format), 24575bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice m_script_lang (rhs.m_script_lang), 24589305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham m_use_external_editor (rhs.m_use_external_editor), 24599305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham m_auto_confirm_on(rhs.m_auto_confirm_on) 24606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 2461334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton UserSettingsControllerSP owner_sp (m_owner_wp.lock()); 2462334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton if (owner_sp) 2463334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton { 2464334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton CopyInstanceSettings (owner_sp->FindPendingSettings (m_instance_name), false); 2465334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton owner_sp->RemovePendingSettings (m_instance_name); 2466334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton } 24676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 24686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 24696e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::~DebuggerInstanceSettings () 24706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 24716e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 24726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 24736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings& 24746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::operator= (const DebuggerInstanceSettings &rhs) 24756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 24766e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (this != &rhs) 24776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 2478d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton m_term_width = rhs.m_term_width; 24796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_prompt = rhs.m_prompt; 2480a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton m_frame_format = rhs.m_frame_format; 2481a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton m_thread_format = rhs.m_thread_format; 24826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_script_lang = rhs.m_script_lang; 24835bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice m_use_external_editor = rhs.m_use_external_editor; 24849305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham m_auto_confirm_on = rhs.m_auto_confirm_on; 24856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 24866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 24876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return *this; 24886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 24896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2490d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonbool 2491d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebuggerInstanceSettings::ValidTermWidthValue (const char *value, Error err) 2492d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 2493d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool valid = false; 2494d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2495d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Verify we have a value string. 2496d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (value == NULL || value[0] == '\0') 2497d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 24989c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton err.SetErrorString ("missing value, can't set terminal width without a value"); 2499d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2500d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2501d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2502d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton char *end = NULL; 2503d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const uint32_t width = ::strtoul (value, &end, 0); 2504d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2505068a34f4d0dadb689e270a1f74a836ba4d8033daJohnny Chen if (end && end[0] == '\0') 2506d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 25077a630d3016f751c625b560d6b5b1c5752e402cc4Johnny Chen if (width >= 10 && width <= 1024) 2508d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton valid = true; 2509d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 25109c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton err.SetErrorString ("invalid term-width value; value must be between 10 and 1024"); 2511d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2512d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 25139c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton err.SetErrorStringWithFormat ("'%s' is not a valid unsigned integer string", value); 2514d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2515d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2516d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return valid; 2517d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 2518d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2519d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 25206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 25216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name, 25226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *index_value, 25236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const char *value, 25246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString &instance_name, 25256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const SettingEntry &entry, 2526b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton VarSetOperationType op, 25276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice Error &err, 25286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 25296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 2530a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2531a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (var_name == TermWidthVarName()) 2532a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2533a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (ValidTermWidthValue (value, err)) 2534a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2535a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton m_term_width = ::strtoul (value, NULL, 0); 2536a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2537a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2538a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else if (var_name == PromptVarName()) 25396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 25401d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice UserSettingsController::UpdateStringVariable (op, m_prompt, value, err); 25416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (!pending) 25426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 254387097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice // 'instance_name' is actually (probably) in the form '[<instance_name>]'; if so, we need to 254487097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice // strip off the brackets before passing it to BroadcastPromptChange. 254587097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice 254687097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice std::string tmp_instance_name (instance_name.AsCString()); 254787097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice if ((tmp_instance_name[0] == '[') 254887097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice && (tmp_instance_name[instance_name.GetLength() - 1] == ']')) 254987097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice tmp_instance_name = tmp_instance_name.substr (1, instance_name.GetLength() - 2); 255087097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice ConstString new_name (tmp_instance_name.c_str()); 255187097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice 255287097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice BroadcastPromptChange (new_name, m_prompt.c_str()); 25536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 25546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 2555a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else if (var_name == GetFrameFormatName()) 2556a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2557a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton UserSettingsController::UpdateStringVariable (op, m_frame_format, value, err); 2558a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2559a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else if (var_name == GetThreadFormatName()) 2560a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2561a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton UserSettingsController::UpdateStringVariable (op, m_thread_format, value, err); 2562a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 25636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == ScriptLangVarName()) 25646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 25656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool success; 25666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_script_lang = Args::StringToScriptLanguage (value, eScriptLanguageDefault, 25676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice &success); 25686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 25695bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice else if (var_name == UseExternalEditorVarName ()) 25705bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice { 257117cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton UserSettingsController::UpdateBooleanVariable (op, m_use_external_editor, value, false, err); 25725bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice } 25739305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham else if (var_name == AutoConfirmName ()) 25749305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham { 257517cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton UserSettingsController::UpdateBooleanVariable (op, m_auto_confirm_on, value, false, err); 25769305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham } 2577be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else if (var_name == StopSourceContextBeforeName ()) 2578be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { 2579be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL); 2580be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton if (new_value != UINT32_MAX) 2581be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton m_stop_source_before_count = new_value; 2582be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else 2583be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopSourceContextAfterName ().GetCString()); 2584be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton } 2585be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else if (var_name == StopSourceContextAfterName ()) 2586be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { 2587be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL); 2588be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton if (new_value != UINT32_MAX) 2589be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton m_stop_source_after_count = new_value; 2590be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else 2591be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopSourceContextBeforeName ().GetCString()); 2592be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton } 2593be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else if (var_name == StopDisassemblyCountName ()) 2594be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { 2595be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL); 2596be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton if (new_value != UINT32_MAX) 2597be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton m_stop_disassembly_count = new_value; 2598be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else 2599be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopDisassemblyCountName ().GetCString()); 2600be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton } 2601be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else if (var_name == StopDisassemblyDisplayName ()) 2602be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { 2603be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton int new_value; 2604be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton UserSettingsController::UpdateEnumVariable (g_show_disassembly_enum_values, &new_value, value, err); 2605be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton if (err.Success()) 2606be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton m_stop_disassembly_display = (StopDisassemblyType)new_value; 2607be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton } 26086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 26096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2610bcb5b454767121980d937d2610ba762fdb575c45Caroline Ticebool 26116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry, 26126e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString &var_name, 26135bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice StringList &value, 2614bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice Error *err) 26156e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 26166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (var_name == PromptVarName()) 26176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 2618a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton value.AppendString (m_prompt.c_str(), m_prompt.size()); 26196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 26206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 26216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice else if (var_name == ScriptLangVarName()) 26226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 26236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice value.AppendString (ScriptInterpreter::LanguageToString (m_script_lang).c_str()); 26246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 26251d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice else if (var_name == TermWidthVarName()) 26261d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice { 26271d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice StreamString width_str; 2628be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton width_str.Printf ("%u", m_term_width); 26291d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice value.AppendString (width_str.GetData()); 26301d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice } 2631a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else if (var_name == GetFrameFormatName ()) 2632a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2633a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton value.AppendString(m_frame_format.c_str(), m_frame_format.size()); 2634a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2635a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else if (var_name == GetThreadFormatName ()) 2636a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2637a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton value.AppendString(m_thread_format.c_str(), m_thread_format.size()); 2638a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 26395bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice else if (var_name == UseExternalEditorVarName()) 26405bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice { 26415bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice if (m_use_external_editor) 26425bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice value.AppendString ("true"); 26435bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice else 26445bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice value.AppendString ("false"); 26455bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice } 26469305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham else if (var_name == AutoConfirmName()) 26479305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham { 26489305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham if (m_auto_confirm_on) 26499305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham value.AppendString ("true"); 26509305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham else 26519305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham value.AppendString ("false"); 26529305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham } 2653be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else if (var_name == StopSourceContextAfterName ()) 2654be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { 2655be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton StreamString strm; 2656be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton strm.Printf ("%u", m_stop_source_before_count); 2657be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton value.AppendString (strm.GetData()); 2658be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton } 2659be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else if (var_name == StopSourceContextBeforeName ()) 2660be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { 2661be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton StreamString strm; 2662be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton strm.Printf ("%u", m_stop_source_after_count); 2663be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton value.AppendString (strm.GetData()); 2664be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton } 2665be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else if (var_name == StopDisassemblyCountName ()) 2666be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { 2667be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton StreamString strm; 2668be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton strm.Printf ("%u", m_stop_disassembly_count); 2669be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton value.AppendString (strm.GetData()); 2670be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton } 2671be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else if (var_name == StopDisassemblyDisplayName ()) 2672be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton { 2673be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton if (m_stop_disassembly_display >= eStopDisassemblyTypeNever && m_stop_disassembly_display <= eStopDisassemblyTypeAlways) 2674be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton value.AppendString (g_show_disassembly_enum_values[m_stop_disassembly_display].string_value); 2675be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton else 2676be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton value.AppendString ("<invalid>"); 2677be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton } 26785bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice else 2679bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice { 2680bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice if (err) 2681bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice err->SetErrorStringWithFormat ("unrecognized variable name '%s'", var_name.AsCString()); 2682bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice return false; 2683bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice } 2684bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice return true; 26856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 26866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 26876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticevoid 2688987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebuggerInstanceSettings::CopyInstanceSettings (const InstanceSettingsSP &new_settings, 26896e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice bool pending) 26906e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 26916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (new_settings.get() == NULL) 26926e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return; 26936e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 26946e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice DebuggerInstanceSettings *new_debugger_settings = (DebuggerInstanceSettings *) new_settings.get(); 26956e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 26966e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_prompt = new_debugger_settings->m_prompt; 26976e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (!pending) 269887097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice { 269987097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice // 'instance_name' is actually (probably) in the form '[<instance_name>]'; if so, we need to 270087097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice // strip off the brackets before passing it to BroadcastPromptChange. 270187097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice 270287097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice std::string tmp_instance_name (m_instance_name.AsCString()); 270387097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice if ((tmp_instance_name[0] == '[') 270487097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice && (tmp_instance_name[m_instance_name.GetLength() - 1] == ']')) 270587097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice tmp_instance_name = tmp_instance_name.substr (1, m_instance_name.GetLength() - 2); 270687097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice ConstString new_name (tmp_instance_name.c_str()); 270787097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice 270887097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice BroadcastPromptChange (new_name, m_prompt.c_str()); 270987097234900636ba2c93f13ed4f8909fa7580b7dCaroline Tice } 2710a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton m_frame_format = new_debugger_settings->m_frame_format; 2711a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton m_thread_format = new_debugger_settings->m_thread_format; 27125bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice m_term_width = new_debugger_settings->m_term_width; 27136e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice m_script_lang = new_debugger_settings->m_script_lang; 27145bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice m_use_external_editor = new_debugger_settings->m_use_external_editor; 27159305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham m_auto_confirm_on = new_debugger_settings->m_auto_confirm_on; 27166e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 27176e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27186e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27196e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticebool 27206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::BroadcastPromptChange (const ConstString &instance_name, const char *new_prompt) 27216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 27226e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice std::string tmp_prompt; 27236e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27246e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (new_prompt != NULL) 27256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 27266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice tmp_prompt = new_prompt ; 27276e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice int len = tmp_prompt.size(); 27286e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (len > 1 27296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice && (tmp_prompt[0] == '\'' || tmp_prompt[0] == '"') 27306e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice && (tmp_prompt[len-1] == tmp_prompt[0])) 27316e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 27326e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice tmp_prompt = tmp_prompt.substr(1,len-2); 27336e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 27346e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice len = tmp_prompt.size(); 27356e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (tmp_prompt[len-1] != ' ') 27366e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice tmp_prompt.append(" "); 27376e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 27386e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice EventSP new_event_sp; 27396e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice new_event_sp.reset (new Event(CommandInterpreter::eBroadcastBitResetPrompt, 27406e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice new EventDataBytes (tmp_prompt.c_str()))); 27416e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27426e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (instance_name.GetLength() != 0) 27436e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 27446e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice // Set prompt for a particular instance. 27456e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice Debugger *dbg = Debugger::FindDebuggerWithInstanceName (instance_name).get(); 27466e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice if (dbg != NULL) 27476e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { 27486e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice dbg->GetCommandInterpreter().BroadcastEvent (new_event_sp); 27496e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 27506e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice } 27516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27526e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return true; 27536e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 27546e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27556e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Ticeconst ConstString 27566e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebuggerInstanceSettings::CreateInstanceName () 27576e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 27586e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice static int instance_count = 1; 27596e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice StreamString sstr; 27606e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27616e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice sstr.Printf ("debugger_%d", instance_count); 27626e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice ++instance_count; 27636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice const ConstString ret_val (sstr.GetData()); 27656e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27666e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return ret_val; 27676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 27686e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27699305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham 27706e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 2771d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton// SettingsController Variable Tables 27726e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice//-------------------------------------------------- 27736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27746e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 27756e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 2776d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::SettingsController::global_settings_table[] = 27776e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 27786e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice //{ "var-name", var-type, "default", enum-table, init'd, hidden, "help-text"}, 27791d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice // The Debugger level global table should always be empty; all Debugger settable variables should be instance 27801d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice // variables. 27816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice { NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL } 27826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 27836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 278409d501fc81fd6dd8f474ff385a1b1832d830daecGreg Clayton#define MODULE_WITH_FUNC "{ ${module.file.basename}{`${function.name}${function.pc-offset}}}" 2785a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton#define FILE_AND_LINE "{ at ${line.file.basename}:${line.number}}" 27866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 2787a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton#define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id}"\ 2788a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton "{, ${frame.pc}}"\ 2789a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton MODULE_WITH_FUNC\ 2790aa295176a951fd49393be23ad3bbf7924b4dcd91Greg Clayton FILE_AND_LINE\ 2791a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton "{, stop reason = ${thread.stop-reason}}"\ 2792016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham "{\\nReturn value: ${thread.return-value}}"\ 2793a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton "\\n" 2794a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 27954a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton//#define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id}"\ 27964a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton// "{, ${frame.pc}}"\ 27974a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton// MODULE_WITH_FUNC\ 27984a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton// FILE_AND_LINE\ 27994a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton// "{, stop reason = ${thread.stop-reason}}"\ 28004a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton// "{, name = ${thread.name}}"\ 28014a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton// "{, queue = ${thread.queue}}"\ 28024a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton// "\\n" 28034a2eb2ed6eea4ffa60e0f8061678ae4feeb0420dGreg Clayton 2804a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton#define DEFAULT_FRAME_FORMAT "frame #${frame.index}: ${frame.pc}"\ 2805a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton MODULE_WITH_FUNC\ 2806a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton FILE_AND_LINE\ 2807a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton "\\n" 28086e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 28096e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceSettingEntry 2810d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::SettingsController::instance_settings_table[] = 28116e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 2812a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton// NAME Setting variable type Default Enum Init'd Hidden Help 2813a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton// ======================= ======================= ====================== ==== ====== ====== ====================== 2814a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton{ "frame-format", eSetVarTypeString, DEFAULT_FRAME_FORMAT, NULL, false, false, "The default frame format string to use when displaying thread information." }, 2815f8fa6ff7bf2f7115d1069559b8519a8f91bac88aGreg Clayton{ "prompt", eSetVarTypeString, "(lldb) ", NULL, false, false, "The debugger command line prompt displayed for the user." }, 28169305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham{ "script-lang", eSetVarTypeString, "python", NULL, false, false, "The script language to be used for evaluating user-written scripts." }, 28179305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham{ "term-width", eSetVarTypeInt, "80" , NULL, false, false, "The maximum number of columns to use for displaying text." }, 2818a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton{ "thread-format", eSetVarTypeString, DEFAULT_THREAD_FORMAT, NULL, false, false, "The default thread format string to use when displaying thread information." }, 2819be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ "use-external-editor", eSetVarTypeBoolean, "false", NULL, false, false, "Whether to use an external editor or not." }, 2820be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ "auto-confirm", eSetVarTypeBoolean, "false", NULL, false, false, "If true all confirmation prompts will receive their default reply." }, 2821be9875dc16a839be592110d9de6dc2c9285c5b61Greg 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." }, 2822be9875dc16a839be592110d9de6dc2c9285c5b61Greg 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." }, 2823be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ "stop-disassembly-count", eSetVarTypeInt, "0", NULL, false, false, "The number of disassembly lines to show when displaying a stopped context." }, 2824be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ "stop-disassembly-display", eSetVarTypeEnum, "no-source", g_show_disassembly_enum_values, false, false, "Control when to display disassembly when displaying a stopped context." }, 2825a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton{ NULL, eSetVarTypeNone, NULL, NULL, false, false, NULL } 28266e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice}; 2827