Debugger.cpp revision 323c03778ea1a2b3d9bd4cb749f502e3f5792275
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 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 126d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/API/SBDebugger.h" 136d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 145c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/Debugger.h" 155c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 165c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include <map> 175c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 181391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/DeclCXX.h" 191391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/Type.h" 201391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConnectionFileDescriptor.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/InputReader.h" 2449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton#include "lldb/Core/PluginManager.h" 26061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 28e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham#include "lldb/Core/StreamAsynchronousIO.h" 296c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham#include "lldb/Core/StreamCallback.h" 30d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Core/StreamString.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "lldb/Core/ValueObject.h" 33f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton#include "lldb/Core/ValueObjectVariable.h" 34f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/DataVisualization.h" 35f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/FormatManager.h" 366d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/Host/DynamicLibrary.h" 370fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton#include "lldb/Host/Terminal.h" 3863094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h" 3973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueSInt64.h" 4073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueString.h" 4149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ClangASTContext.h" 4249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 4349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h" 4449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Symbol.h" 45f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton#include "lldb/Symbol/VariableList.h" 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 48d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/RegisterContext.h" 49d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/StopInfo.h" 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 51f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton#include "lldb/Utility/AnsiTerminal.h" 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic uint32_t g_shared_debugger_refcount = 0; 58558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Ticestatic lldb::user_id_t g_unique_id = 1; 59558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 60d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Static Functions 61d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 62d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic Mutex & 63d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerListMutex () 64d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 65d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton static Mutex g_mutex(Mutex::eMutexTypeRecursive); 66d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return g_mutex; 67d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 68d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 69d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytontypedef std::vector<DebuggerSP> DebuggerList; 70d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 71d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic DebuggerList & 72d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerList() 73d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 74d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // hide the static debugger list inside a singleton accessor to avoid 75d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // global init contructors 76d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton static DebuggerList g_list; 77d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return g_list; 78d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 7973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionEnumValueElement 8173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytong_show_disassembly_enum_values[] = 8273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 8373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeNever, "never", "Never show disassembly when displaying a stop context."}, 8473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeNoSource, "no-source", "Show disassembly when there is no source information, or the source file is missing when displaying a stop context."}, 8573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeAlways, "always", "Always show disassembly when displaying a stop context."}, 8673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 0, NULL, NULL } 8773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 8873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8973844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionEnumValueElement 9073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytong_language_enumerators[] = 9173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 9273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguageNone, "none", "Disable scripting languages."}, 9373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguagePython, "python", "Select python as the default scripting language."}, 9473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguageDefault, "default", "Select the lldb default as the default scripting language."}, 9544ac98c5c04de0b1b558f4207c88be68279a651cGreg Clayton { 0, NULL, NULL } 9673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 9773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 9873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define MODULE_WITH_FUNC "{ ${module.file.basename}{`${function.name-with-args}${function.pc-offset}}}" 9973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define FILE_AND_LINE "{ at ${line.file.basename}:${line.number}}" 10073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 10173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id}"\ 10273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{, ${frame.pc}}"\ 10373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton MODULE_WITH_FUNC\ 10473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FILE_AND_LINE\ 10587e929f7b17456f6a7361cb0d480fc4cb7ffc499Greg Clayton "{, name = '${thread.name}}"\ 10687e929f7b17456f6a7361cb0d480fc4cb7ffc499Greg Clayton "{, queue = '${thread.queue}}"\ 10773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{, stop reason = ${thread.stop-reason}}"\ 10873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{\\nReturn value: ${thread.return-value}}"\ 10973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "\\n" 11073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define DEFAULT_FRAME_FORMAT "frame #${frame.index}: ${frame.pc}"\ 11273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton MODULE_WITH_FUNC\ 11373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FILE_AND_LINE\ 11473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "\\n" 11573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 1189f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytonstatic PropertyDefinition 1199f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytong_properties[] = 12073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 12173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "auto-confirm", OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true all confirmation prompts will receive their default reply." }, 12273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "frame-format", OptionValue::eTypeString , true, 0 , DEFAULT_FRAME_FORMAT, NULL, "The default frame format string to use when displaying stack frame information for threads." }, 12373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "notify-void", OptionValue::eTypeBoolean, true, false, NULL, NULL, "Notify the user explicitly if an expression returns void (default: false)." }, 1243b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton{ "prompt", OptionValue::eTypeString , true, OptionValueString::eOptionEncodeCharacterEscapeSequences, "(lldb) ", NULL, "The debugger command line prompt displayed for the user." }, 12573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "script-lang", OptionValue::eTypeEnum , true, eScriptLanguagePython, NULL, g_language_enumerators, "The script language to be used for evaluating user-written scripts." }, 12673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "stop-disassembly-count", OptionValue::eTypeSInt64 , true, 4 , NULL, NULL, "The number of disassembly lines to show when displaying a stopped context." }, 12773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "stop-disassembly-display", OptionValue::eTypeEnum , true, Debugger::eStopDisassemblyTypeNoSource, NULL, g_show_disassembly_enum_values, "Control when to display disassembly when displaying a stopped context." }, 12873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "stop-line-count-after", OptionValue::eTypeSInt64 , true, 3 , NULL, NULL, "The number of sources lines to display that come after the current source line when displaying a stopped context." }, 12973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "stop-line-count-before", OptionValue::eTypeSInt64 , true, 3 , NULL, NULL, "The number of sources lines to display that come before the current source line when displaying a stopped context." }, 13073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "term-width", OptionValue::eTypeSInt64 , true, 80 , NULL, NULL, "The maximum number of columns to use for displaying text." }, 13173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "thread-format", OptionValue::eTypeString , true, 0 , DEFAULT_THREAD_FORMAT, NULL, "The default thread format string to use when displaying thread information." }, 13273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "use-external-editor", OptionValue::eTypeBoolean, true, false, NULL, NULL, "Whether to use an external editor or not." }, 13387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 13487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { NULL, OptionValue::eTypeInvalid, true, 0 , NULL, NULL, NULL } 13573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 136d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 13773844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonenum 13873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 13973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyAutoConfirm = 0, 14073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyFrameFormat, 14173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyNotiftVoid, 14273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyPrompt, 14373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyScriptLanguage, 14473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopDisassemblyCount, 14573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopDisassemblyDisplay, 14673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopLineCountAfter, 14773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopLineCountBefore, 14873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyTerminalWidth, 14973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyThreadFormat, 15073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyUseExternalEditor 15173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 152d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 15373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 15473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const char * 15573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetFrameFormat() const 15673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 15773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp->GetFrameFormat(); 15873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 15973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const char * 16073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetThreadFormat() const 16173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 16273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp->GetThreadFormat(); 16373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 16473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 1653b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 1663b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 1673b1afc6cc5689b749a48a1506f17ca593b1cda42Greg ClaytonError 1683b1afc6cc5689b749a48a1506f17ca593b1cda42Greg ClaytonDebugger::SetPropertyValue (const ExecutionContext *exe_ctx, 1693b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton VarSetOperationType op, 1703b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *property_path, 1713b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *value) 1723b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton{ 1733b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton Error error (Properties::SetPropertyValue (exe_ctx, op, property_path, value)); 1743b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton if (error.Success()) 1753b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton { 1763b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton if (strcmp(property_path, g_properties[ePropertyPrompt].name) == 0) 1773b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton { 1783b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *new_prompt = GetPrompt(); 1793b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton EventSP prompt_change_event_sp (new Event(CommandInterpreter::eBroadcastBitResetPrompt, new EventDataBytes (new_prompt))); 1803b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton GetCommandInterpreter().BroadcastEvent (prompt_change_event_sp); 1813b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton } 1823b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton } 1833b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton return error; 1843b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton} 1853b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 18673844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 18773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetAutoConfirm () const 188be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 18973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyAutoConfirm; 1909f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 191be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 192be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 19373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 19473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetFrameFormat() const 1951e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan{ 19673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyFrameFormat; 1979f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 1981e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan} 1991e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan 20073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 20173844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetNotifyVoid () const 202be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 20373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyNotiftVoid; 2049f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 205be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 206be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 20773844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 20873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetPrompt() const 209be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 21073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyPrompt; 2119f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 212be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 213be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 21473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonvoid 21573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetPrompt(const char *p) 216be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 21773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyPrompt; 21873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 21973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const char *new_prompt = GetPrompt(); 22073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton EventSP prompt_change_event_sp (new Event(CommandInterpreter::eBroadcastBitResetPrompt, new EventDataBytes (new_prompt)));; 22173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton GetCommandInterpreter().BroadcastEvent (prompt_change_event_sp); 222be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 223be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 22473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 22573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetThreadFormat() const 226be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 22773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyThreadFormat; 2289f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 229be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 230be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 23173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::ScriptLanguage 23273844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetScriptLanguage() const 233be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 23473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyScriptLanguage; 2359f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return (lldb::ScriptLanguage)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 236be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 237be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 23873844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 23973844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang) 240be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 24173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyScriptLanguage; 24273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsEnumeration (NULL, idx, script_lang); 243be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 244be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 24573844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 24673844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetTerminalWidth () const 247be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 24873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyTerminalWidth; 2499f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 250be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 251be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 25273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 25373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetTerminalWidth (uint32_t term_width) 254be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 25573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyTerminalWidth; 25673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsSInt64 (NULL, idx, term_width); 257be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 258be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 25973844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 26073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetUseExternalEditor () const 261be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 26273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyUseExternalEditor; 2639f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 264be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 265be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 26673844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 26773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetUseExternalEditor (bool b) 268be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 26973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyUseExternalEditor; 27073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 271be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 272be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 27373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 27473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetStopSourceLineCount (bool before) const 275be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 27673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = before ? ePropertyStopLineCountBefore : ePropertyStopLineCountAfter; 2779f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 27873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 279be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 28073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::StopDisassemblyType 28173844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetStopDisassemblyDisplay () const 28273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 28373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyStopDisassemblyDisplay; 2849f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return (Debugger::StopDisassemblyType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 28573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 286be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 28773844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 28873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetDisassemblyLineCount () const 28973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 29073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyStopDisassemblyCount; 2919f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 29273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 293be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 294d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Debugger 295d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 29673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const DebuggerPropertiesSP & 29773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetSettings() const 29873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 29973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp; 30073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 30173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 302990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 3030aa2e55f0e9422405ad33675adc1e35044537adbCaroline Ticeint 3040aa2e55f0e9422405ad33675adc1e35044537adbCaroline TiceDebugger::TestDebuggerRefCount () 3050aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice{ 3060aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice return g_shared_debugger_refcount; 3070aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice} 3080aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Initialize () 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 312f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount++ == 0) 313c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::Initialize(); 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Terminate () 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31963094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount > 0) 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32163094e0bb161580564954dee512955c1c79d3476Greg Clayton g_shared_debugger_refcount--; 32263094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount == 0) 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 324c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::WillTerminate(); 325c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::Terminate(); 326202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice 327202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice // Clear our master list of debugger objects 328202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 329202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice GetDebuggerList().clear(); 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3342a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid 3352a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsInitialize () 3362a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 337c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Target::SettingsInitialize (); 3382a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 3392a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 3402a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid 3412a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsTerminate () 3422a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 343c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Target::SettingsTerminate (); 3442a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 3452a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 3466d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatabool 347323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico GranataDebugger::LoadPlugin (const FileSpec& spec, Error& error) 3486d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 3496d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec)); 350323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata if (!dynlib_sp || dynlib_sp->IsValid() == false) 351323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata { 352323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata if (spec.Exists()) 353323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata error.SetErrorString("this file does not represent a loadable dylib"); 354323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata else 355323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata error.SetErrorString("no such file"); 356323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata return false; 357323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata } 3586d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::DebuggerSP debugger_sp(shared_from_this()); 3596d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::SBDebugger debugger_sb(debugger_sp); 3606d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays 3616d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol<LLDBCommandPluginInit>("_ZN4lldb16PluginInitializeENS_10SBDebuggerE"); 3626d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (!init_func) 363323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata { 364323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata error.SetErrorString("cannot find the initialization function lldb::PluginInitialize(lldb::SBDebugger)"); 3656d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return false; 366323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata } 3676d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (init_func(debugger_sb)) 3686d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 3696d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata m_loaded_plugins.push_back(dynlib_sp); 3706d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return true; 3716d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 372323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata error.SetErrorString("dylib refused to be loaded"); 3736d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return false; 3746d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 3756d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3766d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatastatic FileSpec::EnumerateDirectoryResult 3776d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataLoadPluginCallback 3786d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata( 3796d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata void *baton, 3806d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::FileType file_type, 3816d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const FileSpec &file_spec 3826d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata ) 3836d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 3846d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata Error error; 3856d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3866d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata static ConstString g_dylibext("dylib"); 3876d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3886d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (!baton) 3896d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultQuit; 3906d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3916d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata Debugger *debugger = (Debugger*)baton; 3926d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3936d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // If we have a regular file, a symbolic link or unknown file type, try 3946d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // and process the file. We must handle unknown as sometimes the directory 3956d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // enumeration might be enumerating a file system that doesn't have correct 3966d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // file type information. 3976d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (file_type == FileSpec::eFileTypeRegular || 3986d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeSymbolicLink || 3996d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeUnknown ) 4006d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4016d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec plugin_file_spec (file_spec); 4026d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata plugin_file_spec.ResolvePath (); 4036d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4046d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (plugin_file_spec.GetFileNameExtension() != g_dylibext) 4056d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 4066d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 407323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata Error plugin_load_error; 408323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata debugger->LoadPlugin (plugin_file_spec, plugin_load_error); 4096d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4106d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 4116d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4126d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4136d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata else if (file_type == FileSpec::eFileTypeUnknown || 4146d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeDirectory || 4156d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeSymbolicLink ) 4166d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4176d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // Try and recurse into anything that a directory or symbolic link. 4186d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // We must also do this for unknown as sometimes the directory enumeration 4196d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // might be enurating a file system that doesn't have correct file type 4206d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // information. 4216d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultEnter; 4226d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4236d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4246d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 4256d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 4266d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4276d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatavoid 4286d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataDebugger::InstanceInitialize () 4296d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 4306d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec dir_spec; 4316d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_directories = true; 4326d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_files = true; 4336d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_other = true; 4346d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata char dir_path[PATH_MAX]; 4356d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (Host::GetLLDBPath (ePathTypeLLDBSystemPlugins, dir_spec)) 4366d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4376d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path))) 4386d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4396d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::EnumerateDirectory (dir_path, 4406d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_directories, 4416d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_files, 4426d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_other, 4436d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LoadPluginCallback, 4446d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata this); 4456d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4466d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4476d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4486d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (Host::GetLLDBPath (ePathTypeLLDBUserPlugins, dir_spec)) 4496d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4506d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path))) 4516d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4526d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::EnumerateDirectory (dir_path, 4536d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_directories, 4546d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_files, 4556d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_other, 4566d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LoadPluginCallback, 4576d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata this); 4586d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4596d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 46087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 46187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton PluginManager::DebuggerInitialize (*this); 4626d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 4636d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 46463094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebuggerSP 4656c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::CreateInstance (lldb::LogOutputCallback log_callback, void *baton) 46663094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 4676c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham DebuggerSP debugger_sp (new Debugger(log_callback, baton)); 468f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 46963094e0bb161580564954dee512955c1c79d3476Greg Clayton { 47063094e0bb161580564954dee512955c1c79d3476Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 47163094e0bb161580564954dee512955c1c79d3476Greg Clayton GetDebuggerList().push_back(debugger_sp); 47263094e0bb161580564954dee512955c1c79d3476Greg Clayton } 4736d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata debugger_sp->InstanceInitialize (); 47463094e0bb161580564954dee512955c1c79d3476Greg Clayton return debugger_sp; 47563094e0bb161580564954dee512955c1c79d3476Greg Clayton} 47663094e0bb161580564954dee512955c1c79d3476Greg Clayton 477c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Ticevoid 478987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::Destroy (DebuggerSP &debugger_sp) 479c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice{ 480c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice if (debugger_sp.get() == NULL) 481c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice return; 482c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice 483c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham debugger_sp->Clear(); 484c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham 485f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 486c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice { 487f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 488f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList (); 489f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 490f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin (); pos != end; ++pos) 491c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice { 492f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if ((*pos).get() == debugger_sp.get()) 493f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 494f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_list.erase (pos); 495f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return; 496f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 497c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice } 498c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice } 499c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice} 500c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice 501987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebuggerSP 5026e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::FindDebuggerWithInstanceName (const ConstString &instance_name) 5036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 504987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton DebuggerSP debugger_sp; 505c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton if (g_shared_debugger_refcount > 0) 506c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 507c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 508c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton DebuggerList &debugger_list = GetDebuggerList(); 509c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 510c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton 511c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 512c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 513c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton if ((*pos).get()->m_instance_name == instance_name) 514c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 515c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton debugger_sp = *pos; 516c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton break; 517c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 518c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 519c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 5206e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return debugger_sp; 5216e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 52263094e0bb161580564954dee512955c1c79d3476Greg Clayton 52363094e0bb161580564954dee512955c1c79d3476Greg ClaytonTargetSP 52463094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::FindTargetWithProcessID (lldb::pid_t pid) 52563094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 526987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton TargetSP target_sp; 527f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 52863094e0bb161580564954dee512955c1c79d3476Greg Clayton { 529f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 530f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 531f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 532f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 533f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 534f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid); 535f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (target_sp) 536f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 537f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 53863094e0bb161580564954dee512955c1c79d3476Greg Clayton } 53963094e0bb161580564954dee512955c1c79d3476Greg Clayton return target_sp; 54063094e0bb161580564954dee512955c1c79d3476Greg Clayton} 54163094e0bb161580564954dee512955c1c79d3476Greg Clayton 5421c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonTargetSP 5431c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonDebugger::FindTargetWithProcess (Process *process) 5441c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton{ 5451c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton TargetSP target_sp; 546f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 5471c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton { 548f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 549f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 550f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 551f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 552f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 553f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcess (process); 554f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (target_sp) 555f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 556f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 5571c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton } 5581c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton return target_sp; 5591c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton} 5601c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 5616c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::Debugger (lldb::LogOutputCallback log_callback, void *baton) : 562558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice UserID (g_unique_id++), 56373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Properties(OptionValuePropertiesSP(new OptionValueProperties())), 564eecb0f3b5021e37311f9588f14bcab38a35b8e9aGreg Clayton m_input_comm("debugger.input"), 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_file (), 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_output_file (), 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error_file (), 568b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state (), 5695a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_target_list (*this), 570b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_platform_list (), 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_listener ("lldb.Debugger"), 572535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton m_source_manager_ap(), 573cc637461f6c59851302836c64e0cb002de4f4571Jim Ingham m_source_file_cache(), 57463094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)), 575d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack (), 57673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_input_reader_data (), 57773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_instance_name() 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 57973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton char instance_cstr[256]; 58073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton snprintf(instance_cstr, sizeof(instance_cstr), "debugger_%d", (int)GetID()); 58173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_instance_name.SetCString(instance_cstr); 5826c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_callback) 5836c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 58463094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->Initialize (); 585b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Always add our default platform to the platform list 586b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP default_platform_sp (Platform::GetDefaultPlatform()); 587b1888f24fa181489840b9acf193e224d125d0776Greg Clayton assert (default_platform_sp.get()); 588b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_platform_list.Append (default_platform_sp, true); 58973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 5909f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_collection_sp->Initialize (g_properties); 59173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->AppendProperty (ConstString("target"), 59273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ConstString("Settings specify to debugging targets."), 59373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton true, 59473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Target::GetGlobalProperties()->GetValueProperties()); 5959f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton if (m_command_interpreter_ap.get()) 5969f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton { 5979f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_collection_sp->AppendProperty (ConstString("interpreter"), 5989f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton ConstString("Settings specify to the debugger's command interpreter."), 5999f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton true, 6009f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_command_interpreter_ap->GetValueProperties()); 6019f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton } 60273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton OptionValueSInt64 *term_width = m_collection_sp->GetPropertyAtIndexAsOptionValueSInt64 (NULL, ePropertyTerminalWidth); 60373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton term_width->SetMinimumValue(10); 60473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton term_width->SetMaximumValue(1024); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::~Debugger () 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 609c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham Clear(); 610c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham} 611c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham 612c0c53249938e49e006a982057e9106a97da5ea89Jim Inghamvoid 613c0c53249938e49e006a982057e9106a97da5ea89Jim InghamDebugger::Clear() 614c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham{ 615c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice CleanUpInputReaders(); 6162f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton m_listener.Clear(); 61763094e0bb161580564954dee512955c1c79d3476Greg Clayton int num_targets = m_target_list.GetNumTargets(); 61863094e0bb161580564954dee512955c1c79d3476Greg Clayton for (int i = 0; i < num_targets; i++) 61963094e0bb161580564954dee512955c1c79d3476Greg Clayton { 6202fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton TargetSP target_sp (m_target_list.GetTargetAtIndex (i)); 6212fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (target_sp) 622c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham { 6232fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 6242fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (process_sp) 6256e46a3ebaf487676b636a2e92b030e5e9a781ecfJim Ingham process_sp->Finalize(); 6262fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton target_sp->Destroy(); 627c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham } 62863094e0bb161580564954dee512955c1c79d3476Greg Clayton } 6295a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham BroadcasterManager::Clear (); 630e585240956453d98413a0f9461a04500f9cba605Greg Clayton 631e585240956453d98413a0f9461a04500f9cba605Greg Clayton // Close the input file _before_ we close the input read communications class 632e585240956453d98413a0f9461a04500f9cba605Greg Clayton // as it does NOT own the input file, our m_input_file does. 633b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state.Clear(); 634e585240956453d98413a0f9461a04500f9cba605Greg Clayton GetInputFile().Close (); 635e585240956453d98413a0f9461a04500f9cba605Greg Clayton // Now that we have closed m_input_file, we can now tell our input communication 636e585240956453d98413a0f9461a04500f9cba605Greg Clayton // class to close down. Its read thread should quickly exit after we close 637e585240956453d98413a0f9461a04500f9cba605Greg Clayton // the input file handle above. 638e585240956453d98413a0f9461a04500f9cba605Greg Clayton m_input_comm.Clear (); 639c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham} 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 642421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::GetCloseInputOnEOF () const 643421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{ 644421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton return m_input_comm.GetCloseOnEOF(); 645421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton} 646421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton 647421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonvoid 648421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::SetCloseInputOnEOF (bool b) 649421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{ 650421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton m_input_comm.SetCloseOnEOF(b); 651421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton} 652421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton 653421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonbool 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetAsyncExecution () 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 65663094e0bb161580564954dee512955c1c79d3476Greg Clayton return !m_command_interpreter_ap->GetSynchronous(); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetAsyncExecution (bool async_execution) 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 66263094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->SetSynchronous (!async_execution); 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership) 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6695892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &in_file = GetInputFile(); 6705892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton in_file.SetStream (fh, tranfer_ownership); 6715892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (in_file.IsValid() == false) 6725892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton in_file.SetStream (stdin, true); 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Disconnect from any old connection if we had one 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.Disconnect (); 676bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // Pass false as the second argument to ConnectionFileDescriptor below because 677bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // our "in_file" above will already take ownership if requested and we don't 678bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // want to objects trying to own and close a file descriptor. 679bba48364984bada19ba2aff2993ec583927d8150Greg Clayton m_input_comm.SetConnection (new ConnectionFileDescriptor (in_file.GetDescriptor(), false)); 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this); 681b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 682b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham // Save away the terminal state if that is relevant, so that we can restore it in RestoreInputState. 683b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham SaveInputTerminalState (); 684b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_comm.StartReadThread (&error) == false) 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6885892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &err_file = GetErrorFile(); 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6905892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.Printf ("error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error"); 6915892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton exit(1); 6925892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton } 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership) 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6985892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &out_file = GetOutputFile(); 6995892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton out_file.SetStream (fh, tranfer_ownership); 7005892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (out_file.IsValid() == false) 7015892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton out_file.SetStream (stdout, false); 7020aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 703db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata // do not create the ScriptInterpreter just for setting the output file handle 704db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata // as the constructor will know how to do the right thing on its own 705db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata const bool can_create = false; 706db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata ScriptInterpreter* script_interpreter = GetCommandInterpreter().GetScriptInterpreter(can_create); 707db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (script_interpreter) 708db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata script_interpreter->ResetOutputFileHandle (fh); 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership) 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7145892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &err_file = GetErrorFile(); 7155892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.SetStream (fh, tranfer_ownership); 7165892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (err_file.IsValid() == false) 7175892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.SetStream (stderr, false); 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 720b1087a27f7babc43f332c9d49ac4554892133a41Jim Inghamvoid 721b1087a27f7babc43f332c9d49ac4554892133a41Jim InghamDebugger::SaveInputTerminalState () 722b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham{ 723b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham File &in_file = GetInputFile(); 724b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham if (in_file.GetDescriptor() != File::kInvalidDescriptor) 725b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state.Save(in_file.GetDescriptor(), true); 726b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham} 727b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 728b1087a27f7babc43f332c9d49ac4554892133a41Jim Inghamvoid 729b1087a27f7babc43f332c9d49ac4554892133a41Jim InghamDebugger::RestoreInputTerminalState () 730b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham{ 731b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state.Restore(); 732b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham} 733b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerExecutionContext 735c833295baeec641086f536e78050388af36784f8Jim InghamDebugger::GetSelectedExecutionContext () 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExecutionContext exe_ctx; 738567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton TargetSP target_sp(GetSelectedTarget()); 739567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetTargetSP (target_sp); 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 743567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 744567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetProcessSP (process_sp); 745567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process_sp && process_sp->IsRunning() == false) 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 747567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread()); 748567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread_sp) 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 750567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetThreadSP (thread_sp); 751567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetSelectedFrame()); 752567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr() == NULL) 753567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetStackFrameAtIndex (0)); 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return exe_ctx; 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7617f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceInputReaderSP 7627f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceDebugger::GetCurrentInputReader () 7637f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice{ 7647f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp; 7657f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 766d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 7677f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice { 7687f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Clear any finished readers from the stack 7697f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice while (CheckIfTopInputReaderIsDone()) ; 7707f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 771d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 772d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice reader_sp = m_input_reader_stack.Top(); 7737f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice } 7747f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 7757f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice return reader_sp; 7767f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice} 7777f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len) 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 781c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (bytes_len > 0) 782c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len); 783c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice else 784c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice ((Debugger *)baton)->DispatchInputEndOfFile (); 785c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInput (const char *bytes, size_t bytes_len) 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 791c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (bytes == NULL || bytes_len == 0) 792c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice return; 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WriteToDefaultReader (bytes, bytes_len); 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 798c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputInterrupt () 799c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{ 800c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_input_reader_data.clear(); 801c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 8027f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 8037f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (reader_sp) 804c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice { 8057f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice reader_sp->Notify (eInputReaderInterrupt); 806c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 8077f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // If notifying the reader of the interrupt finished the reader, we should pop it off the stack. 808c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 809c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 810c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 811c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 812c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid 813c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputEndOfFile () 814c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{ 815c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_input_reader_data.clear(); 816c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 8177f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 8187f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (reader_sp) 819c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice { 8207f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 821c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 8227f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // If notifying the reader of the end-of-file finished the reader, we should pop it off the stack. 823c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 824c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 825c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 826c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 827c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid 828c0446861315ac0d5994f93510e24cbcac9f534adCaroline TiceDebugger::CleanUpInputReaders () 829c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice{ 830c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice m_input_reader_data.clear(); 831c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice 8327f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // The bottom input reader should be the main debugger input reader. We do not want to close that one here. 833d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice while (m_input_reader_stack.GetSize() > 1) 834c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice { 8357f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 836c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice if (reader_sp) 837c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice { 838c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 839c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice reader_sp->SetIsDone (true); 840c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice } 841c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice } 842c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice} 843c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice 844c0446861315ac0d5994f93510e24cbcac9f534adCaroline Ticevoid 8454a348081030cdd2af758fddc869518357d9befd3Caroline TiceDebugger::NotifyTopInputReader (InputReaderAction notification) 8464a348081030cdd2af758fddc869518357d9befd3Caroline Tice{ 8474a348081030cdd2af758fddc869518357d9befd3Caroline Tice InputReaderSP reader_sp (GetCurrentInputReader()); 8484a348081030cdd2af758fddc869518357d9befd3Caroline Tice if (reader_sp) 8494a348081030cdd2af758fddc869518357d9befd3Caroline Tice { 8504a348081030cdd2af758fddc869518357d9befd3Caroline Tice reader_sp->Notify (notification); 8514a348081030cdd2af758fddc869518357d9befd3Caroline Tice 8524a348081030cdd2af758fddc869518357d9befd3Caroline Tice // Flush out any input readers that are done. 8534a348081030cdd2af758fddc869518357d9befd3Caroline Tice while (CheckIfTopInputReaderIsDone ()) 8544a348081030cdd2af758fddc869518357d9befd3Caroline Tice /* Do nothing. */; 8554a348081030cdd2af758fddc869518357d9befd3Caroline Tice } 8564a348081030cdd2af758fddc869518357d9befd3Caroline Tice} 8574a348081030cdd2af758fddc869518357d9befd3Caroline Tice 858b38df1e945846a5d956974ec157902a6ad748868Caroline Ticebool 859987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::InputReaderIsTopReader (const InputReaderSP& reader_sp) 860b38df1e945846a5d956974ec157902a6ad748868Caroline Tice{ 861892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader()); 862b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 863892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice return (reader_sp.get() == top_reader_sp.get()); 864b38df1e945846a5d956974ec157902a6ad748868Caroline Tice} 865b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 866b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 8674a348081030cdd2af758fddc869518357d9befd3Caroline Ticevoid 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::WriteToDefaultReader (const char *bytes, size_t bytes_len) 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes && bytes_len) 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.append (bytes, bytes_len); 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_reader_data.empty()) 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 876d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice while (!m_input_reader_stack.IsEmpty() && !m_input_reader_data.empty()) 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the input reader from the top of the stack 8797f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88353d68e749f0715691a95f23e9490d97e484b15daGreg Clayton size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(), 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.size()); 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_handled) 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.erase (0, bytes_handled); 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No bytes were handled, we might not have reached our 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // granularity, just return and wait for more data 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8977f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Flush out any input readers that are done. 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (CheckIfTopInputReaderIsDone ()) 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /* Do nothing. */; 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PushInputReader (const InputReaderSP& reader_sp) 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 9087f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 9097f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Deactivate the old top reader 9107f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader ()); 9117f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 9127f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (top_reader_sp) 9137f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice top_reader_sp->Notify (eInputReaderDeactivate); 9147f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 915d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack.Push (reader_sp); 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderActivate); 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 921987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::PopInputReader (const InputReaderSP& pop_reader_sp) 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The reader on the stop of the stack is done, so let the next 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // read on the stack referesh its prompt and if there is one... 927d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9297f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 930d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get()) 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 934d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack.Pop (); 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDeactivate); 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDone); 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 939d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 941d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice reader_sp = m_input_reader_stack.Top(); 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp) 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderReactivate); 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::CheckIfTopInputReaderIsDone () 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 957d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9597f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 960d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp && reader_sp->IsDone()) 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PopInputReader (reader_sp); 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::ActivateInputReader (const InputReaderSP &reader_sp) 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9745892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton int input_fd = m_input_file.GetFile().GetDescriptor(); 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9765892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (input_fd >= 0) 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9785892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton Terminal tty(input_fd); 9790fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 9800fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetEcho(reader_sp->GetEcho()); 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9820fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton switch (reader_sp->GetGranularity()) 9830fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton { 9840fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityByte: 9850fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityWord: 9860fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetCanonical (false); 9870fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 9880fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 9890fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityLine: 9900fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityAll: 9910fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetCanonical (true); 9920fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 9930fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 9940fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton default: 9950fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 99963094e0bb161580564954dee512955c1c79d3476Greg Clayton 1000e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP 1001e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncOutputStream () 1002e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{ 1003e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 1004e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham CommandInterpreter::eBroadcastBitAsynchronousOutputData)); 1005e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham} 1006e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham 1007e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP 1008e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncErrorStream () 1009e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{ 1010e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 1011e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham CommandInterpreter::eBroadcastBitAsynchronousErrorData)); 1012e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham} 1013e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham 101436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 101516376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico GranataDebugger::GetNumDebuggers() 101616376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata{ 1017f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 1018f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 1019f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1020f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return GetDebuggerList().size(); 1021f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1022f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return 0; 102316376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata} 102416376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 102516376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granatalldb::DebuggerSP 102636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDebugger::GetDebuggerAtIndex (size_t index) 102716376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata{ 102816376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata DebuggerSP debugger_sp; 102916376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 1030f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 1031f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 1032f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1033f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 103416376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 1035f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (index < debugger_list.size()) 1036f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_sp = debugger_list[index]; 1037f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1038f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton 103916376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata return debugger_sp; 104016376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata} 104116376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 1042558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebuggerSP 1043558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebugger::FindDebuggerWithID (lldb::user_id_t id) 1044558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice{ 1045987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton DebuggerSP debugger_sp; 1046558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 1047f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 1048558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 1049f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1050f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 1051f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 1052f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 1053558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 1054f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if ((*pos).get()->GetID() == id) 1055f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 1056f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_sp = *pos; 1057f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 1058f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1059558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 1060558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 1061558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice return debugger_sp; 1062558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice} 10636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 1064d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic void 1065d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonTestPromptFormats (StackFrame *frame) 1066d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 1067d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (frame == NULL) 1068d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return; 1069d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton StreamString s; 1071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *prompt_format = 1072d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{addr = '${addr}'\n}" 1073d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.id = '${process.id}'\n}" 1074d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.name = '${process.name}'\n}" 1075d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.file.basename = '${process.file.basename}'\n}" 1076d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.file.fullpath = '${process.file.fullpath}'\n}" 1077d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.id = '${thread.id}'\n}" 1078d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.index = '${thread.index}'\n}" 1079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.name = '${thread.name}'\n}" 1080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.queue = '${thread.queue}'\n}" 1081d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.stop-reason = '${thread.stop-reason}'\n}" 1082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{target.arch = '${target.arch}'\n}" 1083d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{module.file.basename = '${module.file.basename}'\n}" 1084d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{module.file.fullpath = '${module.file.fullpath}'\n}" 1085d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{file.basename = '${file.basename}'\n}" 1086d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{file.fullpath = '${file.fullpath}'\n}" 1087d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.index = '${frame.index}'\n}" 1088d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.pc = '${frame.pc}'\n}" 1089d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.sp = '${frame.sp}'\n}" 1090d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.fp = '${frame.fp}'\n}" 1091d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.flags = '${frame.flags}'\n}" 1092d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rdi = '${frame.reg.rdi}'\n}" 1093d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rip = '${frame.reg.rip}'\n}" 1094d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rsp = '${frame.reg.rsp}'\n}" 1095d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rbp = '${frame.reg.rbp}'\n}" 1096d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rflags = '${frame.reg.rflags}'\n}" 1097d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.xmm0 = '${frame.reg.xmm0}'\n}" 1098d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.carp = '${frame.reg.carp}'\n}" 1099d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.id = '${function.id}'\n}" 1100d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.name = '${function.name}'\n}" 11012fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton "{function.name-with-args = '${function.name-with-args}'\n}" 1102d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.addr-offset = '${function.addr-offset}'\n}" 1103d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.line-offset = '${function.line-offset}'\n}" 1104d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.pc-offset = '${function.pc-offset}'\n}" 1105d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.file.basename = '${line.file.basename}'\n}" 1106d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.file.fullpath = '${line.file.fullpath}'\n}" 1107d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.number = '${line.number}'\n}" 1108d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.start-addr = '${line.start-addr}'\n}" 1109d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.end-addr = '${line.end-addr}'\n}" 1110d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton; 1111d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1112d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextEverything)); 1113d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ExecutionContext exe_ctx; 1114a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton frame->CalculateExecutionContext(exe_ctx); 1115d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *end = NULL; 1116d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (Debugger::FormatPrompt (prompt_format, &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, &end)) 1117d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1118d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf("%s\n", s.GetData()); 1119d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1120d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 1121d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1122d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf ("error: at '%s'\n", end); 1123d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf ("what we got: %s\n", s.GetData()); 1124d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1125d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 1126d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 11279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool 11282c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanFormatDescriptor (const char* var_name_begin, 11292c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_end, 11302c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** var_name_final, 11312c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** percent_position, 1132987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Format* custom_format, 11332c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata ValueObject::ValueObjectRepresentationStyle* val_obj_display) 11349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1135952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 11369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *percent_position = ::strchr(var_name_begin,'%'); 1137107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!*percent_position || *percent_position > var_name_end) 1138de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1139de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11407b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanFormatDescriptor] no format descriptor in string, skipping"); 11419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final = var_name_end; 1142de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 11439762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 11449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 11459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final = *percent_position; 11469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char* format_name = new char[var_name_end-*var_name_final]; format_name[var_name_end-*var_name_final-1] = '\0'; 11479762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata memcpy(format_name, *var_name_final+1, var_name_end-*var_name_final-1); 1148de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11497b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] parsing %s as a format descriptor", format_name); 11509762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if ( !FormatManager::GetFormatFromCString(format_name, 11519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata true, 11529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *custom_format) ) 11539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1154de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11557b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] %s is an unknown format", format_name); 11569762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // if this is an @ sign, print ObjC description 1157107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*format_name == '@') 1158cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleLanguageSpecific; 11599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // if this is a V, print the value using the default format 1160de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'V') 1161cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1162e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // if this is an L, print the location of the value 1163de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'L') 1164cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleLocation; 1165e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // if this is an S, print the summary after all 1166de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'S') 1167cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleSummary; 11684e5397c1127d698c61df295f30909e573a1c9876Enrico Granata else if (*format_name == '#') 1169cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleChildrenCount; 11706f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata else if (*format_name == 'T') 1171cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleType; 1172de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (log) 11737b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] %s is an error, leaving the previous value alone", format_name); 11749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 11759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // a good custom format tells us to print the value using it 11769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 1177de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1178de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11797b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] will display value for this VO"); 1180cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1181de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 11829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata delete format_name; 11839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1184de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11857b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] final format description outcome: custom_format = %d, val_obj_display = %d", 1186de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata *custom_format, 1187de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata *val_obj_display); 11889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 11899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 11909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 11919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool 11922c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanBracketedRange (const char* var_name_begin, 11932c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_end, 11942c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_final, 11952c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** open_bracket_position, 11962c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** separator_position, 11972c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** close_bracket_position, 11982c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** var_name_final_if_array_range, 11992c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata int64_t* index_lower, 12002c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata int64_t* index_higher) 12019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1202952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 12039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *open_bracket_position = ::strchr(var_name_begin,'['); 1204107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*open_bracket_position && *open_bracket_position < var_name_final) 12059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 12069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *separator_position = ::strchr(*open_bracket_position,'-'); // might be NULL if this is a simple var[N] bitfield 12079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *close_bracket_position = ::strchr(*open_bracket_position,']'); 12089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // as usual, we assume that [] will come before % 12099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata //printf("trying to expand a []\n"); 12109762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final_if_array_range = *open_bracket_position; 1211107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*close_bracket_position - *open_bracket_position == 1) 12129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1213de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12147b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] '[]' detected.. going from 0 to end of data"); 12159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = 0; 12169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 12179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else if (*separator_position == NULL || *separator_position > var_name_end) 12189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 12199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char *end = NULL; 12209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 12219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = *index_lower; 1222de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12235f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("[ScanBracketedRange] [%" PRId64 "] detected, high index is same", *index_lower); 12249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1225107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (*close_bracket_position && *close_bracket_position < var_name_end) 12269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 12279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char *end = NULL; 12289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 12299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = ::strtoul (*separator_position+1, &end, 0); 1230de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12315f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("[ScanBracketedRange] [%" PRId64 "-%" PRId64 "] detected", *index_lower, *index_higher); 12329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 12339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 1234de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1235de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12367b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] expression is erroneous, cannot extract indices out of it"); 12379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return false; 1238de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 12399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (*index_lower > *index_higher && *index_higher > 0) 12409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1241de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12427b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] swapping indices"); 124336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton int64_t temp = *index_lower; 12449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = *index_higher; 12459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = temp; 12469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 12479762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1248de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (log) 12497b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] no bracketed range, skipping entirely"); 12509762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 12519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 12529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 12539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic ValueObjectSP 12542c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataExpandIndexedExpression (ValueObject* valobj, 125536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t index, 12562c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata StackFrame* frame, 12572c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata bool deref_pointer) 12589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1259952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 1260ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* ptr_deref_format = "[%d]"; 1261bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata std::string ptr_deref_buffer(10,0); 1262bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata ::sprintf(&ptr_deref_buffer[0], ptr_deref_format, index); 1263de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1264bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata log->Printf("[ExpandIndexedExpression] name to deref: %s",ptr_deref_buffer.c_str()); 1265ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* first_unparsed; 1266ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::GetValueForExpressionPathOptions options; 1267ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathEndResultType final_value_type; 1268ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop; 1269cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathAftermath what_next = (deref_pointer ? ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); 1270bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata ValueObjectSP item = valobj->GetValueForExpressionPath (ptr_deref_buffer.c_str(), 1271ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &first_unparsed, 1272ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &reason_to_stop, 1273ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &final_value_type, 1274ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1275ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &what_next); 1276ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!item) 1277ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1278de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12797b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ExpandIndexedExpression] ERROR: unparsed portion = %s, why stopping = %d," 1280de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1281ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 12829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1283ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1284ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1285de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12867b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ExpandIndexedExpression] ALL RIGHT: unparsed portion = %s, why stopping = %d," 1287de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1288ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1289ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 12909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return item; 12919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 12929762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1293d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonbool 1294d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::FormatPrompt 1295d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton( 1296d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *format, 1297d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const SymbolContext *sc, 1298d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const ExecutionContext *exe_ctx, 1299d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const Address *addr, 1300d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Stream &s, 13011391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char **end, 1302f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObject* valobj 1303d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton) 1304d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 1305f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObject* realvalobj = NULL; // makes it super-easy to parse pointers 1306d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool success = true; 1307d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *p; 1308952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 1309d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton for (p = format; *p != '\0'; ++p) 1310d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1311f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (realvalobj) 13121391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1313f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata valobj = realvalobj; 1314f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata realvalobj = NULL; 13151391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 1316d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton size_t non_special_chars = ::strcspn (p, "${}\\"); 1317d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (non_special_chars > 0) 1318d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1319d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (success) 1320d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Write (p, non_special_chars); 1321d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton p += non_special_chars; 1322d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1323d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1324d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p == '\0') 1325d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1326d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1327d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1328d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '{') 1329d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1330d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Start a new scope that must have everything it needs if it is to 1331d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // to make it into the final output stream "s". If you want to make 1332d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // a format that only prints out the function or symbol name if there 1333d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // is one in the symbol context you can use: 1334d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // "{function =${function.name}}" 1335d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // The first '{' starts a new scope that end with the matching '}' at 1336d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // the end of the string. The contents "function =${function.name}" 1337d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // will then be evaluated and only be output if there is a function 1338d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // or symbol with a valid name. 1339d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton StreamString sub_strm; 1340d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1341d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; // Skip the '{' 1342d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1343f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (FormatPrompt (p, sc, exe_ctx, addr, sub_strm, &p, valobj)) 1344d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1345d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // The stream had all it needed 1346d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Write(sub_strm.GetData(), sub_strm.GetSize()); 1347d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1348d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p != '}') 1349d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1350d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton success = false; 1351d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1352d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1353d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1354d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '}') 1355d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1356d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // End of a enclosing scope 1357d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1358d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1359d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '$') 1360d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1361d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We have a prompt variable to print 1362d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; 1363d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p == '{') 1364d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1365d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; 1366d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *var_name_begin = p; 1367d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *var_name_end = ::strchr (p, '}'); 1368d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1369d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_name_end && var_name_begin < var_name_end) 1370d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1371d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // if we have already failed to parse, skip this variable 1372d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (success) 1373d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1374d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *cstr = NULL; 1375d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Address format_addr; 1376d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool calculate_format_addr_function_offset = false; 1377d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Set reg_kind and reg_num to invalid values 1378d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton RegisterKind reg_kind = kNumRegisterKinds; 1379d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton uint32_t reg_num = LLDB_INVALID_REGNUM; 1380d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton FileSpec format_file_spec; 1381b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info = NULL; 1382d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton RegisterContext *reg_ctx = NULL; 13839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata bool do_deref_pointer = false; 1384cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 1385cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathEndResultType final_value_type = ValueObject::eExpressionPathEndResultTypePlain; 1386ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1387d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Each variable must set success to true below... 1388d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool var_success = false; 1389d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton switch (var_name_begin[0]) 1390d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 13911391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata case '*': 13921391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata case 'v': 1393979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata case 's': 13941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1395f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (!valobj) 1396979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 1397979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1398afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 13997b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1400afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1401979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // check for *var and *svar 1402979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin == '*') 1403979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1404979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata do_deref_pointer = true; 1405979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata var_name_begin++; 1406979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1407afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1408afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 14097b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1410afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1411979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin == 's') 1412979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1413dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata if (!valobj->IsSynthetic()) 1414dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata valobj = valobj->GetSyntheticValue().get(); 1415cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!valobj) 1416cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1417979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata var_name_begin++; 1418979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1419979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1420afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 14217b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1422afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1423979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // should be a 'v' by now 1424979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin != 'v') 1425979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 1426979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1427afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 14287b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1429afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1430ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathAftermath what_next = (do_deref_pointer ? 1431cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); 1432ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::GetValueForExpressionPathOptions options; 14339c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata options.DontCheckDotVsArrowSyntax().DoAllowBitfieldSyntax().DoAllowFragileIVar().DoAllowSyntheticChildren(); 1434cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ValueObjectRepresentationStyle val_obj_display = ValueObject::eValueObjectRepresentationStyleSummary; 1435107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ValueObject* target = NULL; 1436987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Format custom_format = eFormatInvalid; 1437107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* var_name_final = NULL; 1438107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* var_name_final_if_array_range = NULL; 1439107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* close_bracket_position = NULL; 1440107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton int64_t index_lower = -1; 1441107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton int64_t index_higher = -1; 1442107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton bool is_array_range = false; 1443ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* first_unparsed; 14441c61743af946076e988d88baf725382e99d905deEnrico Granata bool was_plain_var = false; 14451c61743af946076e988d88baf725382e99d905deEnrico Granata bool was_var_format = false; 144607baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata bool was_var_indexed = false; 1447ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1448f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (!valobj) break; 1449f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata // simplest case ${var}, just print valobj's value 1450107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (::strncmp (var_name_begin, "var}", strlen("var}")) == 0) 1451107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 14521c61743af946076e988d88baf725382e99d905deEnrico Granata was_plain_var = true; 1453f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj; 1454cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1455107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1456107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (::strncmp(var_name_begin,"var%",strlen("var%")) == 0) 1457107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 14581c61743af946076e988d88baf725382e99d905deEnrico Granata was_var_format = true; 1459107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this is a variable with some custom format applied to it 1460107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* percent_position; 1461f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj; 1462cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1463107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanFormatDescriptor (var_name_begin, 1464107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1465107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final, 1466107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &percent_position, 1467107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &custom_format, 1468107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &val_obj_display); 1469107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1470107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this is ${var.something} or multiple .something nested 1471107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (::strncmp (var_name_begin, "var", strlen("var")) == 0) 14721391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 147307baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (::strncmp(var_name_begin, "var[", strlen("var[")) == 0) 147407baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata was_var_indexed = true; 1475107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* percent_position; 1476107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanFormatDescriptor (var_name_begin, 1477107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1478107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final, 1479107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &percent_position, 1480107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &custom_format, 1481107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &val_obj_display); 1482107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1483107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* open_bracket_position; 1484107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* separator_position; 1485107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanBracketedRange (var_name_begin, 1486107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1487107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_final, 1488107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &open_bracket_position, 1489107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &separator_position, 1490107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &close_bracket_position, 1491107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final_if_array_range, 1492107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &index_lower, 1493107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &index_higher); 1494107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1495107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton Error error; 1496bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata 1497bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata std::string expr_path(var_name_final-var_name_begin-1,0); 1498bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata memcpy(&expr_path[0], var_name_begin+3,var_name_final-var_name_begin-3); 1499bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata 1500de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1501bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata log->Printf("[Debugger::FormatPrompt] symbol to expand: %s",expr_path.c_str()); 1502ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1503bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata target = valobj->GetValueForExpressionPath(expr_path.c_str(), 1504ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &first_unparsed, 1505ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &reason_to_stop, 1506ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &final_value_type, 1507ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1508ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &what_next).get(); 1509ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1510ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!target) 1511107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1512de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 15137b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ERROR: unparsed portion = %s, why stopping = %d," 1514de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1515ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1516ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 15179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1518ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1519ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1520de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 15217b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ALL RIGHT: unparsed portion = %s, why stopping = %d," 1522de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1523ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1524ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1525107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1526107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 15279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata break; 1528ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1529cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata is_array_range = (final_value_type == ValueObject::eExpressionPathEndResultTypeBoundedRange || 1530cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata final_value_type == ValueObject::eExpressionPathEndResultTypeUnboundedRange); 1531ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1532cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata do_deref_pointer = (what_next == ValueObject::eExpressionPathAftermathDereference); 1533107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 153413cb5406e7f013ca7c15b370ec2fa72f9a911ab5Enrico Granata if (do_deref_pointer && !is_array_range) 15359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1536107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // I have not deref-ed yet, let's do it 1537107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this happens when we are not going through GetValueForVariableExpressionPath 1538107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // to get to the target ValueObject 1539107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton Error error; 1540107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton target = target->Dereference(error).get(); 15412c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata if (error.Fail()) 15422c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata { 15432c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata if (log) 15447b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ERROR: %s\n", error.AsCString("unknown")); \ 15452c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata break; 15462c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata } 1547107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton do_deref_pointer = false; 15489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 154986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 155007baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // <rdar://problem/11338654> 155107baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // we do not want to use the summary for a bitfield of type T:n 155207baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // if we were originally dealing with just a T - that would get 155307baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // us into an endless recursion 155407baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (target->IsBitfield() && was_var_indexed) 155507baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata { 155607baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // TODO: check for a (T:n)-specific summary - we should still obey that 155707baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata StreamString bitfield_name; 155807baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata bitfield_name.Printf("%s:%d", target->GetTypeName().AsCString(), target->GetBitfieldBitSize()); 155907baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata lldb::TypeNameSpecifierImplSP type_sp(new TypeNameSpecifierImpl(bitfield_name.GetData(),false)); 156007baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (!DataVisualization::GetSummaryForType(type_sp)) 156107baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 156207baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata } 156307baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata 15641c61743af946076e988d88baf725382e99d905deEnrico Granata // TODO use flags for these 1565b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton bool is_array = ClangASTContext::IsArrayType(target->GetClangType(), NULL, NULL, NULL); 156686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool is_pointer = ClangASTContext::IsPointerType(target->GetClangType()); 15671c61743af946076e988d88baf725382e99d905deEnrico Granata bool is_aggregate = ClangASTContext::IsAggregateType(target->GetClangType()); 156886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1569cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((is_array || is_pointer) && (!is_array_range) && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) // this should be wrong, but there are some exceptions 157086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 15711c61743af946076e988d88baf725382e99d905deEnrico Granata StreamString str_temp; 1572de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 15737b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] I am into array || pointer && !range"); 15746f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 1575c2676e8ca4a654fd167f00163d013a4e71eeaba2Greg Clayton if (target->HasSpecialPrintableRepresentation(val_obj_display, custom_format)) 15761c61743af946076e988d88baf725382e99d905deEnrico Granata { 15776f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // try to use the special cases 15786f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = target->DumpPrintableRepresentation(str_temp, 15796f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata val_obj_display, 15806f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata custom_format); 15816f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (log) 15827b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] special cases did%s match", var_success ? "" : "n't"); 15836f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 15846f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // should not happen 1585c2676e8ca4a654fd167f00163d013a4e71eeaba2Greg Clayton if (var_success) 15866f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << str_temp.GetData(); 15871c61743af946076e988d88baf725382e99d905deEnrico Granata var_success = true; 15886f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata break; 15891c61743af946076e988d88baf725382e99d905deEnrico Granata } 15901c61743af946076e988d88baf725382e99d905deEnrico Granata else 15916f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 1592ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata if (was_plain_var) // if ${var} 15936f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 15946f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 15956f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 1596ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata else if (is_pointer) // if pointer, value is the address stored 1597ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata { 15984a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton target->DumpPrintableRepresentation (s, 15994a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton val_obj_display, 16004a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton custom_format, 16014a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton ValueObject::ePrintableRepresentationSpecialCasesDisable); 1602ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata } 16036f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = true; 16046f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata break; 16056f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 16066f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 16076f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 16086f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // if directly trying to print ${var}, and this is an aggregate, display a nice 16096f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // type @ location message 16106f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (is_aggregate && was_plain_var) 16116f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 16126f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 16136f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = true; 16141c61743af946076e988d88baf725382e99d905deEnrico Granata break; 16151c61743af946076e988d88baf725382e99d905deEnrico Granata } 16161c61743af946076e988d88baf725382e99d905deEnrico Granata 16176f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // if directly trying to print ${var%V}, and this is an aggregate, do not let the user do it 1618cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_aggregate && ((was_var_format && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue))) 16191c61743af946076e988d88baf725382e99d905deEnrico Granata { 16201c61743af946076e988d88baf725382e99d905deEnrico Granata s << "<invalid use of aggregate type>"; 16211c61743af946076e988d88baf725382e99d905deEnrico Granata var_success = true; 162286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata break; 162386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 1624107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1625107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!is_array_range) 1626de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1627de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16287b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] dumping ordinary printable output"); 1629107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success = target->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1630de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 1631107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 1632de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1633de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16347b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] checking if I can handle as array"); 1635107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!is_array && !is_pointer) 1636107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton break; 1637de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16387b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] handle as array"); 1639ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* special_directions = NULL; 1640ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata StreamString special_directions_writer; 1641107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (close_bracket_position && (var_name_end-close_bracket_position > 1)) 1642107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1643ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString additional_data; 1644ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata additional_data.SetCStringWithLength(close_bracket_position+1, var_name_end-close_bracket_position-1); 1645ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata special_directions_writer.Printf("${%svar%s}", 1646ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata do_deref_pointer ? "*" : "", 1647ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata additional_data.GetCString()); 1648ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata special_directions = special_directions_writer.GetData(); 1649107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 16509762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1651107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // let us display items index_lower thru index_higher of this array 1652107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar('['); 1653107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success = true; 1654107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1655107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (index_higher < 0) 1656f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata index_higher = valobj->GetNumChildren() - 1; 1657107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1658b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton uint32_t max_num_children = target->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); 1659018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 1660107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton for (;index_lower<=index_higher;index_lower++) 1661107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1662567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObject* item = ExpandIndexedExpression (target, 1663567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton index_lower, 1664567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx->GetFramePtr(), 1665567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton false).get(); 1666107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1667ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!item) 1668ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1669de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16705f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("[Debugger::FormatPrompt] ERROR in getting child item at index %" PRId64, index_lower); 1671ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1672ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1673ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1674de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16757b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] special_directions for child item: %s",special_directions); 1676ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1677ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1678107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!special_directions) 1679107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success &= item->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1680107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 1681107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success &= FormatPrompt(special_directions, sc, exe_ctx, addr, s, NULL, item); 1682107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1683018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata if (--max_num_children == 0) 1684018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata { 1685018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata s.PutCString(", ..."); 1686018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata break; 1687018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata } 1688018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 1689107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (index_lower < index_higher) 1690107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar(','); 1691107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1692107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar(']'); 16939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 16941391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 16959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata break; 1696d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'a': 1697d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "addr}", strlen("addr}")) == 0) 1698d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1699d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (addr && addr->IsValid()) 1700d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1701d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 1702d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = *addr; 1703d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1704d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1705f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "ansi.", strlen("ansi.")) == 0) 1706f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1707f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = true; 1708f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("ansi."); // Skip the "ansi." 1709f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "fg.", strlen("fg.")) == 0) 1710f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1711f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("fg."); // Skip the "fg." 1712f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0) 1713f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1714f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1715f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1716f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_black, 1717f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1718f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1719f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0) 1720f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1721f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1722f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1723f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_red, 1724f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1725f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1726f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0) 1727f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1728f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1729f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1730f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_green, 1731f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1732f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1733f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0) 1734f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1735f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1736f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1737f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_yellow, 1738f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1739f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1740f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0) 1741f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1742f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1743f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1744f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_blue, 1745f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1746f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1747f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0) 1748f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1749f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1750f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1751f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_purple, 1752f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1753f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1754f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0) 1755f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1756f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1757f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1758f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_cyan, 1759f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1760f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1761f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0) 1762f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1763f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1764f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1765f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_white, 1766f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1767f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1768f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1769f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1770f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1771f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1772f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1773f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "bg.", strlen("bg.")) == 0) 1774f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1775f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("bg."); // Skip the "bg." 1776f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0) 1777f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1778f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1779f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1780f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_black, 1781f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1782f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1783f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0) 1784f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1785f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1786f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1787f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_red, 1788f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1789f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1790f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0) 1791f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1792f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1793f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1794f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_green, 1795f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1796f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1797f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0) 1798f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1799f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1800f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1801f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_yellow, 1802f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1803f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1804f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0) 1805f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1806f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1807f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1808f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_blue, 1809f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1810f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1811f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0) 1812f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1813f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1814f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1815f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_purple, 1816f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1817f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1818f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0) 1819f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1820f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1821f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1822f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_cyan, 1823f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1824f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1825f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0) 1826f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1827f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1828f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1829f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_white, 1830f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1831f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1832f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1833f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1834f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1835f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1836f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1837f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "normal}", strlen ("normal}")) == 0) 1838f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1839f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1840f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1841f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_normal, 1842f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1843f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1844f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "bold}", strlen("bold}")) == 0) 1845f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1846f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1847f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1848f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_bold, 1849f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1850f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1851f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "faint}", strlen("faint}")) == 0) 1852f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1853f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1854f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1855f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_faint, 1856f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1857f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1858f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "italic}", strlen("italic}")) == 0) 1859f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1860f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1861f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1862f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_italic, 1863f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1864f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1865f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "underline}", strlen("underline}")) == 0) 1866f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1867f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1868f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1869f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_underline, 1870f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1871f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1872f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "slow-blink}", strlen("slow-blink}")) == 0) 1873f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1874f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1875f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1876f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_slow_blink, 1877f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1878f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1879f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "fast-blink}", strlen("fast-blink}")) == 0) 1880f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1881f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1882f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1883f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_fast_blink, 1884f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1885f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1886f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "negative}", strlen("negative}")) == 0) 1887f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1888f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1889f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1890f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_negative, 1891f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1892f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1893f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "conceal}", strlen("conceal}")) == 0) 1894f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1895f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1896f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1897f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_conceal, 1898f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1899f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton 1900f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1901f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "crossed-out}", strlen("crossed-out}")) == 0) 1902f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1903f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1904f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1905f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_crossed_out, 1906f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1907f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1908f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1909f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1910f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1911f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1912f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1913d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1914d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1915d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'p': 1916d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "process.", strlen("process.")) == 0) 1917d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1918567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1919d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1920567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 1921567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 1922d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1923567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("process."); 1924567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 1925d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 19265f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("%" PRIu64, process->GetID()); 1927567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1928567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1929567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if ((::strncmp (var_name_begin, "name}", strlen("name}")) == 0) || 1930567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton (::strncmp (var_name_begin, "file.basename}", strlen("file.basename}")) == 0) || 1931567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton (::strncmp (var_name_begin, "file.fullpath}", strlen("file.fullpath}")) == 0)) 1932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Module *exe_module = process->GetTarget().GetExecutableModulePointer(); 1934567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_module) 1935d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1936567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f') 1937567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1938567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename(); 1939567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = format_file_spec; 1940567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1941567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else 1942567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1943567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_file_spec = exe_module->GetFileSpec(); 1944567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = format_file_spec; 1945567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1946d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1947d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1948d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1949567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1950d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1951d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1952d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1953d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 't': 1954d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "thread.", strlen("thread.")) == 0) 1955d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1956567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1957d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1958567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Thread *thread = exe_ctx->GetThreadPtr(); 1959567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread) 1960d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1961567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("thread."); 1962567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 1963d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 19645f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("0x%4.4" PRIx64, thread->GetID()); 1965567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1966567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1967567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) 1968567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1969567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.Printf("%u", thread->GetIndexID()); 1970567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1971567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1972567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) 1973567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1974567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = thread->GetName(); 1975567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = cstr && cstr[0]; 1976567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_success) 1977d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutCString(cstr); 1978567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1979567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "queue}", strlen("queue}")) == 0) 1980567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1981567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = thread->GetQueueName(); 1982567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = cstr && cstr[0]; 1983567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_success) 1984567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.PutCString(cstr); 1985567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1986567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "stop-reason}", strlen("stop-reason}")) == 0) 1987567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1988567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo (); 19896bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham if (stop_info_sp && stop_info_sp->IsValid()) 1990567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1991567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = stop_info_sp->GetDescription(); 1992567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (cstr && cstr[0]) 1993567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1994567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.PutCString(cstr); 1995567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1996567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1997d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1998d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 19991586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham else if (::strncmp (var_name_begin, "return-value}", strlen("return-value}")) == 0) 20001586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 20011586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham StopInfoSP stop_info_sp = thread->GetStopInfo (); 20026bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham if (stop_info_sp && stop_info_sp->IsValid()) 20031586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 20041586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham ValueObjectSP return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp); 20051586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham if (return_valobj_sp) 20061586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 2007c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata ValueObject::DumpValueObject (s, return_valobj_sp.get()); 2008016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham var_success = true; 20091586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 20101586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 20111586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 2012d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2013d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2014d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2015d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "target.", strlen("target.")) == 0) 2016d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 201773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // TODO: hookup properties 201873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (!target_properties_sp) 201973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 202073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 202173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (target) 202273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// target_properties_sp = target->GetProperties(); 202373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 202473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 202573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (target_properties_sp) 202673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 202773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// var_name_begin += ::strlen ("target."); 202873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// const char *end_property = strchr(var_name_begin, '}'); 202973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (end_property) 203073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 203173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// ConstString property_name(var_name_begin, end_property - var_name_begin); 203273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// std::string property_value (target_properties_sp->GetPropertyValue(property_name)); 203373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (!property_value.empty()) 203473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 203573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// s.PutCString (property_value.c_str()); 203673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// var_success = true; 203773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 203873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 203973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 2040a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2041a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (target) 2042d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2043d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("target."); 2044d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "arch}", strlen("arch}")) == 0) 2045d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2046d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ArchSpec arch (target->GetArchitecture ()); 2047d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (arch.IsValid()) 2048d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2049940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton s.PutCString (arch.GetArchitectureName()); 2050d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2051d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2052d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 205373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 2054d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2055d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2056d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2057d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2058d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'm': 2059d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "module.", strlen("module.")) == 0) 2060d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2061a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc && sc->module_sp.get()) 2062d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2063a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Module *module = sc->module_sp.get(); 2064d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("module."); 2065d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2066d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 2067d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2068d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (module->GetFileSpec()) 2069d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2072d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 2073d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2074d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = module->GetFileSpec().GetFilename(); 2075d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2076d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2077d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 2078d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = module->GetFileSpec(); 2080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2081d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2083d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2084d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2085d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2086d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2087d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2088d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2089d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'f': 2090d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 2091d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2092d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && sc->comp_unit != NULL) 2093d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2094d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2095d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2096d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 2097d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2098d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = sc->comp_unit->GetFilename(); 2099d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2100d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2101d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 2102d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2103d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = *sc->comp_unit; 2104d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2105d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2106d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2107d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2108d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "frame.", strlen("frame.")) == 0) 2109d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2110567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 2111d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2112567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2113567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame) 2114d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2115567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("frame."); 2116567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) 2117567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2118567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.Printf("%u", frame->GetFrameIndex()); 2119567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2120567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2121567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "pc}", strlen("pc}")) == 0) 2122567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2123567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2124567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_PC; 2125567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2126567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2127567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "sp}", strlen("sp}")) == 0) 2128567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2129567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2130567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_SP; 2131567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2132567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2133567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "fp}", strlen("fp}")) == 0) 2134567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2135567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2136567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FP; 2137567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2138567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2139567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "flags}", strlen("flags}")) == 0) 2140567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2141567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2142567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FLAGS; 2143567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2144567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2145567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "reg.", strlen ("reg.")) == 0) 2146d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2147567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 2148567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (reg_ctx) 2149d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2150567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("reg."); 2151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_name_begin < var_name_end) 2152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton std::string reg_name (var_name_begin, var_name_end); 2154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str()); 2155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (reg_info) 2156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2158d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2159d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2160d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2161d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2162d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2163d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "function.", strlen("function.")) == 0) 2164d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2165d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && (sc->function != NULL || sc->symbol != NULL)) 2166d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2167d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("function."); 2168d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 2169d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2170d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc->function) 21715f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("function{0x%8.8" PRIx64 "}", sc->function->GetID()); 2172d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2173d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf("symbol[%u]", sc->symbol->GetID()); 2174d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2175d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2176d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2177d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) 2178d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2179d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc->function) 2180d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton cstr = sc->function->GetName().AsCString (NULL); 2181d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (sc->symbol) 2182d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 2183d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (cstr) 2184d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2185d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutCString(cstr); 2186b7af177d19c625088864845c89c16465c424df5aGreg Clayton 2187b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (sc->block) 2188b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2189b7af177d19c625088864845c89c16465c424df5aGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2190b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_block) 2191b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2192b7af177d19c625088864845c89c16465c424df5aGreg Clayton const InlineFunctionInfo *inline_info = sc->block->GetInlinedFunctionInfo(); 2193b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_info) 2194b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2195b7af177d19c625088864845c89c16465c424df5aGreg Clayton s.PutCString(" [inlined] "); 2196b7af177d19c625088864845c89c16465c424df5aGreg Clayton inline_info->GetName().Dump(&s); 2197b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2198b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2199b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2200d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2201d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2202d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2203f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else if (::strncmp (var_name_begin, "name-with-args}", strlen("name-with-args}")) == 0) 2204f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2205f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton // Print the function name with arguments in it 2206f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2207f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (sc->function) 2208f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2209f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton var_success = true; 2210f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton ExecutionContextScope *exe_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL; 2211f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = sc->function->GetName().AsCString (NULL); 2212f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (cstr) 2213f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2214f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const InlineFunctionInfo *inline_info = NULL; 2215f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableListSP variable_list_sp; 2216f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton bool get_function_vars = true; 2217f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (sc->block) 2218f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2219f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2220f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2221f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_block) 2222f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2223f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton get_function_vars = false; 2224f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton inline_info = sc->block->GetInlinedFunctionInfo(); 2225f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_info) 2226f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton variable_list_sp = inline_block->GetBlockVariableList (true); 2227f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2228f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2229f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2230f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (get_function_vars) 2231f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2232f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton variable_list_sp = sc->function->GetBlock(true).GetBlockVariableList (true); 2233f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2234f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2235f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_info) 2236f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2237f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (cstr); 2238f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (" [inlined] "); 2239f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = inline_info->GetName().GetCString(); 2240f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2241f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2242f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableList args; 2243f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (variable_list_sp) 2244f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2245f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const size_t num_variables = variable_list_sp->GetSize(); 2246f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton for (size_t var_idx = 0; var_idx < num_variables; ++var_idx) 2247f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2248f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableSP var_sp (variable_list_sp->GetVariableAtIndex(var_idx)); 2249f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (var_sp->GetScope() == eValueTypeVariableArgument) 2250f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton args.AddVariable (var_sp); 2251f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2252f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2253f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2254f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (args.GetSize() > 0) 2255f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2256f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *open_paren = strchr (cstr, '('); 2257f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *close_paren = NULL; 2258f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (open_paren) 22592938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton { 22602938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton if (strncmp(open_paren, "(anonymous namespace)", strlen("(anonymous namespace)")) == 0) 22612938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton { 22622938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton open_paren = strchr (open_paren + strlen("(anonymous namespace)"), '('); 22632938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton if (open_paren) 22642938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton close_paren = strchr (open_paren, ')'); 22652938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton } 22662938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton else 22672938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton close_paren = strchr (open_paren, ')'); 22682938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton } 2269f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2270f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (open_paren) 2271f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.Write(cstr, open_paren - cstr + 1); 2272f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2273f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2274f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (cstr); 2275f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutChar ('('); 2276f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2277c43e7b88339a0267220c56b7207955d035fea4cbGreg Clayton const size_t num_args = args.GetSize(); 2278f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton for (size_t arg_idx = 0; arg_idx < num_args; ++arg_idx) 2279f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2280f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableSP var_sp (args.GetVariableAtIndex (arg_idx)); 2281f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton ValueObjectSP var_value_sp (ValueObjectVariable::Create (exe_scope, var_sp)); 2282f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *var_name = var_value_sp->GetName().GetCString(); 2283f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *var_value = var_value_sp->GetValueAsCString(); 22848e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton if (arg_idx > 0) 22858e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton s.PutCString (", "); 2286f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (var_value_sp->GetError().Success()) 2287f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.Printf ("%s=%s", var_name, var_value); 22888e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton else 22898e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton s.Printf ("%s=<unavailable>", var_name); 2290f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2291f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2292f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (close_paren) 2293f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (close_paren); 2294f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2295f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutChar(')'); 2296f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2297f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2298f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2299f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2300f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString(cstr); 2301f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2302f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2303f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2304f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else if (sc->symbol) 2305f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2306f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 2307f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (cstr) 2308f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2309f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString(cstr); 2310f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton var_success = true; 2311f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2312f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2313f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2314d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "addr-offset}", strlen("addr-offset}")) == 0) 2315d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2316d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = addr != NULL; 2317d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2318d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2319d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = *addr; 2320d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2321d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2322d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2323d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "line-offset}", strlen("line-offset}")) == 0) 2324d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2325d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = sc->line_entry.range.GetBaseAddress().IsValid(); 2326d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2327d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2328d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 2329d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2330d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2331d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2332d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "pc-offset}", strlen("pc-offset}")) == 0) 2333d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2334567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2335567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = frame != NULL; 2336d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2337d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2338567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_addr = frame->GetFrameCodeAddress(); 2339d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2340d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2341d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2342d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2343d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2344d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2345d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2346d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'l': 2347d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "line.", strlen("line.")) == 0) 2348d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2349d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && sc->line_entry.IsValid()) 2350d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2351d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("line."); 2352d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 2353d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2354d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2355d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2356d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 2357d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2358d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = sc->line_entry.file.GetFilename(); 2359d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2360d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2361d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 2362d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2363d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = sc->line_entry.file; 2364d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2365d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2366d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2367d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "number}", strlen("number}")) == 0) 2368d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2369d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2370d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf("%u", sc->line_entry.line); 2371d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2372d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if ((::strncmp (var_name_begin, "start-addr}", strlen("start-addr}")) == 0) || 2373d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton (::strncmp (var_name_begin, "end-addr}", strlen("end-addr}")) == 0)) 2374d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2375d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = sc && sc->line_entry.range.GetBaseAddress().IsValid(); 2376d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2377d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2378d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 2379d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_name_begin[0] == 'e') 2380d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr.Slide (sc->line_entry.range.GetByteSize()); 2381d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2382d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2383d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2384d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2385d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2386d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2387d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2388d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2389d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2390d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // If format addr is valid, then we need to print an address 2391d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_num != LLDB_INVALID_REGNUM) 2392d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2393567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2394d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We have a register value to display... 2395d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_num == LLDB_REGNUM_GENERIC_PC && reg_kind == eRegisterKindGeneric) 2396d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2397567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_addr = frame->GetFrameCodeAddress(); 2398d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2399d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2400d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2401d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_ctx == NULL) 2402567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 2403d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2404d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_ctx) 2405d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2406d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_kind != kNumRegisterKinds) 2407d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(reg_kind, reg_num); 2408d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_num); 2409d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = reg_info != NULL; 2410d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2411d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2412d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2413d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2414d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_info != NULL) 2415d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2416061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 2417061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton var_success = reg_ctx->ReadRegister (reg_info, reg_value); 2418061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (var_success) 2419d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2420997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton reg_value.Dump(&s, reg_info, false, false, eFormatDefault); 2421d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2422d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2423d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2424d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (format_file_spec) 2425d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2426d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s << format_file_spec; 2427d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2428d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2429d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // If format addr is valid, then we need to print an address 2430d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (format_addr.IsValid()) 2431d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2432a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = false; 2433a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2434d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (calculate_format_addr_function_offset) 2435d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2436d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Address func_addr; 2437d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2438a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc) 2439a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2440a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc->function) 2441b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2442a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton func_addr = sc->function->GetAddressRange().GetBaseAddress(); 2443b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (sc->block) 2444b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2445b7af177d19c625088864845c89c16465c424df5aGreg Clayton // Check to make sure we aren't in an inline 2446b7af177d19c625088864845c89c16465c424df5aGreg Clayton // function. If we are, use the inline block 2447b7af177d19c625088864845c89c16465c424df5aGreg Clayton // range that contains "format_addr" since 2448b7af177d19c625088864845c89c16465c424df5aGreg Clayton // blocks can be discontiguous. 2449b7af177d19c625088864845c89c16465c424df5aGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2450b7af177d19c625088864845c89c16465c424df5aGreg Clayton AddressRange inline_range; 2451b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_block && inline_block->GetRangeContainingAddress (format_addr, inline_range)) 2452b7af177d19c625088864845c89c16465c424df5aGreg Clayton func_addr = inline_range.GetBaseAddress(); 2453b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2454b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 24550c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton else if (sc->symbol && sc->symbol->ValueIsAddress()) 24560c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton func_addr = sc->symbol->GetAddress(); 2457a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2458a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2459a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (func_addr.IsValid()) 2460d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2461d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (func_addr.GetSection() == format_addr.GetSection()) 2462d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2463d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t func_file_addr = func_addr.GetFileAddress(); 2464d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t addr_file_addr = format_addr.GetFileAddress(); 2465d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (addr_file_addr > func_file_addr) 24665f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" + %" PRIu64, addr_file_addr - func_file_addr); 2467d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (addr_file_addr < func_file_addr) 24685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" - %" PRIu64, func_file_addr - addr_file_addr); 2469a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2470d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2471d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2472a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2473a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2474a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (target) 2475a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2476a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton addr_t func_load_addr = func_addr.GetLoadAddress (target); 2477a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton addr_t addr_load_addr = format_addr.GetLoadAddress (target); 2478a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (addr_load_addr > func_load_addr) 24795f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" + %" PRIu64, addr_load_addr - func_load_addr); 2480a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else if (addr_load_addr < func_load_addr) 24815f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" - %" PRIu64, func_load_addr - addr_load_addr); 2482a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2483a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2484a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2485d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2486d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2487d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2488d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2489a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2490d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t vaddr = LLDB_INVALID_ADDRESS; 2491a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (exe_ctx && !target->GetSectionLoadList().IsEmpty()) 2492a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton vaddr = format_addr.GetLoadAddress (target); 2493d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (vaddr == LLDB_INVALID_ADDRESS) 2494d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton vaddr = format_addr.GetFileAddress (); 2495d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2496d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (vaddr != LLDB_INVALID_ADDRESS) 2497a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2498395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton int addr_width = target->GetArchitecture().GetAddressByteSize() * 2; 24997fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton if (addr_width == 0) 25007fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton addr_width = 16; 25015f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("0x%*.*" PRIx64, addr_width, addr_width, vaddr); 2502a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2503a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2504d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2505d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2506d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2507d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2508d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success == false) 2509d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton success = false; 2510d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2511d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton p = var_name_end; 2512d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2513d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2514d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2515d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2516d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2517d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2518d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We got a dollar sign with no '{' after it, it must just be a dollar sign 2519d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutChar(*p); 2520d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2521d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2522d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '\\') 2523d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2524d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; // skip the slash 2525d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton switch (*p) 2526d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2527d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'a': s.PutChar ('\a'); break; 2528d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'b': s.PutChar ('\b'); break; 2529d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'f': s.PutChar ('\f'); break; 2530d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'n': s.PutChar ('\n'); break; 2531d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'r': s.PutChar ('\r'); break; 2532d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 't': s.PutChar ('\t'); break; 2533d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'v': s.PutChar ('\v'); break; 2534d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '\'': s.PutChar ('\''); break; 2535d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '\\': s.PutChar ('\\'); break; 2536d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '0': 2537d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // 1 to 3 octal chars 2538d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2539a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Make a string that can hold onto the initial zero char, 2540a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // up to 3 octal digits, and a terminating NULL. 2541a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char oct_str[5] = { 0, 0, 0, 0, 0 }; 2542a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2543a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton int i; 2544a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton for (i=0; (p[i] >= '0' && p[i] <= '7') && i<4; ++i) 2545a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton oct_str[i] = p[i]; 2546a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2547a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // We don't want to consume the last octal character since 2548a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // the main for loop will do this for us, so we advance p by 2549a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // one less than i (even if i is zero) 2550a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton p += i - 1; 2551a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton unsigned long octal_value = ::strtoul (oct_str, NULL, 8); 2552a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (octal_value <= UINT8_MAX) 2553d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 255436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton s.PutChar((char)octal_value); 2555d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2556d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2557d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2558d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2559d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'x': 2560d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // hex number in the format 2561a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (isxdigit(p[1])) 2562d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2563a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton ++p; // Skip the 'x' 2564d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2565a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Make a string that can hold onto two hex chars plus a 2566a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // NULL terminator 2567a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char hex_str[3] = { 0,0,0 }; 2568a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton hex_str[0] = *p; 2569a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (isxdigit(p[1])) 2570d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2571a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton ++p; // Skip the first of the two hex chars 2572a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton hex_str[1] = *p; 2573d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2574a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2575a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton unsigned long hex_value = strtoul (hex_str, NULL, 16); 2576a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (hex_value <= UINT8_MAX) 257736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton s.PutChar ((char)hex_value); 2578a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2579a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else 2580a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2581a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.PutChar('x'); 2582d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2583d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2584d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2585d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton default: 2586a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Just desensitize any other character by just printing what 2587a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // came after the '\' 2588a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s << *p; 2589d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2590d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2591d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2592d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2593d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2594d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2595d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (end) 2596d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton *end = p; 2597d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return success; 2598d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 2599d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 26006c530f2201be4788dedf3d5970399220fbd50b11Jim Inghamvoid 26016c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton) 26026c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham{ 2603d8465214c43d29755822670ad21ced2506faae7aJim Ingham // For simplicity's sake, I am not going to deal with how to close down any 2604d8465214c43d29755822670ad21ced2506faae7aJim Ingham // open logging streams, I just redirect everything from here on out to the 2605d8465214c43d29755822670ad21ced2506faae7aJim Ingham // callback. 26066c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 26076c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham} 26086c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26096c530f2201be4788dedf3d5970399220fbd50b11Jim Inghambool 26106c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::EnableLog (const char *channel, const char **categories, const char *log_file, uint32_t log_options, Stream &error_stream) 26116c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham{ 26126c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham Log::Callbacks log_callbacks; 26136c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26146c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham StreamSP log_stream_sp; 2615b386d82334b65fb984348f2027b1cb7714de993fSean Callanan if (m_log_callback_stream_sp) 26166c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26176c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp = m_log_callback_stream_sp; 26186c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham // For now when using the callback mode you always get thread & timestamp. 26196c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME; 26206c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26216c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else if (log_file == NULL || *log_file == '\0') 26226c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26236c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp.reset(new StreamFile(GetOutputFile().GetDescriptor(), false)); 26246c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26256c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26266c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26276c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham LogStreamMap::iterator pos = m_log_streams.find(log_file); 26282fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton if (pos != m_log_streams.end()) 26292fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton log_stream_sp = pos->second.lock(); 26302fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton if (!log_stream_sp) 26316c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26326c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp.reset (new StreamFile (log_file)); 26336c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_streams[log_file] = log_stream_sp; 26346c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26356c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26366c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham assert (log_stream_sp.get()); 26376c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26386c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_options == 0) 26396c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 26406c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26416c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (Log::GetLogChannelCallbacks (channel, log_callbacks)) 26426c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26436c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_callbacks.enable (log_stream_sp, log_options, categories, &error_stream); 26446c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return true; 26456c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26466c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26476c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26486c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham LogChannelSP log_channel_sp (LogChannel::FindPlugin (channel)); 26496c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_channel_sp) 26506c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26516c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_channel_sp->Enable (log_stream_sp, log_options, &error_stream, categories)) 26526c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26536c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return true; 26546c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26556c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26566c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26576c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham error_stream.Printf ("Invalid log channel '%s'.\n", channel); 26586c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26596c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26606c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26616c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26626c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26636c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham error_stream.Printf ("Invalid log channel '%s'.\n", channel); 26646c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26656c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26666c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26676c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26686c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham} 26696c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 2670535f53c8795b3592ce835804af5cef89be39ceeaGreg ClaytonSourceManager & 2671535f53c8795b3592ce835804af5cef89be39ceeaGreg ClaytonDebugger::GetSourceManager () 2672535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton{ 2673535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton if (m_source_manager_ap.get() == NULL) 2674535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton m_source_manager_ap.reset (new SourceManager (shared_from_this())); 2675535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton return *m_source_manager_ap; 2676535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton} 2677535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton 2678535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton 2679