Debugger.cpp revision 87e9d32a982a0fb76b8657a897ad5781f9a5d25e
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 106d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/API/SBDebugger.h" 116d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 125c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/Debugger.h" 135c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 145c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include <map> 155c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 161391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/DeclCXX.h" 171391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/Type.h" 181391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConnectionFileDescriptor.h" 2107baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata#include "lldb/Core/DataVisualization.h" 225c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/FormatManager.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" 346d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/Host/DynamicLibrary.h" 350fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton#include "lldb/Host/Terminal.h" 3663094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h" 3773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueSInt64.h" 3873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueString.h" 3949ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ClangASTContext.h" 4049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 4149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h" 4249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Symbol.h" 43f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton#include "lldb/Symbol/VariableList.h" 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 46d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/RegisterContext.h" 47d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/StopInfo.h" 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 49f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton#include "lldb/Utility/AnsiTerminal.h" 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic uint32_t g_shared_debugger_refcount = 0; 56558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Ticestatic lldb::user_id_t g_unique_id = 1; 57558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 58d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Static Functions 59d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 60d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic Mutex & 61d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerListMutex () 62d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 63d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton static Mutex g_mutex(Mutex::eMutexTypeRecursive); 64d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return g_mutex; 65d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 66d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 67d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytontypedef std::vector<DebuggerSP> DebuggerList; 68d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 69d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic DebuggerList & 70d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerList() 71d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 72d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // hide the static debugger list inside a singleton accessor to avoid 73d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // global init contructors 74d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton static DebuggerList g_list; 75d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return g_list; 76d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 7773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 7873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionEnumValueElement 7973844aa19a7360b662e2be710fc3c969d6c86606Greg Claytong_show_disassembly_enum_values[] = 8073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 8173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeNever, "never", "Never show disassembly when displaying a stop context."}, 8273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeNoSource, "no-source", "Show disassembly when there is no source information, or the source file is missing when displaying a stop context."}, 8373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeAlways, "always", "Always show disassembly when displaying a stop context."}, 8473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 0, NULL, NULL } 8573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 8673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionEnumValueElement 8873844aa19a7360b662e2be710fc3c969d6c86606Greg Claytong_language_enumerators[] = 8973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 9073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguageNone, "none", "Disable scripting languages."}, 9173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguagePython, "python", "Select python as the default scripting language."}, 9273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguageDefault, "default", "Select the lldb default as the default scripting language."}, 9344ac98c5c04de0b1b558f4207c88be68279a651cGreg Clayton { 0, NULL, NULL } 9473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 9573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 9673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define MODULE_WITH_FUNC "{ ${module.file.basename}{`${function.name-with-args}${function.pc-offset}}}" 9773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define FILE_AND_LINE "{ at ${line.file.basename}:${line.number}}" 9873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 9973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id}"\ 10073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{, ${frame.pc}}"\ 10173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton MODULE_WITH_FUNC\ 10273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FILE_AND_LINE\ 10373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{, stop reason = ${thread.stop-reason}}"\ 10473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{\\nReturn value: ${thread.return-value}}"\ 10573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "\\n" 10673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 10773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define DEFAULT_FRAME_FORMAT "frame #${frame.index}: ${frame.pc}"\ 10873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton MODULE_WITH_FUNC\ 10973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FILE_AND_LINE\ 11073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "\\n" 11173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 1149f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytonstatic PropertyDefinition 1159f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytong_properties[] = 11673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 11773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "auto-confirm", OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true all confirmation prompts will receive their default reply." }, 11873844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 11973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "notify-void", OptionValue::eTypeBoolean, true, false, NULL, NULL, "Notify the user explicitly if an expression returns void (default: false)." }, 1203b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton{ "prompt", OptionValue::eTypeString , true, OptionValueString::eOptionEncodeCharacterEscapeSequences, "(lldb) ", NULL, "The debugger command line prompt displayed for the user." }, 12173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "script-lang", OptionValue::eTypeEnum , true, eScriptLanguagePython, NULL, g_language_enumerators, "The script language to be used for evaluating user-written scripts." }, 12273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "stop-disassembly-count", OptionValue::eTypeSInt64 , true, 4 , NULL, NULL, "The number of disassembly lines to show when displaying a stopped context." }, 12373844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 12473844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 12573844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 12673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "term-width", OptionValue::eTypeSInt64 , true, 80 , NULL, NULL, "The maximum number of columns to use for displaying text." }, 12773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "thread-format", OptionValue::eTypeString , true, 0 , DEFAULT_THREAD_FORMAT, NULL, "The default thread format string to use when displaying thread information." }, 12873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "use-external-editor", OptionValue::eTypeBoolean, true, false, NULL, NULL, "Whether to use an external editor or not." }, 12987e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 13087e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { NULL, OptionValue::eTypeInvalid, true, 0 , NULL, NULL, NULL } 13173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 132d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 13373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonenum 13473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 13573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyAutoConfirm = 0, 13673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyFrameFormat, 13773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyNotiftVoid, 13873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyPrompt, 13973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyScriptLanguage, 14073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopDisassemblyCount, 14173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopDisassemblyDisplay, 14273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopLineCountAfter, 14373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopLineCountBefore, 14473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyTerminalWidth, 14573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyThreadFormat, 14673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyUseExternalEditor 14773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 148d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 14973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 15073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const char * 15173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetFrameFormat() const 15273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 15373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp->GetFrameFormat(); 15473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 15573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const char * 15673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetThreadFormat() const 15773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 15873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp->GetThreadFormat(); 15973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 16073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 1613b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 1623b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 1633b1afc6cc5689b749a48a1506f17ca593b1cda42Greg ClaytonError 1643b1afc6cc5689b749a48a1506f17ca593b1cda42Greg ClaytonDebugger::SetPropertyValue (const ExecutionContext *exe_ctx, 1653b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton VarSetOperationType op, 1663b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *property_path, 1673b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *value) 1683b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton{ 1693b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton Error error (Properties::SetPropertyValue (exe_ctx, op, property_path, value)); 1703b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton if (error.Success()) 1713b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton { 1723b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton if (strcmp(property_path, g_properties[ePropertyPrompt].name) == 0) 1733b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton { 1743b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *new_prompt = GetPrompt(); 1753b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton EventSP prompt_change_event_sp (new Event(CommandInterpreter::eBroadcastBitResetPrompt, new EventDataBytes (new_prompt))); 1763b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton GetCommandInterpreter().BroadcastEvent (prompt_change_event_sp); 1773b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton } 1783b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton } 1793b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton return error; 1803b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton} 1813b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 18273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 18373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetAutoConfirm () const 184be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 18573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyAutoConfirm; 1869f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 187be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 188be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 18973844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 19073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetFrameFormat() const 1911e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan{ 19273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyFrameFormat; 1939f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 1941e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan} 1951e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan 19673844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 19773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetNotifyVoid () const 198be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 19973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyNotiftVoid; 2009f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 201be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 202be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 20373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 20473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetPrompt() const 205be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 20673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyPrompt; 2079f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 208be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 209be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 21073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonvoid 21173844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetPrompt(const char *p) 212be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 21373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyPrompt; 21473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 21573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const char *new_prompt = GetPrompt(); 21673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton EventSP prompt_change_event_sp (new Event(CommandInterpreter::eBroadcastBitResetPrompt, new EventDataBytes (new_prompt)));; 21773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton GetCommandInterpreter().BroadcastEvent (prompt_change_event_sp); 218be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 219be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 22073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 22173844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetThreadFormat() const 222be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 22373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyThreadFormat; 2249f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 225be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 226be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 22773844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::ScriptLanguage 22873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetScriptLanguage() const 229be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 23073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyScriptLanguage; 2319f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return (lldb::ScriptLanguage)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 232be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 233be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 23473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 23573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang) 236be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 23773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyScriptLanguage; 23873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsEnumeration (NULL, idx, script_lang); 239be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 240be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 24173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 24273844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetTerminalWidth () const 243be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 24473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyTerminalWidth; 2459f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 246be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 247be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 24873844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 24973844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetTerminalWidth (uint32_t term_width) 250be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 25173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyTerminalWidth; 25273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsSInt64 (NULL, idx, term_width); 253be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 254be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 25573844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 25673844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetUseExternalEditor () const 257be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 25873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyUseExternalEditor; 2599f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 260be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 261be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 26273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 26373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetUseExternalEditor (bool b) 264be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 26573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyUseExternalEditor; 26673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 267be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 268be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 26973844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 27073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetStopSourceLineCount (bool before) const 271be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 27273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = before ? ePropertyStopLineCountBefore : ePropertyStopLineCountAfter; 2739f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 27473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 275be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 27673844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::StopDisassemblyType 27773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetStopDisassemblyDisplay () const 27873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 27973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyStopDisassemblyDisplay; 2809f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return (Debugger::StopDisassemblyType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 28173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 282be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 28373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 28473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetDisassemblyLineCount () const 28573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 28673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyStopDisassemblyCount; 2879f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 28873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 289be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 290d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Debugger 291d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 29273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const DebuggerPropertiesSP & 29373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetSettings() const 29473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 29573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp; 29673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 29773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 298990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 2990aa2e55f0e9422405ad33675adc1e35044537adbCaroline Ticeint 3000aa2e55f0e9422405ad33675adc1e35044537adbCaroline TiceDebugger::TestDebuggerRefCount () 3010aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice{ 3020aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice return g_shared_debugger_refcount; 3030aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice} 3040aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Initialize () 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 308f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount++ == 0) 309c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::Initialize(); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Terminate () 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31563094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount > 0) 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31763094e0bb161580564954dee512955c1c79d3476Greg Clayton g_shared_debugger_refcount--; 31863094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount == 0) 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 320c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::WillTerminate(); 321c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::Terminate(); 322202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice 323202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice // Clear our master list of debugger objects 324202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 325202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice GetDebuggerList().clear(); 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3302a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid 3312a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsInitialize () 3322a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 333c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Target::SettingsInitialize (); 3342a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 3352a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 3362a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid 3372a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsTerminate () 3382a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 339c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Target::SettingsTerminate (); 3402a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 3412a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 3426d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatabool 3436d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataDebugger::LoadPlugin (const FileSpec& spec) 3446d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 3456d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec)); 3466d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::DebuggerSP debugger_sp(shared_from_this()); 3476d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::SBDebugger debugger_sb(debugger_sp); 3486d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays 3496d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol<LLDBCommandPluginInit>("_ZN4lldb16PluginInitializeENS_10SBDebuggerE"); 3506d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (!init_func) 3516d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return false; 3526d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (init_func(debugger_sb)) 3536d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 3546d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata m_loaded_plugins.push_back(dynlib_sp); 3556d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return true; 3566d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 3576d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return false; 3586d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 3596d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3606d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatastatic FileSpec::EnumerateDirectoryResult 3616d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataLoadPluginCallback 3626d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata( 3636d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata void *baton, 3646d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::FileType file_type, 3656d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const FileSpec &file_spec 3666d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata ) 3676d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 3686d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata Error error; 3696d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3706d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata static ConstString g_dylibext("dylib"); 3716d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3726d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (!baton) 3736d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultQuit; 3746d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3756d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata Debugger *debugger = (Debugger*)baton; 3766d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3776d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // If we have a regular file, a symbolic link or unknown file type, try 3786d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // and process the file. We must handle unknown as sometimes the directory 3796d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // enumeration might be enumerating a file system that doesn't have correct 3806d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // file type information. 3816d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (file_type == FileSpec::eFileTypeRegular || 3826d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeSymbolicLink || 3836d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeUnknown ) 3846d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 3856d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec plugin_file_spec (file_spec); 3866d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata plugin_file_spec.ResolvePath (); 3876d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3886d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (plugin_file_spec.GetFileNameExtension() != g_dylibext) 3896d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 3906d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3916d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata debugger->LoadPlugin (plugin_file_spec); 3926d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3936d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 3946d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 3956d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3966d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata else if (file_type == FileSpec::eFileTypeUnknown || 3976d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeDirectory || 3986d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeSymbolicLink ) 3996d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4006d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // Try and recurse into anything that a directory or symbolic link. 4016d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // We must also do this for unknown as sometimes the directory enumeration 4026d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // might be enurating a file system that doesn't have correct file type 4036d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // information. 4046d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultEnter; 4056d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4066d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4076d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 4086d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 4096d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4106d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatavoid 4116d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataDebugger::InstanceInitialize () 4126d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 4136d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec dir_spec; 4146d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_directories = true; 4156d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_files = true; 4166d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_other = true; 4176d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata char dir_path[PATH_MAX]; 4186d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (Host::GetLLDBPath (ePathTypeLLDBSystemPlugins, dir_spec)) 4196d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4206d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path))) 4216d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4226d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::EnumerateDirectory (dir_path, 4236d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_directories, 4246d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_files, 4256d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_other, 4266d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LoadPluginCallback, 4276d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata this); 4286d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4296d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4306d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4316d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (Host::GetLLDBPath (ePathTypeLLDBUserPlugins, dir_spec)) 4326d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4336d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path))) 4346d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4356d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::EnumerateDirectory (dir_path, 4366d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_directories, 4376d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_files, 4386d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_other, 4396d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LoadPluginCallback, 4406d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata this); 4416d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4426d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 44387e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 44487e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton PluginManager::DebuggerInitialize (*this); 4456d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 4466d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 44763094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebuggerSP 4486c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::CreateInstance (lldb::LogOutputCallback log_callback, void *baton) 44963094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 4506c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham DebuggerSP debugger_sp (new Debugger(log_callback, baton)); 451f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 45263094e0bb161580564954dee512955c1c79d3476Greg Clayton { 45363094e0bb161580564954dee512955c1c79d3476Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 45463094e0bb161580564954dee512955c1c79d3476Greg Clayton GetDebuggerList().push_back(debugger_sp); 45563094e0bb161580564954dee512955c1c79d3476Greg Clayton } 4566d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata debugger_sp->InstanceInitialize (); 45763094e0bb161580564954dee512955c1c79d3476Greg Clayton return debugger_sp; 45863094e0bb161580564954dee512955c1c79d3476Greg Clayton} 45963094e0bb161580564954dee512955c1c79d3476Greg Clayton 460c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Ticevoid 461987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::Destroy (DebuggerSP &debugger_sp) 462c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice{ 463c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice if (debugger_sp.get() == NULL) 464c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice return; 465c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice 466c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham debugger_sp->Clear(); 467c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham 468f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 469c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice { 470f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 471f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList (); 472f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 473f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin (); pos != end; ++pos) 474c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice { 475f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if ((*pos).get() == debugger_sp.get()) 476f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 477f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_list.erase (pos); 478f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return; 479f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 480c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice } 481c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice } 482c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice} 483c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice 484987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebuggerSP 4856e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::FindDebuggerWithInstanceName (const ConstString &instance_name) 4866e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 487987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton DebuggerSP debugger_sp; 488c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton if (g_shared_debugger_refcount > 0) 489c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 490c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 491c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton DebuggerList &debugger_list = GetDebuggerList(); 492c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 493c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton 494c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 495c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 496c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton if ((*pos).get()->m_instance_name == instance_name) 497c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 498c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton debugger_sp = *pos; 499c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton break; 500c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 501c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 502c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 5036e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return debugger_sp; 5046e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 50563094e0bb161580564954dee512955c1c79d3476Greg Clayton 50663094e0bb161580564954dee512955c1c79d3476Greg ClaytonTargetSP 50763094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::FindTargetWithProcessID (lldb::pid_t pid) 50863094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 509987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton TargetSP target_sp; 510f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 51163094e0bb161580564954dee512955c1c79d3476Greg Clayton { 512f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 513f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 514f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 515f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 516f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 517f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid); 518f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (target_sp) 519f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 520f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 52163094e0bb161580564954dee512955c1c79d3476Greg Clayton } 52263094e0bb161580564954dee512955c1c79d3476Greg Clayton return target_sp; 52363094e0bb161580564954dee512955c1c79d3476Greg Clayton} 52463094e0bb161580564954dee512955c1c79d3476Greg Clayton 5251c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonTargetSP 5261c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonDebugger::FindTargetWithProcess (Process *process) 5271c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton{ 5281c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton TargetSP target_sp; 529f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 5301c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton { 531f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 532f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 533f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 534f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 535f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 536f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcess (process); 537f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (target_sp) 538f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 539f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 5401c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton } 5411c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton return target_sp; 5421c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton} 5431c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 5446c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::Debugger (lldb::LogOutputCallback log_callback, void *baton) : 545558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice UserID (g_unique_id++), 54673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Properties(OptionValuePropertiesSP(new OptionValueProperties())), 547eecb0f3b5021e37311f9588f14bcab38a35b8e9aGreg Clayton m_input_comm("debugger.input"), 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_file (), 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_output_file (), 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error_file (), 5515a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_target_list (*this), 552b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_platform_list (), 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_listener ("lldb.Debugger"), 554cc637461f6c59851302836c64e0cb002de4f4571Jim Ingham m_source_manager(*this), 555cc637461f6c59851302836c64e0cb002de4f4571Jim Ingham m_source_file_cache(), 55663094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)), 557d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack (), 55873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_input_reader_data (), 55973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_instance_name() 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton char instance_cstr[256]; 56273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton snprintf(instance_cstr, sizeof(instance_cstr), "debugger_%d", (int)GetID()); 56373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_instance_name.SetCString(instance_cstr); 5646c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_callback) 5656c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 56663094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->Initialize (); 567b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Always add our default platform to the platform list 568b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP default_platform_sp (Platform::GetDefaultPlatform()); 569b1888f24fa181489840b9acf193e224d125d0776Greg Clayton assert (default_platform_sp.get()); 570b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_platform_list.Append (default_platform_sp, true); 57173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 5729f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_collection_sp->Initialize (g_properties); 57373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->AppendProperty (ConstString("target"), 57473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ConstString("Settings specify to debugging targets."), 57573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton true, 57673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Target::GetGlobalProperties()->GetValueProperties()); 5779f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton if (m_command_interpreter_ap.get()) 5789f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton { 5799f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_collection_sp->AppendProperty (ConstString("interpreter"), 5809f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton ConstString("Settings specify to the debugger's command interpreter."), 5819f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton true, 5829f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_command_interpreter_ap->GetValueProperties()); 5839f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton } 58473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton OptionValueSInt64 *term_width = m_collection_sp->GetPropertyAtIndexAsOptionValueSInt64 (NULL, ePropertyTerminalWidth); 58573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton term_width->SetMinimumValue(10); 58673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton term_width->SetMaximumValue(1024); 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::~Debugger () 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 591c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham Clear(); 592c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham} 593c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham 594c0c53249938e49e006a982057e9106a97da5ea89Jim Inghamvoid 595c0c53249938e49e006a982057e9106a97da5ea89Jim InghamDebugger::Clear() 596c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham{ 597c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice CleanUpInputReaders(); 5982f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton m_listener.Clear(); 59963094e0bb161580564954dee512955c1c79d3476Greg Clayton int num_targets = m_target_list.GetNumTargets(); 60063094e0bb161580564954dee512955c1c79d3476Greg Clayton for (int i = 0; i < num_targets; i++) 60163094e0bb161580564954dee512955c1c79d3476Greg Clayton { 6022fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton TargetSP target_sp (m_target_list.GetTargetAtIndex (i)); 6032fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (target_sp) 604c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham { 6052fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 6062fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (process_sp) 6072fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton { 6082fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (process_sp->GetShouldDetach()) 6092fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton process_sp->Detach(); 6102fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton } 6112fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton target_sp->Destroy(); 612c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham } 61363094e0bb161580564954dee512955c1c79d3476Greg Clayton } 6145a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham BroadcasterManager::Clear (); 615e585240956453d98413a0f9461a04500f9cba605Greg Clayton 616e585240956453d98413a0f9461a04500f9cba605Greg Clayton // Close the input file _before_ we close the input read communications class 617e585240956453d98413a0f9461a04500f9cba605Greg Clayton // as it does NOT own the input file, our m_input_file does. 618e585240956453d98413a0f9461a04500f9cba605Greg Clayton GetInputFile().Close (); 619e585240956453d98413a0f9461a04500f9cba605Greg Clayton // Now that we have closed m_input_file, we can now tell our input communication 620e585240956453d98413a0f9461a04500f9cba605Greg Clayton // class to close down. Its read thread should quickly exit after we close 621e585240956453d98413a0f9461a04500f9cba605Greg Clayton // the input file handle above. 622e585240956453d98413a0f9461a04500f9cba605Greg Clayton m_input_comm.Clear (); 623c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham} 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 626421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::GetCloseInputOnEOF () const 627421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{ 628421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton return m_input_comm.GetCloseOnEOF(); 629421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton} 630421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton 631421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonvoid 632421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::SetCloseInputOnEOF (bool b) 633421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{ 634421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton m_input_comm.SetCloseOnEOF(b); 635421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton} 636421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton 637421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonbool 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetAsyncExecution () 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64063094e0bb161580564954dee512955c1c79d3476Greg Clayton return !m_command_interpreter_ap->GetSynchronous(); 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetAsyncExecution (bool async_execution) 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64663094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->SetSynchronous (!async_execution); 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership) 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6535892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &in_file = GetInputFile(); 6545892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton in_file.SetStream (fh, tranfer_ownership); 6555892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (in_file.IsValid() == false) 6565892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton in_file.SetStream (stdin, true); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Disconnect from any old connection if we had one 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.Disconnect (); 660bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // Pass false as the second argument to ConnectionFileDescriptor below because 661bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // our "in_file" above will already take ownership if requested and we don't 662bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // want to objects trying to own and close a file descriptor. 663bba48364984bada19ba2aff2993ec583927d8150Greg Clayton m_input_comm.SetConnection (new ConnectionFileDescriptor (in_file.GetDescriptor(), false)); 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this); 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_comm.StartReadThread (&error) == false) 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6695892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &err_file = GetErrorFile(); 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6715892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.Printf ("error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error"); 6725892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton exit(1); 6735892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton } 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership) 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6795892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &out_file = GetOutputFile(); 6805892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton out_file.SetStream (fh, tranfer_ownership); 6815892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (out_file.IsValid() == false) 6825892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton out_file.SetStream (stdout, false); 6830aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 6840aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice GetCommandInterpreter().GetScriptInterpreter()->ResetOutputFileHandle (fh); 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership) 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6905892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &err_file = GetErrorFile(); 6915892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.SetStream (fh, tranfer_ownership); 6925892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (err_file.IsValid() == false) 6935892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.SetStream (stderr, false); 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerExecutionContext 697c833295baeec641086f536e78050388af36784f8Jim InghamDebugger::GetSelectedExecutionContext () 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExecutionContext exe_ctx; 700567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton TargetSP target_sp(GetSelectedTarget()); 701567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetTargetSP (target_sp); 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 705567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 706567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetProcessSP (process_sp); 707567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process_sp && process_sp->IsRunning() == false) 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 709567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread()); 710567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread_sp) 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 712567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetThreadSP (thread_sp); 713567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetSelectedFrame()); 714567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr() == NULL) 715567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetStackFrameAtIndex (0)); 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return exe_ctx; 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7237f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceInputReaderSP 7247f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceDebugger::GetCurrentInputReader () 7257f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice{ 7267f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp; 7277f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 728d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 7297f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice { 7307f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Clear any finished readers from the stack 7317f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice while (CheckIfTopInputReaderIsDone()) ; 7327f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 733d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 734d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice reader_sp = m_input_reader_stack.Top(); 7357f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice } 7367f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 7377f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice return reader_sp; 7387f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice} 7397f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len) 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 743c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (bytes_len > 0) 744c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len); 745c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice else 746c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice ((Debugger *)baton)->DispatchInputEndOfFile (); 747c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInput (const char *bytes, size_t bytes_len) 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 753c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (bytes == NULL || bytes_len == 0) 754c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice return; 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WriteToDefaultReader (bytes, bytes_len); 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 760c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputInterrupt () 761c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{ 762c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_input_reader_data.clear(); 763c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 7647f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 7657f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (reader_sp) 766c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice { 7677f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice reader_sp->Notify (eInputReaderInterrupt); 768c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 7697f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // If notifying the reader of the interrupt finished the reader, we should pop it off the stack. 770c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 771c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 772c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 773c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 774c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid 775c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputEndOfFile () 776c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{ 777c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_input_reader_data.clear(); 778c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 7797f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 7807f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (reader_sp) 781c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice { 7827f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 783c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 7847f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // If notifying the reader of the end-of-file finished the reader, we should pop it off the stack. 785c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 786c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 787c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 788c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 789c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid 790c0446861315ac0d5994f93510e24cbcac9f534adCaroline TiceDebugger::CleanUpInputReaders () 791c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice{ 792c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice m_input_reader_data.clear(); 793c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice 7947f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // The bottom input reader should be the main debugger input reader. We do not want to close that one here. 795d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice while (m_input_reader_stack.GetSize() > 1) 796c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice { 7977f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 798c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice if (reader_sp) 799c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice { 800c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 801c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice reader_sp->SetIsDone (true); 802c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice } 803c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice } 804c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice} 805c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice 806c0446861315ac0d5994f93510e24cbcac9f534adCaroline Ticevoid 8074a348081030cdd2af758fddc869518357d9befd3Caroline TiceDebugger::NotifyTopInputReader (InputReaderAction notification) 8084a348081030cdd2af758fddc869518357d9befd3Caroline Tice{ 8094a348081030cdd2af758fddc869518357d9befd3Caroline Tice InputReaderSP reader_sp (GetCurrentInputReader()); 8104a348081030cdd2af758fddc869518357d9befd3Caroline Tice if (reader_sp) 8114a348081030cdd2af758fddc869518357d9befd3Caroline Tice { 8124a348081030cdd2af758fddc869518357d9befd3Caroline Tice reader_sp->Notify (notification); 8134a348081030cdd2af758fddc869518357d9befd3Caroline Tice 8144a348081030cdd2af758fddc869518357d9befd3Caroline Tice // Flush out any input readers that are done. 8154a348081030cdd2af758fddc869518357d9befd3Caroline Tice while (CheckIfTopInputReaderIsDone ()) 8164a348081030cdd2af758fddc869518357d9befd3Caroline Tice /* Do nothing. */; 8174a348081030cdd2af758fddc869518357d9befd3Caroline Tice } 8184a348081030cdd2af758fddc869518357d9befd3Caroline Tice} 8194a348081030cdd2af758fddc869518357d9befd3Caroline Tice 820b38df1e945846a5d956974ec157902a6ad748868Caroline Ticebool 821987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::InputReaderIsTopReader (const InputReaderSP& reader_sp) 822b38df1e945846a5d956974ec157902a6ad748868Caroline Tice{ 823892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader()); 824b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 825892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice return (reader_sp.get() == top_reader_sp.get()); 826b38df1e945846a5d956974ec157902a6ad748868Caroline Tice} 827b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 828b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 8294a348081030cdd2af758fddc869518357d9befd3Caroline Ticevoid 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::WriteToDefaultReader (const char *bytes, size_t bytes_len) 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes && bytes_len) 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.append (bytes, bytes_len); 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_reader_data.empty()) 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 838d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice while (!m_input_reader_stack.IsEmpty() && !m_input_reader_data.empty()) 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the input reader from the top of the stack 8417f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84553d68e749f0715691a95f23e9490d97e484b15daGreg Clayton size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(), 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.size()); 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_handled) 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.erase (0, bytes_handled); 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No bytes were handled, we might not have reached our 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // granularity, just return and wait for more data 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8597f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Flush out any input readers that are done. 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (CheckIfTopInputReaderIsDone ()) 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /* Do nothing. */; 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PushInputReader (const InputReaderSP& reader_sp) 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 8707f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 8717f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Deactivate the old top reader 8727f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader ()); 8737f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 8747f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (top_reader_sp) 8757f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice top_reader_sp->Notify (eInputReaderDeactivate); 8767f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 877d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack.Push (reader_sp); 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderActivate); 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 883987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::PopInputReader (const InputReaderSP& pop_reader_sp) 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The reader on the stop of the stack is done, so let the next 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // read on the stack referesh its prompt and if there is one... 889d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8917f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 892d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get()) 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 896d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack.Pop (); 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDeactivate); 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDone); 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 901d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 903d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice reader_sp = m_input_reader_stack.Top(); 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp) 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderReactivate); 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::CheckIfTopInputReaderIsDone () 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 919d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9217f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 922d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp && reader_sp->IsDone()) 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PopInputReader (reader_sp); 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::ActivateInputReader (const InputReaderSP &reader_sp) 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9365892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton int input_fd = m_input_file.GetFile().GetDescriptor(); 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9385892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (input_fd >= 0) 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9405892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton Terminal tty(input_fd); 9410fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 9420fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetEcho(reader_sp->GetEcho()); 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9440fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton switch (reader_sp->GetGranularity()) 9450fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton { 9460fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityByte: 9470fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityWord: 9480fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetCanonical (false); 9490fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 9500fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 9510fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityLine: 9520fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityAll: 9530fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetCanonical (true); 9540fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 9550fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 9560fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton default: 9570fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96163094e0bb161580564954dee512955c1c79d3476Greg Clayton 962e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP 963e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncOutputStream () 964e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{ 965e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 966e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham CommandInterpreter::eBroadcastBitAsynchronousOutputData)); 967e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham} 968e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham 969e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP 970e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncErrorStream () 971e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{ 972e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 973e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham CommandInterpreter::eBroadcastBitAsynchronousErrorData)); 974e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham} 975e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham 97616376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granatauint32_t 97716376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico GranataDebugger::GetNumDebuggers() 97816376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata{ 979f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 980f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 981f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 982f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return GetDebuggerList().size(); 983f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 984f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return 0; 98516376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata} 98616376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 98716376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granatalldb::DebuggerSP 98816376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico GranataDebugger::GetDebuggerAtIndex (uint32_t index) 98916376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata{ 99016376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata DebuggerSP debugger_sp; 99116376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 992f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 993f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 994f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 995f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 99616376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 997f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (index < debugger_list.size()) 998f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_sp = debugger_list[index]; 999f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1000f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton 100116376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata return debugger_sp; 100216376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata} 100316376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 1004558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebuggerSP 1005558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebugger::FindDebuggerWithID (lldb::user_id_t id) 1006558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice{ 1007987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton DebuggerSP debugger_sp; 1008558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 1009f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 1010558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 1011f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1012f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 1013f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 1014f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 1015558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 1016f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if ((*pos).get()->GetID() == id) 1017f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 1018f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_sp = *pos; 1019f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 1020f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1021558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 1022558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 1023558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice return debugger_sp; 1024558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice} 10256e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 1026d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic void 1027d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonTestPromptFormats (StackFrame *frame) 1028d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 1029d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (frame == NULL) 1030d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return; 1031d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1032d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton StreamString s; 1033d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *prompt_format = 1034d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{addr = '${addr}'\n}" 1035d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.id = '${process.id}'\n}" 1036d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.name = '${process.name}'\n}" 1037d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.file.basename = '${process.file.basename}'\n}" 1038d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.file.fullpath = '${process.file.fullpath}'\n}" 1039d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.id = '${thread.id}'\n}" 1040d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.index = '${thread.index}'\n}" 1041d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.name = '${thread.name}'\n}" 1042d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.queue = '${thread.queue}'\n}" 1043d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.stop-reason = '${thread.stop-reason}'\n}" 1044d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{target.arch = '${target.arch}'\n}" 1045d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{module.file.basename = '${module.file.basename}'\n}" 1046d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{module.file.fullpath = '${module.file.fullpath}'\n}" 1047d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{file.basename = '${file.basename}'\n}" 1048d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{file.fullpath = '${file.fullpath}'\n}" 1049d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.index = '${frame.index}'\n}" 1050d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.pc = '${frame.pc}'\n}" 1051d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.sp = '${frame.sp}'\n}" 1052d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.fp = '${frame.fp}'\n}" 1053d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.flags = '${frame.flags}'\n}" 1054d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rdi = '${frame.reg.rdi}'\n}" 1055d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rip = '${frame.reg.rip}'\n}" 1056d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rsp = '${frame.reg.rsp}'\n}" 1057d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rbp = '${frame.reg.rbp}'\n}" 1058d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rflags = '${frame.reg.rflags}'\n}" 1059d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.xmm0 = '${frame.reg.xmm0}'\n}" 1060d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.carp = '${frame.reg.carp}'\n}" 1061d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.id = '${function.id}'\n}" 1062d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.name = '${function.name}'\n}" 10632fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton "{function.name-with-args = '${function.name-with-args}'\n}" 1064d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.addr-offset = '${function.addr-offset}'\n}" 1065d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.line-offset = '${function.line-offset}'\n}" 1066d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.pc-offset = '${function.pc-offset}'\n}" 1067d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.file.basename = '${line.file.basename}'\n}" 1068d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.file.fullpath = '${line.file.fullpath}'\n}" 1069d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.number = '${line.number}'\n}" 1070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.start-addr = '${line.start-addr}'\n}" 1071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.end-addr = '${line.end-addr}'\n}" 1072d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton; 1073d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1074d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextEverything)); 1075d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ExecutionContext exe_ctx; 1076a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton frame->CalculateExecutionContext(exe_ctx); 1077d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *end = NULL; 1078d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (Debugger::FormatPrompt (prompt_format, &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, &end)) 1079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf("%s\n", s.GetData()); 1081d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 1083d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1084d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf ("error: at '%s'\n", end); 1085d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf ("what we got: %s\n", s.GetData()); 1086d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1087d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 1088d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 10899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool 10902c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanFormatDescriptor (const char* var_name_begin, 10912c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_end, 10922c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** var_name_final, 10932c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** percent_position, 1094987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Format* custom_format, 10952c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata ValueObject::ValueObjectRepresentationStyle* val_obj_display) 10969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1097de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 10989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *percent_position = ::strchr(var_name_begin,'%'); 1099107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!*percent_position || *percent_position > var_name_end) 1100de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1101de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11027b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanFormatDescriptor] no format descriptor in string, skipping"); 11039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final = var_name_end; 1104de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 11059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 11069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 11079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final = *percent_position; 11089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char* format_name = new char[var_name_end-*var_name_final]; format_name[var_name_end-*var_name_final-1] = '\0'; 11099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata memcpy(format_name, *var_name_final+1, var_name_end-*var_name_final-1); 1110de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11117b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] parsing %s as a format descriptor", format_name); 11129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if ( !FormatManager::GetFormatFromCString(format_name, 11139762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata true, 11149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *custom_format) ) 11159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1116de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11177b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] %s is an unknown format", format_name); 11189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // if this is an @ sign, print ObjC description 1119107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*format_name == '@') 1120cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleLanguageSpecific; 11219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // if this is a V, print the value using the default format 1122de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'V') 1123cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1124e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // if this is an L, print the location of the value 1125de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'L') 1126cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleLocation; 1127e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // if this is an S, print the summary after all 1128de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'S') 1129cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleSummary; 11304e5397c1127d698c61df295f30909e573a1c9876Enrico Granata else if (*format_name == '#') 1131cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleChildrenCount; 11326f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata else if (*format_name == 'T') 1133cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleType; 1134de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (log) 11357b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] %s is an error, leaving the previous value alone", format_name); 11369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 11379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // a good custom format tells us to print the value using it 11389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 1139de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1140de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11417b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] will display value for this VO"); 1142cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1143de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 11449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata delete format_name; 11459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1146de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11477b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] final format description outcome: custom_format = %d, val_obj_display = %d", 1148de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata *custom_format, 1149de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata *val_obj_display); 11509762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 11519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 11529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 11539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool 11542c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanBracketedRange (const char* var_name_begin, 11552c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_end, 11562c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_final, 11572c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** open_bracket_position, 11582c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** separator_position, 11592c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** close_bracket_position, 11602c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** var_name_final_if_array_range, 11612c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata int64_t* index_lower, 11622c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata int64_t* index_higher) 11639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1164de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 11659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *open_bracket_position = ::strchr(var_name_begin,'['); 1166107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*open_bracket_position && *open_bracket_position < var_name_final) 11679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 11689762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *separator_position = ::strchr(*open_bracket_position,'-'); // might be NULL if this is a simple var[N] bitfield 11699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *close_bracket_position = ::strchr(*open_bracket_position,']'); 11709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // as usual, we assume that [] will come before % 11719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata //printf("trying to expand a []\n"); 11729762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final_if_array_range = *open_bracket_position; 1173107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*close_bracket_position - *open_bracket_position == 1) 11749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1175de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11767b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] '[]' detected.. going from 0 to end of data"); 11779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = 0; 11789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 11799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else if (*separator_position == NULL || *separator_position > var_name_end) 11809762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 11819762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char *end = NULL; 11829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 11839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = *index_lower; 1184de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11857b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] [%lld] detected, high index is same", *index_lower); 11869762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1187107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (*close_bracket_position && *close_bracket_position < var_name_end) 11889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 11899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char *end = NULL; 11909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 11919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = ::strtoul (*separator_position+1, &end, 0); 1192de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11937b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] [%lld-%lld] detected", *index_lower, *index_higher); 11949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 11959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 1196de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1197de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11987b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] expression is erroneous, cannot extract indices out of it"); 11999762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return false; 1200de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 12019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (*index_lower > *index_higher && *index_higher > 0) 12029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1203de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12047b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] swapping indices"); 12059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata int temp = *index_lower; 12069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = *index_higher; 12079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = temp; 12089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 12099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1210de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (log) 12117b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] no bracketed range, skipping entirely"); 12129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 12139762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 12149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 12159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic ValueObjectSP 12162c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataExpandIndexedExpression (ValueObject* valobj, 12172c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata uint32_t index, 12182c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata StackFrame* frame, 12192c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata bool deref_pointer) 12209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1221de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 1222ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* ptr_deref_format = "[%d]"; 1223ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata std::auto_ptr<char> ptr_deref_buffer(new char[10]); 1224ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ::sprintf(ptr_deref_buffer.get(), ptr_deref_format, index); 1225de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12267b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ExpandIndexedExpression] name to deref: %s",ptr_deref_buffer.get()); 1227ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* first_unparsed; 1228ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::GetValueForExpressionPathOptions options; 1229ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathEndResultType final_value_type; 1230ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop; 1231cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathAftermath what_next = (deref_pointer ? ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); 1232f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObjectSP item = valobj->GetValueForExpressionPath (ptr_deref_buffer.get(), 1233ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &first_unparsed, 1234ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &reason_to_stop, 1235ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &final_value_type, 1236ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1237ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &what_next); 1238ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!item) 1239ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1240de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12417b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ExpandIndexedExpression] ERROR: unparsed portion = %s, why stopping = %d," 1242de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1243ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 12449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1245ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1246ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1247de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12487b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ExpandIndexedExpression] ALL RIGHT: unparsed portion = %s, why stopping = %d," 1249de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1250ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1251ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 12529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return item; 12539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 12549762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1255d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonbool 1256d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::FormatPrompt 1257d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton( 1258d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *format, 1259d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const SymbolContext *sc, 1260d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const ExecutionContext *exe_ctx, 1261d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const Address *addr, 1262d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Stream &s, 12631391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char **end, 1264f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObject* valobj 1265d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton) 1266d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 1267f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObject* realvalobj = NULL; // makes it super-easy to parse pointers 1268d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool success = true; 1269d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *p; 1270de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 1271d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton for (p = format; *p != '\0'; ++p) 1272d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1273f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (realvalobj) 12741391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1275f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata valobj = realvalobj; 1276f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata realvalobj = NULL; 12771391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 1278d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton size_t non_special_chars = ::strcspn (p, "${}\\"); 1279d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (non_special_chars > 0) 1280d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1281d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (success) 1282d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Write (p, non_special_chars); 1283d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton p += non_special_chars; 1284d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1285d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1286d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p == '\0') 1287d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1288d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1289d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1290d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '{') 1291d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1292d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Start a new scope that must have everything it needs if it is to 1293d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // to make it into the final output stream "s". If you want to make 1294d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // a format that only prints out the function or symbol name if there 1295d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // is one in the symbol context you can use: 1296d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // "{function =${function.name}}" 1297d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // The first '{' starts a new scope that end with the matching '}' at 1298d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // the end of the string. The contents "function =${function.name}" 1299d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // will then be evaluated and only be output if there is a function 1300d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // or symbol with a valid name. 1301d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton StreamString sub_strm; 1302d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1303d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; // Skip the '{' 1304d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1305f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (FormatPrompt (p, sc, exe_ctx, addr, sub_strm, &p, valobj)) 1306d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1307d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // The stream had all it needed 1308d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Write(sub_strm.GetData(), sub_strm.GetSize()); 1309d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1310d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p != '}') 1311d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1312d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton success = false; 1313d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1314d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1315d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1316d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '}') 1317d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1318d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // End of a enclosing scope 1319d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1320d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1321d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '$') 1322d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1323d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We have a prompt variable to print 1324d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; 1325d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p == '{') 1326d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1327d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; 1328d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *var_name_begin = p; 1329d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *var_name_end = ::strchr (p, '}'); 1330d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1331d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_name_end && var_name_begin < var_name_end) 1332d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1333d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // if we have already failed to parse, skip this variable 1334d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (success) 1335d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1336d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *cstr = NULL; 1337d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Address format_addr; 1338d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool calculate_format_addr_function_offset = false; 1339d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Set reg_kind and reg_num to invalid values 1340d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton RegisterKind reg_kind = kNumRegisterKinds; 1341d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton uint32_t reg_num = LLDB_INVALID_REGNUM; 1342d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton FileSpec format_file_spec; 1343b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info = NULL; 1344d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton RegisterContext *reg_ctx = NULL; 13459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata bool do_deref_pointer = false; 1346cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 1347cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathEndResultType final_value_type = ValueObject::eExpressionPathEndResultTypePlain; 1348ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1349d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Each variable must set success to true below... 1350d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool var_success = false; 1351d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton switch (var_name_begin[0]) 1352d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 13531391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata case '*': 13541391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata case 'v': 1355979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata case 's': 13561391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1357f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (!valobj) 1358979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 1359979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1360afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 13617b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1362afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1363979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // check for *var and *svar 1364979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin == '*') 1365979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1366979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata do_deref_pointer = true; 1367979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata var_name_begin++; 1368979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1369afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1370afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 13717b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1372afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1373979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin == 's') 1374979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1375dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata if (!valobj->IsSynthetic()) 1376dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata valobj = valobj->GetSyntheticValue().get(); 1377cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!valobj) 1378cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1379979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata var_name_begin++; 1380979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1381979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1382afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 13837b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1384afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1385979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // should be a 'v' by now 1386979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin != 'v') 1387979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 1388979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1389afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 13907b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1391afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1392ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathAftermath what_next = (do_deref_pointer ? 1393cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); 1394ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::GetValueForExpressionPathOptions options; 13959c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata options.DontCheckDotVsArrowSyntax().DoAllowBitfieldSyntax().DoAllowFragileIVar().DoAllowSyntheticChildren(); 1396cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ValueObjectRepresentationStyle val_obj_display = ValueObject::eValueObjectRepresentationStyleSummary; 1397107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ValueObject* target = NULL; 1398987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Format custom_format = eFormatInvalid; 1399107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* var_name_final = NULL; 1400107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* var_name_final_if_array_range = NULL; 1401107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* close_bracket_position = NULL; 1402107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton int64_t index_lower = -1; 1403107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton int64_t index_higher = -1; 1404107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton bool is_array_range = false; 1405ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* first_unparsed; 14061c61743af946076e988d88baf725382e99d905deEnrico Granata bool was_plain_var = false; 14071c61743af946076e988d88baf725382e99d905deEnrico Granata bool was_var_format = false; 140807baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata bool was_var_indexed = false; 1409ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1410f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (!valobj) break; 1411f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata // simplest case ${var}, just print valobj's value 1412107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (::strncmp (var_name_begin, "var}", strlen("var}")) == 0) 1413107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 14141c61743af946076e988d88baf725382e99d905deEnrico Granata was_plain_var = true; 1415f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj; 1416cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1417107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1418107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (::strncmp(var_name_begin,"var%",strlen("var%")) == 0) 1419107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 14201c61743af946076e988d88baf725382e99d905deEnrico Granata was_var_format = true; 1421107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this is a variable with some custom format applied to it 1422107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* percent_position; 1423f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj; 1424cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1425107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanFormatDescriptor (var_name_begin, 1426107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1427107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final, 1428107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &percent_position, 1429107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &custom_format, 1430107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &val_obj_display); 1431107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1432107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this is ${var.something} or multiple .something nested 1433107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (::strncmp (var_name_begin, "var", strlen("var")) == 0) 14341391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 143507baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (::strncmp(var_name_begin, "var[", strlen("var[")) == 0) 143607baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata was_var_indexed = true; 1437107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* percent_position; 1438107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanFormatDescriptor (var_name_begin, 1439107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1440107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final, 1441107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &percent_position, 1442107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &custom_format, 1443107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &val_obj_display); 1444107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1445107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* open_bracket_position; 1446107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* separator_position; 1447107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanBracketedRange (var_name_begin, 1448107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1449107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_final, 1450107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &open_bracket_position, 1451107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &separator_position, 1452107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &close_bracket_position, 1453107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final_if_array_range, 1454107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &index_lower, 1455107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &index_higher); 1456107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1457107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton Error error; 1458ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1459ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata std::auto_ptr<char> expr_path(new char[var_name_final-var_name_begin-1]); 1460ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ::memset(expr_path.get(), 0, var_name_final-var_name_begin-1); 1461ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata memcpy(expr_path.get(), var_name_begin+3,var_name_final-var_name_begin-3); 1462ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1463de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 14647b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] symbol to expand: %s",expr_path.get()); 1465ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1466f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj->GetValueForExpressionPath(expr_path.get(), 1467ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &first_unparsed, 1468ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &reason_to_stop, 1469ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &final_value_type, 1470ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1471ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &what_next).get(); 1472ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1473ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!target) 1474107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1475de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 14767b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ERROR: unparsed portion = %s, why stopping = %d," 1477de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1478ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1479ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 14809762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1481ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1482ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1483de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 14847b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ALL RIGHT: unparsed portion = %s, why stopping = %d," 1485de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1486ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1487ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1488107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1489107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 14909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata break; 1491ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1492cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata is_array_range = (final_value_type == ValueObject::eExpressionPathEndResultTypeBoundedRange || 1493cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata final_value_type == ValueObject::eExpressionPathEndResultTypeUnboundedRange); 1494ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1495cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata do_deref_pointer = (what_next == ValueObject::eExpressionPathAftermathDereference); 1496107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 149713cb5406e7f013ca7c15b370ec2fa72f9a911ab5Enrico Granata if (do_deref_pointer && !is_array_range) 14989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1499107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // I have not deref-ed yet, let's do it 1500107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this happens when we are not going through GetValueForVariableExpressionPath 1501107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // to get to the target ValueObject 1502107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton Error error; 1503107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton target = target->Dereference(error).get(); 15042c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata if (error.Fail()) 15052c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata { 15062c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata if (log) 15077b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ERROR: %s\n", error.AsCString("unknown")); \ 15082c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata break; 15092c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata } 1510107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton do_deref_pointer = false; 15119762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 151286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 151307baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // <rdar://problem/11338654> 151407baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // we do not want to use the summary for a bitfield of type T:n 151507baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // if we were originally dealing with just a T - that would get 151607baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // us into an endless recursion 151707baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (target->IsBitfield() && was_var_indexed) 151807baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata { 151907baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // TODO: check for a (T:n)-specific summary - we should still obey that 152007baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata StreamString bitfield_name; 152107baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata bitfield_name.Printf("%s:%d", target->GetTypeName().AsCString(), target->GetBitfieldBitSize()); 152207baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata lldb::TypeNameSpecifierImplSP type_sp(new TypeNameSpecifierImpl(bitfield_name.GetData(),false)); 152307baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (!DataVisualization::GetSummaryForType(type_sp)) 152407baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 152507baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata } 152607baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata 15271c61743af946076e988d88baf725382e99d905deEnrico Granata // TODO use flags for these 152886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool is_array = ClangASTContext::IsArrayType(target->GetClangType()); 152986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool is_pointer = ClangASTContext::IsPointerType(target->GetClangType()); 15301c61743af946076e988d88baf725382e99d905deEnrico Granata bool is_aggregate = ClangASTContext::IsAggregateType(target->GetClangType()); 153186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1532cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((is_array || is_pointer) && (!is_array_range) && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) // this should be wrong, but there are some exceptions 153386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 15341c61743af946076e988d88baf725382e99d905deEnrico Granata StreamString str_temp; 1535de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 15367b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] I am into array || pointer && !range"); 15376f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 1538cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (target->HasSpecialPrintableRepresentation(val_obj_display, 1539cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format)) 15401c61743af946076e988d88baf725382e99d905deEnrico Granata { 15416f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // try to use the special cases 15426f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = target->DumpPrintableRepresentation(str_temp, 15436f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata val_obj_display, 15446f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata custom_format); 15456f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (log) 15467b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] special cases did%s match", var_success ? "" : "n't"); 15476f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 15486f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // should not happen 15496f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (!var_success) 15506f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << "<invalid usage of pointer value as object>"; 15516f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata else 15526f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << str_temp.GetData(); 15531c61743af946076e988d88baf725382e99d905deEnrico Granata var_success = true; 15546f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata break; 15551c61743af946076e988d88baf725382e99d905deEnrico Granata } 15561c61743af946076e988d88baf725382e99d905deEnrico Granata else 15576f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 1558ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata if (was_plain_var) // if ${var} 15596f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 15606f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 15616f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 1562ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata else if (is_pointer) // if pointer, value is the address stored 1563ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata { 15644a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton target->DumpPrintableRepresentation (s, 15654a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton val_obj_display, 15664a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton custom_format, 15674a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton ValueObject::ePrintableRepresentationSpecialCasesDisable); 1568ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata } 15696f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata else 15706f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 15716f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << "<invalid usage of pointer value as object>"; 15726f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 15736f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = true; 15746f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata break; 15756f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 15766f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 15776f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 15786f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // if directly trying to print ${var}, and this is an aggregate, display a nice 15796f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // type @ location message 15806f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (is_aggregate && was_plain_var) 15816f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 15826f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 15836f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = true; 15841c61743af946076e988d88baf725382e99d905deEnrico Granata break; 15851c61743af946076e988d88baf725382e99d905deEnrico Granata } 15861c61743af946076e988d88baf725382e99d905deEnrico Granata 15876f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // if directly trying to print ${var%V}, and this is an aggregate, do not let the user do it 1588cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_aggregate && ((was_var_format && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue))) 15891c61743af946076e988d88baf725382e99d905deEnrico Granata { 15901c61743af946076e988d88baf725382e99d905deEnrico Granata s << "<invalid use of aggregate type>"; 15911c61743af946076e988d88baf725382e99d905deEnrico Granata var_success = true; 159286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata break; 159386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 1594107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1595107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!is_array_range) 1596de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1597de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 15987b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] dumping ordinary printable output"); 1599107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success = target->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1600de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 1601107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 1602de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1603de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16047b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] checking if I can handle as array"); 1605107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!is_array && !is_pointer) 1606107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton break; 1607de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16087b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] handle as array"); 1609ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* special_directions = NULL; 1610ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata StreamString special_directions_writer; 1611107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (close_bracket_position && (var_name_end-close_bracket_position > 1)) 1612107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1613ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString additional_data; 1614ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata additional_data.SetCStringWithLength(close_bracket_position+1, var_name_end-close_bracket_position-1); 1615ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata special_directions_writer.Printf("${%svar%s}", 1616ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata do_deref_pointer ? "*" : "", 1617ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata additional_data.GetCString()); 1618ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata special_directions = special_directions_writer.GetData(); 1619107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 16209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1621107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // let us display items index_lower thru index_higher of this array 1622107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar('['); 1623107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success = true; 1624107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1625107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (index_higher < 0) 1626f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata index_higher = valobj->GetNumChildren() - 1; 1627107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1628b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton uint32_t max_num_children = target->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); 1629018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 1630107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton for (;index_lower<=index_higher;index_lower++) 1631107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1632567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObject* item = ExpandIndexedExpression (target, 1633567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton index_lower, 1634567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx->GetFramePtr(), 1635567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton false).get(); 1636107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1637ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!item) 1638ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1639de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16407b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ERROR in getting child item at index %lld", index_lower); 1641ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1642ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1643ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1644de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16457b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] special_directions for child item: %s",special_directions); 1646ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1647ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1648107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!special_directions) 1649107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success &= item->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1650107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 1651107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success &= FormatPrompt(special_directions, sc, exe_ctx, addr, s, NULL, item); 1652107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1653018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata if (--max_num_children == 0) 1654018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata { 1655018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata s.PutCString(", ..."); 1656018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata break; 1657018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata } 1658018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 1659107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (index_lower < index_higher) 1660107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar(','); 1661107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1662107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar(']'); 16639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 16641391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 16659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata break; 1666d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'a': 1667d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "addr}", strlen("addr}")) == 0) 1668d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1669d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (addr && addr->IsValid()) 1670d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1671d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 1672d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = *addr; 1673d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1674d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1675f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "ansi.", strlen("ansi.")) == 0) 1676f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1677f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = true; 1678f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("ansi."); // Skip the "ansi." 1679f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "fg.", strlen("fg.")) == 0) 1680f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1681f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("fg."); // Skip the "fg." 1682f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0) 1683f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1684f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1685f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1686f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_black, 1687f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1688f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1689f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0) 1690f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1691f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1692f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1693f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_red, 1694f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1695f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1696f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0) 1697f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1698f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1699f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1700f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_green, 1701f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1702f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1703f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0) 1704f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1705f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1706f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1707f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_yellow, 1708f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1709f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1710f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0) 1711f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1712f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1713f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1714f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_blue, 1715f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1716f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1717f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0) 1718f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1719f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1720f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1721f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_purple, 1722f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1723f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1724f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0) 1725f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1726f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1727f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1728f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_cyan, 1729f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1730f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1731f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0) 1732f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1733f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1734f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1735f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_white, 1736f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1737f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1738f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1739f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1740f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1741f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1742f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1743f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "bg.", strlen("bg.")) == 0) 1744f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1745f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("bg."); // Skip the "bg." 1746f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0) 1747f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1748f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1749f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1750f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_black, 1751f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1752f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1753f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0) 1754f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1755f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1756f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1757f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_red, 1758f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1759f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1760f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0) 1761f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1762f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1763f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1764f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_green, 1765f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1766f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1767f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0) 1768f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1769f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1770f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1771f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_yellow, 1772f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1773f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1774f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0) 1775f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1776f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1777f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1778f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_blue, 1779f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1780f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1781f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0) 1782f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1783f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1784f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1785f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_purple, 1786f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1787f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1788f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0) 1789f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1790f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1791f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1792f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_cyan, 1793f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1794f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1795f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0) 1796f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1797f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1798f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1799f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_white, 1800f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1801f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1802f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1803f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1804f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1805f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1806f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1807f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "normal}", strlen ("normal}")) == 0) 1808f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1809f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1810f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1811f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_normal, 1812f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1813f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1814f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "bold}", strlen("bold}")) == 0) 1815f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1816f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1817f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1818f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_bold, 1819f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1820f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1821f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "faint}", strlen("faint}")) == 0) 1822f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1823f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1824f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1825f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_faint, 1826f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1827f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1828f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "italic}", strlen("italic}")) == 0) 1829f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1830f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1831f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1832f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_italic, 1833f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1834f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1835f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "underline}", strlen("underline}")) == 0) 1836f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1837f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1838f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1839f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_underline, 1840f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1841f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1842f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "slow-blink}", strlen("slow-blink}")) == 0) 1843f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1844f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1845f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1846f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_slow_blink, 1847f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1848f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1849f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "fast-blink}", strlen("fast-blink}")) == 0) 1850f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1851f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1852f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1853f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_fast_blink, 1854f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1855f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1856f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "negative}", strlen("negative}")) == 0) 1857f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1858f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1859f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1860f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_negative, 1861f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1862f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1863f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "conceal}", strlen("conceal}")) == 0) 1864f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1865f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1866f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1867f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_conceal, 1868f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1869f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton 1870f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1871f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "crossed-out}", strlen("crossed-out}")) == 0) 1872f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1873f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1874f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1875f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_crossed_out, 1876f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1877f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1878f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1879f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1880f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1881f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1882f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1883d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1884d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1885d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'p': 1886d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "process.", strlen("process.")) == 0) 1887d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1888567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1889d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1890567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 1891567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 1892d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1893567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("process."); 1894567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 1895d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1896444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton s.Printf("%llu", process->GetID()); 1897567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1898567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1899567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if ((::strncmp (var_name_begin, "name}", strlen("name}")) == 0) || 1900567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton (::strncmp (var_name_begin, "file.basename}", strlen("file.basename}")) == 0) || 1901567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton (::strncmp (var_name_begin, "file.fullpath}", strlen("file.fullpath}")) == 0)) 1902567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1903567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Module *exe_module = process->GetTarget().GetExecutableModulePointer(); 1904567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_module) 1905d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1906567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f') 1907567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1908567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename(); 1909567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = format_file_spec; 1910567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1911567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else 1912567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1913567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_file_spec = exe_module->GetFileSpec(); 1914567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = format_file_spec; 1915567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1916d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1917d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1918d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1919567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1920d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1921d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1922d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1923d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 't': 1924d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "thread.", strlen("thread.")) == 0) 1925d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1926567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1927d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1928567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Thread *thread = exe_ctx->GetThreadPtr(); 1929567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread) 1930d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1931567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("thread."); 1932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 1933d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1934444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton s.Printf("0x%4.4llx", thread->GetID()); 1935567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1936567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1937567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) 1938567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1939567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.Printf("%u", thread->GetIndexID()); 1940567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1941567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1942567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) 1943567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1944567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = thread->GetName(); 1945567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = cstr && cstr[0]; 1946567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_success) 1947d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutCString(cstr); 1948567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1949567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "queue}", strlen("queue}")) == 0) 1950567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1951567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = thread->GetQueueName(); 1952567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = cstr && cstr[0]; 1953567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_success) 1954567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.PutCString(cstr); 1955567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1956567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "stop-reason}", strlen("stop-reason}")) == 0) 1957567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1958567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo (); 19596bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham if (stop_info_sp && stop_info_sp->IsValid()) 1960567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1961567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = stop_info_sp->GetDescription(); 1962567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (cstr && cstr[0]) 1963567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1964567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.PutCString(cstr); 1965567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1966567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1967d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1968d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 19691586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham else if (::strncmp (var_name_begin, "return-value}", strlen("return-value}")) == 0) 19701586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 19711586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham StopInfoSP stop_info_sp = thread->GetStopInfo (); 19726bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham if (stop_info_sp && stop_info_sp->IsValid()) 19731586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 19741586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham ValueObjectSP return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp); 19751586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham if (return_valobj_sp) 19761586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 1977016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham ValueObject::DumpValueObjectOptions dump_options; 1978016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham ValueObject::DumpValueObject (s, return_valobj_sp.get(), dump_options); 1979016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham var_success = true; 19801586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 19811586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 19821586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 1983d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1984d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1985d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1986d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "target.", strlen("target.")) == 0) 1987d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 198873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // TODO: hookup properties 198973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (!target_properties_sp) 199073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 199173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 199273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (target) 199373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// target_properties_sp = target->GetProperties(); 199473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 199573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 199673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (target_properties_sp) 199773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 199873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// var_name_begin += ::strlen ("target."); 199973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// const char *end_property = strchr(var_name_begin, '}'); 200073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (end_property) 200173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 200273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// ConstString property_name(var_name_begin, end_property - var_name_begin); 200373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// std::string property_value (target_properties_sp->GetPropertyValue(property_name)); 200473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (!property_value.empty()) 200573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 200673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// s.PutCString (property_value.c_str()); 200773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// var_success = true; 200873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 200973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 201073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 2011a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2012a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (target) 2013d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2014d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("target."); 2015d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "arch}", strlen("arch}")) == 0) 2016d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2017d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ArchSpec arch (target->GetArchitecture ()); 2018d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (arch.IsValid()) 2019d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2020940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton s.PutCString (arch.GetArchitectureName()); 2021d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2022d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2023d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 202473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 2025d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2026d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2027d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2028d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2029d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'm': 2030d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "module.", strlen("module.")) == 0) 2031d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2032a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc && sc->module_sp.get()) 2033d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2034a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Module *module = sc->module_sp.get(); 2035d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("module."); 2036d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2037d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 2038d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2039d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (module->GetFileSpec()) 2040d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2041d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2042d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2043d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 2044d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2045d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = module->GetFileSpec().GetFilename(); 2046d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2047d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2048d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 2049d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2050d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = module->GetFileSpec(); 2051d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2052d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2053d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2054d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2055d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2056d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2057d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2058d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2059d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2060d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'f': 2061d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 2062d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2063d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && sc->comp_unit != NULL) 2064d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2065d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2066d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2067d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 2068d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2069d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = sc->comp_unit->GetFilename(); 2070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2072d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 2073d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2074d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = *sc->comp_unit; 2075d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2076d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2077d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2078d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "frame.", strlen("frame.")) == 0) 2080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2081567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 2082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2083567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2084567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame) 2085d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2086567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("frame."); 2087567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) 2088567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2089567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.Printf("%u", frame->GetFrameIndex()); 2090567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2091567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2092567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "pc}", strlen("pc}")) == 0) 2093567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2094567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2095567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_PC; 2096567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2097567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2098567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "sp}", strlen("sp}")) == 0) 2099567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_SP; 2102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2104567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "fp}", strlen("fp}")) == 0) 2105567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2106567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2107567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FP; 2108567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2109567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2110567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "flags}", strlen("flags}")) == 0) 2111567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2112567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2113567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FLAGS; 2114567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2115567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2116567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "reg.", strlen ("reg.")) == 0) 2117d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2118567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 2119567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (reg_ctx) 2120d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2121567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("reg."); 2122567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_name_begin < var_name_end) 2123567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2124567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton std::string reg_name (var_name_begin, var_name_end); 2125567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str()); 2126567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (reg_info) 2127567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2128567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2129d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2130d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2131d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2132d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2133d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2134d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "function.", strlen("function.")) == 0) 2135d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2136d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && (sc->function != NULL || sc->symbol != NULL)) 2137d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2138d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("function."); 2139d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 2140d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2141d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc->function) 2142444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton s.Printf("function{0x%8.8llx}", sc->function->GetID()); 2143d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2144d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf("symbol[%u]", sc->symbol->GetID()); 2145d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2146d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2147d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2148d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) 2149d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2150d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc->function) 2151d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton cstr = sc->function->GetName().AsCString (NULL); 2152d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (sc->symbol) 2153d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 2154d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (cstr) 2155d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2156d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutCString(cstr); 2157b7af177d19c625088864845c89c16465c424df5aGreg Clayton 2158b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (sc->block) 2159b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2160b7af177d19c625088864845c89c16465c424df5aGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2161b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_block) 2162b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2163b7af177d19c625088864845c89c16465c424df5aGreg Clayton const InlineFunctionInfo *inline_info = sc->block->GetInlinedFunctionInfo(); 2164b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_info) 2165b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2166b7af177d19c625088864845c89c16465c424df5aGreg Clayton s.PutCString(" [inlined] "); 2167b7af177d19c625088864845c89c16465c424df5aGreg Clayton inline_info->GetName().Dump(&s); 2168b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2169b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2170b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2171d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2172d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2173d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2174f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else if (::strncmp (var_name_begin, "name-with-args}", strlen("name-with-args}")) == 0) 2175f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2176f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton // Print the function name with arguments in it 2177f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2178f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (sc->function) 2179f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2180f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton var_success = true; 2181f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton ExecutionContextScope *exe_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL; 2182f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = sc->function->GetName().AsCString (NULL); 2183f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (cstr) 2184f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2185f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const InlineFunctionInfo *inline_info = NULL; 2186f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableListSP variable_list_sp; 2187f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton bool get_function_vars = true; 2188f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (sc->block) 2189f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2190f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2191f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2192f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_block) 2193f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2194f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton get_function_vars = false; 2195f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton inline_info = sc->block->GetInlinedFunctionInfo(); 2196f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_info) 2197f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton variable_list_sp = inline_block->GetBlockVariableList (true); 2198f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2199f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2200f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2201f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (get_function_vars) 2202f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2203f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton variable_list_sp = sc->function->GetBlock(true).GetBlockVariableList (true); 2204f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2205f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2206f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_info) 2207f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2208f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (cstr); 2209f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (" [inlined] "); 2210f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = inline_info->GetName().GetCString(); 2211f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2212f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2213f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableList args; 2214f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (variable_list_sp) 2215f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2216f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const size_t num_variables = variable_list_sp->GetSize(); 2217f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton for (size_t var_idx = 0; var_idx < num_variables; ++var_idx) 2218f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2219f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableSP var_sp (variable_list_sp->GetVariableAtIndex(var_idx)); 2220f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (var_sp->GetScope() == eValueTypeVariableArgument) 2221f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton args.AddVariable (var_sp); 2222f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2223f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2224f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2225f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (args.GetSize() > 0) 2226f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2227f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *open_paren = strchr (cstr, '('); 2228f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *close_paren = NULL; 2229f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (open_paren) 2230f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton close_paren = strchr (open_paren, ')'); 2231f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2232f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (open_paren) 2233f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.Write(cstr, open_paren - cstr + 1); 2234f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2235f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2236f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (cstr); 2237f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutChar ('('); 2238f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2239c43e7b88339a0267220c56b7207955d035fea4cbGreg Clayton const size_t num_args = args.GetSize(); 2240f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton for (size_t arg_idx = 0; arg_idx < num_args; ++arg_idx) 2241f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2242f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableSP var_sp (args.GetVariableAtIndex (arg_idx)); 2243f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton ValueObjectSP var_value_sp (ValueObjectVariable::Create (exe_scope, var_sp)); 2244f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *var_name = var_value_sp->GetName().GetCString(); 2245f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *var_value = var_value_sp->GetValueAsCString(); 2246f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (var_value_sp->GetError().Success()) 2247f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2248f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (arg_idx > 0) 2249f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (", "); 2250f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.Printf ("%s=%s", var_name, var_value); 2251f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2252f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2253f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2254f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (close_paren) 2255f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (close_paren); 2256f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2257f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutChar(')'); 2258f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2259f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2260f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2261f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2262f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString(cstr); 2263f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2264f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2265f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2266f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else if (sc->symbol) 2267f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2268f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 2269f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (cstr) 2270f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2271f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString(cstr); 2272f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton var_success = true; 2273f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2274f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2275f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2276d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "addr-offset}", strlen("addr-offset}")) == 0) 2277d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2278d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = addr != NULL; 2279d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2280d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2281d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = *addr; 2282d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2283d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2284d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2285d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "line-offset}", strlen("line-offset}")) == 0) 2286d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2287d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = sc->line_entry.range.GetBaseAddress().IsValid(); 2288d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2289d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2290d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 2291d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2292d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2293d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2294d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "pc-offset}", strlen("pc-offset}")) == 0) 2295d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2296567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2297567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = frame != NULL; 2298d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2299d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2300567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_addr = frame->GetFrameCodeAddress(); 2301d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2302d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2303d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2304d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2305d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2306d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2307d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2308d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'l': 2309d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "line.", strlen("line.")) == 0) 2310d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2311d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && sc->line_entry.IsValid()) 2312d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2313d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("line."); 2314d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 2315d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2316d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2317d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2318d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 2319d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2320d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = sc->line_entry.file.GetFilename(); 2321d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2322d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2323d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 2324d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2325d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = sc->line_entry.file; 2326d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2327d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2328d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2329d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "number}", strlen("number}")) == 0) 2330d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2331d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2332d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf("%u", sc->line_entry.line); 2333d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2334d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if ((::strncmp (var_name_begin, "start-addr}", strlen("start-addr}")) == 0) || 2335d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton (::strncmp (var_name_begin, "end-addr}", strlen("end-addr}")) == 0)) 2336d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2337d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = sc && sc->line_entry.range.GetBaseAddress().IsValid(); 2338d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2339d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2340d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 2341d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_name_begin[0] == 'e') 2342d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr.Slide (sc->line_entry.range.GetByteSize()); 2343d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2344d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2345d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2346d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2347d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2348d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2349d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2350d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2351d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2352d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // If format addr is valid, then we need to print an address 2353d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_num != LLDB_INVALID_REGNUM) 2354d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2355567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2356d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We have a register value to display... 2357d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_num == LLDB_REGNUM_GENERIC_PC && reg_kind == eRegisterKindGeneric) 2358d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2359567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_addr = frame->GetFrameCodeAddress(); 2360d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2361d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2362d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2363d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_ctx == NULL) 2364567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 2365d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2366d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_ctx) 2367d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2368d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_kind != kNumRegisterKinds) 2369d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(reg_kind, reg_num); 2370d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_num); 2371d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = reg_info != NULL; 2372d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2373d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2374d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2375d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2376d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_info != NULL) 2377d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2378061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 2379061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton var_success = reg_ctx->ReadRegister (reg_info, reg_value); 2380061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (var_success) 2381d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2382997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton reg_value.Dump(&s, reg_info, false, false, eFormatDefault); 2383d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2384d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2385d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2386d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (format_file_spec) 2387d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2388d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s << format_file_spec; 2389d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2390d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2391d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // If format addr is valid, then we need to print an address 2392d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (format_addr.IsValid()) 2393d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2394a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = false; 2395a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2396d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (calculate_format_addr_function_offset) 2397d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2398d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Address func_addr; 2399d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2400a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc) 2401a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2402a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc->function) 2403b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2404a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton func_addr = sc->function->GetAddressRange().GetBaseAddress(); 2405b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (sc->block) 2406b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2407b7af177d19c625088864845c89c16465c424df5aGreg Clayton // Check to make sure we aren't in an inline 2408b7af177d19c625088864845c89c16465c424df5aGreg Clayton // function. If we are, use the inline block 2409b7af177d19c625088864845c89c16465c424df5aGreg Clayton // range that contains "format_addr" since 2410b7af177d19c625088864845c89c16465c424df5aGreg Clayton // blocks can be discontiguous. 2411b7af177d19c625088864845c89c16465c424df5aGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2412b7af177d19c625088864845c89c16465c424df5aGreg Clayton AddressRange inline_range; 2413b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_block && inline_block->GetRangeContainingAddress (format_addr, inline_range)) 2414b7af177d19c625088864845c89c16465c424df5aGreg Clayton func_addr = inline_range.GetBaseAddress(); 2415b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2416b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 24170c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton else if (sc->symbol && sc->symbol->ValueIsAddress()) 24180c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton func_addr = sc->symbol->GetAddress(); 2419a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2420a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2421a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (func_addr.IsValid()) 2422d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2423d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (func_addr.GetSection() == format_addr.GetSection()) 2424d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2425d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t func_file_addr = func_addr.GetFileAddress(); 2426d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t addr_file_addr = format_addr.GetFileAddress(); 2427d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (addr_file_addr > func_file_addr) 2428d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf(" + %llu", addr_file_addr - func_file_addr); 2429d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (addr_file_addr < func_file_addr) 2430d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf(" - %llu", func_file_addr - addr_file_addr); 2431a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2432d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2433d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2434a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2435a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2436a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (target) 2437a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2438a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton addr_t func_load_addr = func_addr.GetLoadAddress (target); 2439a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton addr_t addr_load_addr = format_addr.GetLoadAddress (target); 2440a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (addr_load_addr > func_load_addr) 2441a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.Printf(" + %llu", addr_load_addr - func_load_addr); 2442a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else if (addr_load_addr < func_load_addr) 2443a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.Printf(" - %llu", func_load_addr - addr_load_addr); 2444a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2445a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2446a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2447d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2448d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2449d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2450d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2451a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2452d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t vaddr = LLDB_INVALID_ADDRESS; 2453a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (exe_ctx && !target->GetSectionLoadList().IsEmpty()) 2454a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton vaddr = format_addr.GetLoadAddress (target); 2455d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (vaddr == LLDB_INVALID_ADDRESS) 2456d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton vaddr = format_addr.GetFileAddress (); 2457d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2458d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (vaddr != LLDB_INVALID_ADDRESS) 2459a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2460395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton int addr_width = target->GetArchitecture().GetAddressByteSize() * 2; 24617fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton if (addr_width == 0) 24627fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton addr_width = 16; 24637fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton s.Printf("0x%*.*llx", addr_width, addr_width, vaddr); 2464a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2465a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2466d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2467d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2468d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2469d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2470d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success == false) 2471d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton success = false; 2472d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2473d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton p = var_name_end; 2474d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2475d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2476d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2477d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2478d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2479d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2480d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We got a dollar sign with no '{' after it, it must just be a dollar sign 2481d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutChar(*p); 2482d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2483d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2484d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '\\') 2485d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2486d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; // skip the slash 2487d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton switch (*p) 2488d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2489d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'a': s.PutChar ('\a'); break; 2490d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'b': s.PutChar ('\b'); break; 2491d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'f': s.PutChar ('\f'); break; 2492d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'n': s.PutChar ('\n'); break; 2493d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'r': s.PutChar ('\r'); break; 2494d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 't': s.PutChar ('\t'); break; 2495d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'v': s.PutChar ('\v'); break; 2496d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '\'': s.PutChar ('\''); break; 2497d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '\\': s.PutChar ('\\'); break; 2498d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '0': 2499d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // 1 to 3 octal chars 2500d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2501a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Make a string that can hold onto the initial zero char, 2502a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // up to 3 octal digits, and a terminating NULL. 2503a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char oct_str[5] = { 0, 0, 0, 0, 0 }; 2504a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2505a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton int i; 2506a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton for (i=0; (p[i] >= '0' && p[i] <= '7') && i<4; ++i) 2507a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton oct_str[i] = p[i]; 2508a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2509a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // We don't want to consume the last octal character since 2510a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // the main for loop will do this for us, so we advance p by 2511a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // one less than i (even if i is zero) 2512a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton p += i - 1; 2513a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton unsigned long octal_value = ::strtoul (oct_str, NULL, 8); 2514a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (octal_value <= UINT8_MAX) 2515d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2516a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char octal_char = octal_value; 2517a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.Write (&octal_char, 1); 2518d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2519d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2520d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2521d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2522d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'x': 2523d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // hex number in the format 2524a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (isxdigit(p[1])) 2525d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2526a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton ++p; // Skip the 'x' 2527d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2528a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Make a string that can hold onto two hex chars plus a 2529a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // NULL terminator 2530a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char hex_str[3] = { 0,0,0 }; 2531a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton hex_str[0] = *p; 2532a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (isxdigit(p[1])) 2533d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2534a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton ++p; // Skip the first of the two hex chars 2535a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton hex_str[1] = *p; 2536d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2537a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2538a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton unsigned long hex_value = strtoul (hex_str, NULL, 16); 2539a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (hex_value <= UINT8_MAX) 2540a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.PutChar (hex_value); 2541a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2542a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else 2543a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2544a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.PutChar('x'); 2545d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2546d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2547d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2548d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton default: 2549a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Just desensitize any other character by just printing what 2550a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // came after the '\' 2551a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s << *p; 2552d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2553d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2554d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2555d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2556d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2557d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2558d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (end) 2559d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton *end = p; 2560d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return success; 2561d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 2562d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 25636c530f2201be4788dedf3d5970399220fbd50b11Jim Inghamvoid 25646c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton) 25656c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham{ 2566d8465214c43d29755822670ad21ced2506faae7aJim Ingham // For simplicity's sake, I am not going to deal with how to close down any 2567d8465214c43d29755822670ad21ced2506faae7aJim Ingham // open logging streams, I just redirect everything from here on out to the 2568d8465214c43d29755822670ad21ced2506faae7aJim Ingham // callback. 25696c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 25706c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham} 25716c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 25726c530f2201be4788dedf3d5970399220fbd50b11Jim Inghambool 25736c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::EnableLog (const char *channel, const char **categories, const char *log_file, uint32_t log_options, Stream &error_stream) 25746c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham{ 25756c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham Log::Callbacks log_callbacks; 25766c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 25776c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham StreamSP log_stream_sp; 2578b386d82334b65fb984348f2027b1cb7714de993fSean Callanan if (m_log_callback_stream_sp) 25796c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 25806c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp = m_log_callback_stream_sp; 25816c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham // For now when using the callback mode you always get thread & timestamp. 25826c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME; 25836c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 25846c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else if (log_file == NULL || *log_file == '\0') 25856c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 25866c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp.reset(new StreamFile(GetOutputFile().GetDescriptor(), false)); 25876c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 25886c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 25896c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 25906c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham LogStreamMap::iterator pos = m_log_streams.find(log_file); 25916c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (pos == m_log_streams.end()) 25926c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 25936c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp.reset (new StreamFile (log_file)); 25946c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_streams[log_file] = log_stream_sp; 25956c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 25966c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 25976c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp = pos->second; 25986c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 25996c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham assert (log_stream_sp.get()); 26006c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26016c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_options == 0) 26026c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 26036c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26046c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (Log::GetLogChannelCallbacks (channel, log_callbacks)) 26056c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26066c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_callbacks.enable (log_stream_sp, log_options, categories, &error_stream); 26076c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return true; 26086c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26096c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26106c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26116c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham LogChannelSP log_channel_sp (LogChannel::FindPlugin (channel)); 26126c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_channel_sp) 26136c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26146c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_channel_sp->Enable (log_stream_sp, log_options, &error_stream, categories)) 26156c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26166c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return true; 26176c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26186c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26196c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26206c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham error_stream.Printf ("Invalid log channel '%s'.\n", channel); 26216c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26226c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26236c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26246c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26256c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26266c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham error_stream.Printf ("Invalid log channel '%s'.\n", channel); 26276c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26286c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26296c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26306c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26316c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham} 26326c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 2633