Debugger.cpp revision 2fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Debugger.cpp --------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 126d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/API/SBDebugger.h" 136d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 145c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/Debugger.h" 155c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 165c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include <map> 175c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 181391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/DeclCXX.h" 191391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/Type.h" 201391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConnectionFileDescriptor.h" 2307baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata#include "lldb/Core/DataVisualization.h" 245c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/FormatManager.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/InputReader.h" 2649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2787e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton#include "lldb/Core/PluginManager.h" 28061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 30e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham#include "lldb/Core/StreamAsynchronousIO.h" 316c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham#include "lldb/Core/StreamCallback.h" 32d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Core/StreamString.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 341391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "lldb/Core/ValueObject.h" 35f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton#include "lldb/Core/ValueObjectVariable.h" 366d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/Host/DynamicLibrary.h" 370fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton#include "lldb/Host/Terminal.h" 3863094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h" 3973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueSInt64.h" 4073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueString.h" 4149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ClangASTContext.h" 4249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 4349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h" 4449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Symbol.h" 45f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton#include "lldb/Symbol/VariableList.h" 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 48d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/RegisterContext.h" 49d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/StopInfo.h" 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 51f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton#include "lldb/Utility/AnsiTerminal.h" 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic uint32_t g_shared_debugger_refcount = 0; 58558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Ticestatic lldb::user_id_t g_unique_id = 1; 59558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 60d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Static Functions 61d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 62d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic Mutex & 63d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerListMutex () 64d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 65d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton static Mutex g_mutex(Mutex::eMutexTypeRecursive); 66d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return g_mutex; 67d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 68d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 69d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytontypedef std::vector<DebuggerSP> DebuggerList; 70d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 71d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic DebuggerList & 72d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerList() 73d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 74d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // hide the static debugger list inside a singleton accessor to avoid 75d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // global init contructors 76d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton static DebuggerList g_list; 77d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return g_list; 78d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 7973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionEnumValueElement 8173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytong_show_disassembly_enum_values[] = 8273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 8373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeNever, "never", "Never show disassembly when displaying a stop context."}, 8473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeNoSource, "no-source", "Show disassembly when there is no source information, or the source file is missing when displaying a stop context."}, 8573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeAlways, "always", "Always show disassembly when displaying a stop context."}, 8673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 0, NULL, NULL } 8773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 8873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8973844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionEnumValueElement 9073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytong_language_enumerators[] = 9173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 9273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguageNone, "none", "Disable scripting languages."}, 9373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguagePython, "python", "Select python as the default scripting language."}, 9473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguageDefault, "default", "Select the lldb default as the default scripting language."}, 9544ac98c5c04de0b1b558f4207c88be68279a651cGreg Clayton { 0, NULL, NULL } 9673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 9773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 9873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define MODULE_WITH_FUNC "{ ${module.file.basename}{`${function.name-with-args}${function.pc-offset}}}" 9973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define FILE_AND_LINE "{ at ${line.file.basename}:${line.number}}" 10073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 10173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id}"\ 10273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{, ${frame.pc}}"\ 10373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton MODULE_WITH_FUNC\ 10473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FILE_AND_LINE\ 10573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{, stop reason = ${thread.stop-reason}}"\ 10673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{\\nReturn value: ${thread.return-value}}"\ 10773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "\\n" 10873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 10973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define DEFAULT_FRAME_FORMAT "frame #${frame.index}: ${frame.pc}"\ 11073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton MODULE_WITH_FUNC\ 11173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FILE_AND_LINE\ 11273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "\\n" 11373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 1169f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytonstatic PropertyDefinition 1179f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytong_properties[] = 11873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 11973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "auto-confirm", OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true all confirmation prompts will receive their default reply." }, 12073844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 12173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "notify-void", OptionValue::eTypeBoolean, true, false, NULL, NULL, "Notify the user explicitly if an expression returns void (default: false)." }, 1223b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton{ "prompt", OptionValue::eTypeString , true, OptionValueString::eOptionEncodeCharacterEscapeSequences, "(lldb) ", NULL, "The debugger command line prompt displayed for the user." }, 12373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "script-lang", OptionValue::eTypeEnum , true, eScriptLanguagePython, NULL, g_language_enumerators, "The script language to be used for evaluating user-written scripts." }, 12473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "stop-disassembly-count", OptionValue::eTypeSInt64 , true, 4 , NULL, NULL, "The number of disassembly lines to show when displaying a stopped context." }, 12573844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 12673844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 12773844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 12873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "term-width", OptionValue::eTypeSInt64 , true, 80 , NULL, NULL, "The maximum number of columns to use for displaying text." }, 12973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "thread-format", OptionValue::eTypeString , true, 0 , DEFAULT_THREAD_FORMAT, NULL, "The default thread format string to use when displaying thread information." }, 13073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "use-external-editor", OptionValue::eTypeBoolean, true, false, NULL, NULL, "Whether to use an external editor or not." }, 13187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 13287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { NULL, OptionValue::eTypeInvalid, true, 0 , NULL, NULL, NULL } 13373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 134d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 13573844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonenum 13673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 13773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyAutoConfirm = 0, 13873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyFrameFormat, 13973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyNotiftVoid, 14073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyPrompt, 14173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyScriptLanguage, 14273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopDisassemblyCount, 14373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopDisassemblyDisplay, 14473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopLineCountAfter, 14573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopLineCountBefore, 14673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyTerminalWidth, 14773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyThreadFormat, 14873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyUseExternalEditor 14973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 150d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 15173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 15273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const char * 15373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetFrameFormat() const 15473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 15573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp->GetFrameFormat(); 15673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 15773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const char * 15873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetThreadFormat() const 15973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 16073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp->GetThreadFormat(); 16173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 16273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 1633b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 1643b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 1653b1afc6cc5689b749a48a1506f17ca593b1cda42Greg ClaytonError 1663b1afc6cc5689b749a48a1506f17ca593b1cda42Greg ClaytonDebugger::SetPropertyValue (const ExecutionContext *exe_ctx, 1673b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton VarSetOperationType op, 1683b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *property_path, 1693b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *value) 1703b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton{ 1713b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton Error error (Properties::SetPropertyValue (exe_ctx, op, property_path, value)); 1723b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton if (error.Success()) 1733b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton { 1743b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton if (strcmp(property_path, g_properties[ePropertyPrompt].name) == 0) 1753b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton { 1763b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *new_prompt = GetPrompt(); 1773b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton EventSP prompt_change_event_sp (new Event(CommandInterpreter::eBroadcastBitResetPrompt, new EventDataBytes (new_prompt))); 1783b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton GetCommandInterpreter().BroadcastEvent (prompt_change_event_sp); 1793b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton } 1803b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton } 1813b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton return error; 1823b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton} 1833b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 18473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 18573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetAutoConfirm () const 186be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 18773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyAutoConfirm; 1889f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 189be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 190be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 19173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 19273844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetFrameFormat() const 1931e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan{ 19473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyFrameFormat; 1959f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 1961e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan} 1971e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan 19873844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 19973844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetNotifyVoid () const 200be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 20173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyNotiftVoid; 2029f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 203be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 204be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 20573844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 20673844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetPrompt() const 207be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 20873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyPrompt; 2099f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 210be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 211be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 21273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonvoid 21373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetPrompt(const char *p) 214be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 21573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyPrompt; 21673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 21773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const char *new_prompt = GetPrompt(); 21873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton EventSP prompt_change_event_sp (new Event(CommandInterpreter::eBroadcastBitResetPrompt, new EventDataBytes (new_prompt)));; 21973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton GetCommandInterpreter().BroadcastEvent (prompt_change_event_sp); 220be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 221be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 22273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 22373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetThreadFormat() const 224be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 22573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyThreadFormat; 2269f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 227be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 228be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 22973844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::ScriptLanguage 23073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetScriptLanguage() const 231be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 23273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyScriptLanguage; 2339f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return (lldb::ScriptLanguage)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 234be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 235be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 23673844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 23773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang) 238be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 23973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyScriptLanguage; 24073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsEnumeration (NULL, idx, script_lang); 241be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 242be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 24373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 24473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetTerminalWidth () const 245be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 24673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyTerminalWidth; 2479f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 248be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 249be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 25073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 25173844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetTerminalWidth (uint32_t term_width) 252be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 25373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyTerminalWidth; 25473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsSInt64 (NULL, idx, term_width); 255be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 256be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 25773844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 25873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetUseExternalEditor () const 259be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 26073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyUseExternalEditor; 2619f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 262be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 263be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 26473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 26573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetUseExternalEditor (bool b) 266be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 26773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyUseExternalEditor; 26873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 269be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 270be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 27173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 27273844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetStopSourceLineCount (bool before) const 273be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 27473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = before ? ePropertyStopLineCountBefore : ePropertyStopLineCountAfter; 2759f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 27673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 277be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 27873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::StopDisassemblyType 27973844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetStopDisassemblyDisplay () const 28073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 28173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyStopDisassemblyDisplay; 2829f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return (Debugger::StopDisassemblyType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 28373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 284be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 28573844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 28673844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetDisassemblyLineCount () const 28773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 28873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyStopDisassemblyCount; 2899f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 29073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 291be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 292d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Debugger 293d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 29473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const DebuggerPropertiesSP & 29573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetSettings() const 29673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 29773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp; 29873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 29973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 300990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 3010aa2e55f0e9422405ad33675adc1e35044537adbCaroline Ticeint 3020aa2e55f0e9422405ad33675adc1e35044537adbCaroline TiceDebugger::TestDebuggerRefCount () 3030aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice{ 3040aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice return g_shared_debugger_refcount; 3050aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice} 3060aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Initialize () 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 310f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount++ == 0) 311c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::Initialize(); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Terminate () 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31763094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount > 0) 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31963094e0bb161580564954dee512955c1c79d3476Greg Clayton g_shared_debugger_refcount--; 32063094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount == 0) 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 322c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::WillTerminate(); 323c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::Terminate(); 324202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice 325202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice // Clear our master list of debugger objects 326202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 327202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice GetDebuggerList().clear(); 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3322a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid 3332a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsInitialize () 3342a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 335c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Target::SettingsInitialize (); 3362a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 3372a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 3382a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid 3392a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsTerminate () 3402a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 341c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Target::SettingsTerminate (); 3422a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 3432a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 3446d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatabool 3456d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataDebugger::LoadPlugin (const FileSpec& spec) 3466d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 3476d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec)); 3486d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::DebuggerSP debugger_sp(shared_from_this()); 3496d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::SBDebugger debugger_sb(debugger_sp); 3506d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays 3516d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol<LLDBCommandPluginInit>("_ZN4lldb16PluginInitializeENS_10SBDebuggerE"); 3526d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (!init_func) 3536d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return false; 3546d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (init_func(debugger_sb)) 3556d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 3566d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata m_loaded_plugins.push_back(dynlib_sp); 3576d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return true; 3586d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 3596d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return false; 3606d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 3616d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3626d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatastatic FileSpec::EnumerateDirectoryResult 3636d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataLoadPluginCallback 3646d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata( 3656d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata void *baton, 3666d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::FileType file_type, 3676d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const FileSpec &file_spec 3686d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata ) 3696d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 3706d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata Error error; 3716d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3726d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata static ConstString g_dylibext("dylib"); 3736d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3746d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (!baton) 3756d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultQuit; 3766d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3776d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata Debugger *debugger = (Debugger*)baton; 3786d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3796d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // If we have a regular file, a symbolic link or unknown file type, try 3806d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // and process the file. We must handle unknown as sometimes the directory 3816d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // enumeration might be enumerating a file system that doesn't have correct 3826d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // file type information. 3836d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (file_type == FileSpec::eFileTypeRegular || 3846d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeSymbolicLink || 3856d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeUnknown ) 3866d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 3876d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec plugin_file_spec (file_spec); 3886d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata plugin_file_spec.ResolvePath (); 3896d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3906d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (plugin_file_spec.GetFileNameExtension() != g_dylibext) 3916d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 3926d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3936d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata debugger->LoadPlugin (plugin_file_spec); 3946d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3956d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 3966d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 3976d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 3986d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata else if (file_type == FileSpec::eFileTypeUnknown || 3996d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeDirectory || 4006d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeSymbolicLink ) 4016d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4026d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // Try and recurse into anything that a directory or symbolic link. 4036d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // We must also do this for unknown as sometimes the directory enumeration 4046d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // might be enurating a file system that doesn't have correct file type 4056d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // information. 4066d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultEnter; 4076d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4086d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4096d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 4106d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 4116d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4126d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatavoid 4136d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataDebugger::InstanceInitialize () 4146d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 4156d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec dir_spec; 4166d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_directories = true; 4176d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_files = true; 4186d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_other = true; 4196d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata char dir_path[PATH_MAX]; 4206d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (Host::GetLLDBPath (ePathTypeLLDBSystemPlugins, dir_spec)) 4216d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4226d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path))) 4236d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4246d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::EnumerateDirectory (dir_path, 4256d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_directories, 4266d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_files, 4276d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_other, 4286d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LoadPluginCallback, 4296d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata this); 4306d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4316d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4326d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4336d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (Host::GetLLDBPath (ePathTypeLLDBUserPlugins, dir_spec)) 4346d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4356d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path))) 4366d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4376d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::EnumerateDirectory (dir_path, 4386d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_directories, 4396d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_files, 4406d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_other, 4416d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LoadPluginCallback, 4426d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata this); 4436d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4446d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 44587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 44687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton PluginManager::DebuggerInitialize (*this); 4476d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 4486d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 44963094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebuggerSP 4506c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::CreateInstance (lldb::LogOutputCallback log_callback, void *baton) 45163094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 4526c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham DebuggerSP debugger_sp (new Debugger(log_callback, baton)); 453f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 45463094e0bb161580564954dee512955c1c79d3476Greg Clayton { 45563094e0bb161580564954dee512955c1c79d3476Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 45663094e0bb161580564954dee512955c1c79d3476Greg Clayton GetDebuggerList().push_back(debugger_sp); 45763094e0bb161580564954dee512955c1c79d3476Greg Clayton } 4586d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata debugger_sp->InstanceInitialize (); 45963094e0bb161580564954dee512955c1c79d3476Greg Clayton return debugger_sp; 46063094e0bb161580564954dee512955c1c79d3476Greg Clayton} 46163094e0bb161580564954dee512955c1c79d3476Greg Clayton 462c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Ticevoid 463987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::Destroy (DebuggerSP &debugger_sp) 464c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice{ 465c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice if (debugger_sp.get() == NULL) 466c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice return; 467c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice 468c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham debugger_sp->Clear(); 469c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham 470f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 471c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice { 472f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 473f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList (); 474f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 475f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin (); pos != end; ++pos) 476c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice { 477f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if ((*pos).get() == debugger_sp.get()) 478f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 479f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_list.erase (pos); 480f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return; 481f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 482c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice } 483c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice } 484c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice} 485c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice 486987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebuggerSP 4876e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::FindDebuggerWithInstanceName (const ConstString &instance_name) 4886e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 489987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton DebuggerSP debugger_sp; 490c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton if (g_shared_debugger_refcount > 0) 491c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 492c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 493c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton DebuggerList &debugger_list = GetDebuggerList(); 494c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 495c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton 496c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 497c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 498c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton if ((*pos).get()->m_instance_name == instance_name) 499c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 500c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton debugger_sp = *pos; 501c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton break; 502c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 503c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 504c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 5056e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return debugger_sp; 5066e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 50763094e0bb161580564954dee512955c1c79d3476Greg Clayton 50863094e0bb161580564954dee512955c1c79d3476Greg ClaytonTargetSP 50963094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::FindTargetWithProcessID (lldb::pid_t pid) 51063094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 511987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton TargetSP target_sp; 512f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 51363094e0bb161580564954dee512955c1c79d3476Greg Clayton { 514f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 515f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 516f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 517f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 518f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 519f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid); 520f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (target_sp) 521f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 522f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 52363094e0bb161580564954dee512955c1c79d3476Greg Clayton } 52463094e0bb161580564954dee512955c1c79d3476Greg Clayton return target_sp; 52563094e0bb161580564954dee512955c1c79d3476Greg Clayton} 52663094e0bb161580564954dee512955c1c79d3476Greg Clayton 5271c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonTargetSP 5281c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonDebugger::FindTargetWithProcess (Process *process) 5291c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton{ 5301c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton TargetSP target_sp; 531f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 5321c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton { 533f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 534f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 535f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 536f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 537f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 538f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcess (process); 539f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (target_sp) 540f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 541f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 5421c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton } 5431c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton return target_sp; 5441c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton} 5451c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 5466c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::Debugger (lldb::LogOutputCallback log_callback, void *baton) : 547558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice UserID (g_unique_id++), 54873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Properties(OptionValuePropertiesSP(new OptionValueProperties())), 549eecb0f3b5021e37311f9588f14bcab38a35b8e9aGreg Clayton m_input_comm("debugger.input"), 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_file (), 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_output_file (), 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error_file (), 553b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state (), 5545a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_target_list (*this), 555b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_platform_list (), 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_listener ("lldb.Debugger"), 557cc637461f6c59851302836c64e0cb002de4f4571Jim Ingham m_source_manager(*this), 558cc637461f6c59851302836c64e0cb002de4f4571Jim Ingham m_source_file_cache(), 55963094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)), 560d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack (), 56173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_input_reader_data (), 56273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_instance_name() 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton char instance_cstr[256]; 56573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton snprintf(instance_cstr, sizeof(instance_cstr), "debugger_%d", (int)GetID()); 56673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_instance_name.SetCString(instance_cstr); 5676c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_callback) 5686c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 56963094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->Initialize (); 570b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Always add our default platform to the platform list 571b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP default_platform_sp (Platform::GetDefaultPlatform()); 572b1888f24fa181489840b9acf193e224d125d0776Greg Clayton assert (default_platform_sp.get()); 573b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_platform_list.Append (default_platform_sp, true); 57473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 5759f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_collection_sp->Initialize (g_properties); 57673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->AppendProperty (ConstString("target"), 57773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ConstString("Settings specify to debugging targets."), 57873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton true, 57973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Target::GetGlobalProperties()->GetValueProperties()); 5809f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton if (m_command_interpreter_ap.get()) 5819f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton { 5829f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_collection_sp->AppendProperty (ConstString("interpreter"), 5839f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton ConstString("Settings specify to the debugger's command interpreter."), 5849f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton true, 5859f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_command_interpreter_ap->GetValueProperties()); 5869f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton } 58773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton OptionValueSInt64 *term_width = m_collection_sp->GetPropertyAtIndexAsOptionValueSInt64 (NULL, ePropertyTerminalWidth); 58873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton term_width->SetMinimumValue(10); 58973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton term_width->SetMaximumValue(1024); 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::~Debugger () 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 594c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham Clear(); 595c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham} 596c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham 597c0c53249938e49e006a982057e9106a97da5ea89Jim Inghamvoid 598c0c53249938e49e006a982057e9106a97da5ea89Jim InghamDebugger::Clear() 599c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham{ 600c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice CleanUpInputReaders(); 6012f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton m_listener.Clear(); 60263094e0bb161580564954dee512955c1c79d3476Greg Clayton int num_targets = m_target_list.GetNumTargets(); 60363094e0bb161580564954dee512955c1c79d3476Greg Clayton for (int i = 0; i < num_targets; i++) 60463094e0bb161580564954dee512955c1c79d3476Greg Clayton { 6052fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton TargetSP target_sp (m_target_list.GetTargetAtIndex (i)); 6062fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (target_sp) 607c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham { 6082fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 6092fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (process_sp) 6102fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton { 6112fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (process_sp->GetShouldDetach()) 6122fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton process_sp->Detach(); 6132fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton } 6142fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton target_sp->Destroy(); 615c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham } 61663094e0bb161580564954dee512955c1c79d3476Greg Clayton } 6175a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham BroadcasterManager::Clear (); 618e585240956453d98413a0f9461a04500f9cba605Greg Clayton 619e585240956453d98413a0f9461a04500f9cba605Greg Clayton // Close the input file _before_ we close the input read communications class 620e585240956453d98413a0f9461a04500f9cba605Greg Clayton // as it does NOT own the input file, our m_input_file does. 621b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state.Clear(); 622e585240956453d98413a0f9461a04500f9cba605Greg Clayton GetInputFile().Close (); 623e585240956453d98413a0f9461a04500f9cba605Greg Clayton // Now that we have closed m_input_file, we can now tell our input communication 624e585240956453d98413a0f9461a04500f9cba605Greg Clayton // class to close down. Its read thread should quickly exit after we close 625e585240956453d98413a0f9461a04500f9cba605Greg Clayton // the input file handle above. 626e585240956453d98413a0f9461a04500f9cba605Greg Clayton m_input_comm.Clear (); 627c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham} 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 630421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::GetCloseInputOnEOF () const 631421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{ 632421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton return m_input_comm.GetCloseOnEOF(); 633421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton} 634421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton 635421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonvoid 636421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::SetCloseInputOnEOF (bool b) 637421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{ 638421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton m_input_comm.SetCloseOnEOF(b); 639421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton} 640421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton 641421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonbool 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetAsyncExecution () 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64463094e0bb161580564954dee512955c1c79d3476Greg Clayton return !m_command_interpreter_ap->GetSynchronous(); 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetAsyncExecution (bool async_execution) 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 65063094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->SetSynchronous (!async_execution); 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership) 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6575892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &in_file = GetInputFile(); 6585892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton in_file.SetStream (fh, tranfer_ownership); 6595892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (in_file.IsValid() == false) 6605892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton in_file.SetStream (stdin, true); 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Disconnect from any old connection if we had one 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.Disconnect (); 664bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // Pass false as the second argument to ConnectionFileDescriptor below because 665bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // our "in_file" above will already take ownership if requested and we don't 666bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // want to objects trying to own and close a file descriptor. 667bba48364984bada19ba2aff2993ec583927d8150Greg Clayton m_input_comm.SetConnection (new ConnectionFileDescriptor (in_file.GetDescriptor(), false)); 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this); 669b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 670b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham // Save away the terminal state if that is relevant, so that we can restore it in RestoreInputState. 671b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham SaveInputTerminalState (); 672b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_comm.StartReadThread (&error) == false) 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6765892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &err_file = GetErrorFile(); 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6785892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.Printf ("error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error"); 6795892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton exit(1); 6805892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton } 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership) 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6865892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &out_file = GetOutputFile(); 6875892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton out_file.SetStream (fh, tranfer_ownership); 6885892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (out_file.IsValid() == false) 6895892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton out_file.SetStream (stdout, false); 6900aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 691db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata // do not create the ScriptInterpreter just for setting the output file handle 692db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata // as the constructor will know how to do the right thing on its own 693db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata const bool can_create = false; 694db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata ScriptInterpreter* script_interpreter = GetCommandInterpreter().GetScriptInterpreter(can_create); 695db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (script_interpreter) 696db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata script_interpreter->ResetOutputFileHandle (fh); 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership) 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7025892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &err_file = GetErrorFile(); 7035892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.SetStream (fh, tranfer_ownership); 7045892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (err_file.IsValid() == false) 7055892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.SetStream (stderr, false); 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 708b1087a27f7babc43f332c9d49ac4554892133a41Jim Inghamvoid 709b1087a27f7babc43f332c9d49ac4554892133a41Jim InghamDebugger::SaveInputTerminalState () 710b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham{ 711b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham File &in_file = GetInputFile(); 712b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham if (in_file.GetDescriptor() != File::kInvalidDescriptor) 713b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state.Save(in_file.GetDescriptor(), true); 714b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham} 715b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 716b1087a27f7babc43f332c9d49ac4554892133a41Jim Inghamvoid 717b1087a27f7babc43f332c9d49ac4554892133a41Jim InghamDebugger::RestoreInputTerminalState () 718b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham{ 719b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state.Restore(); 720b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham} 721b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerExecutionContext 723c833295baeec641086f536e78050388af36784f8Jim InghamDebugger::GetSelectedExecutionContext () 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExecutionContext exe_ctx; 726567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton TargetSP target_sp(GetSelectedTarget()); 727567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetTargetSP (target_sp); 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 731567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 732567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetProcessSP (process_sp); 733567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process_sp && process_sp->IsRunning() == false) 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 735567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread()); 736567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread_sp) 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 738567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetThreadSP (thread_sp); 739567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetSelectedFrame()); 740567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr() == NULL) 741567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetStackFrameAtIndex (0)); 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return exe_ctx; 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7497f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceInputReaderSP 7507f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceDebugger::GetCurrentInputReader () 7517f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice{ 7527f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp; 7537f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 754d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 7557f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice { 7567f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Clear any finished readers from the stack 7577f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice while (CheckIfTopInputReaderIsDone()) ; 7587f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 759d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 760d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice reader_sp = m_input_reader_stack.Top(); 7617f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice } 7627f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 7637f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice return reader_sp; 7647f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice} 7657f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len) 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 769c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (bytes_len > 0) 770c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len); 771c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice else 772c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice ((Debugger *)baton)->DispatchInputEndOfFile (); 773c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInput (const char *bytes, size_t bytes_len) 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 779c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (bytes == NULL || bytes_len == 0) 780c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice return; 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WriteToDefaultReader (bytes, bytes_len); 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 786c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputInterrupt () 787c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{ 788c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_input_reader_data.clear(); 789c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 7907f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 7917f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (reader_sp) 792c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice { 7937f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice reader_sp->Notify (eInputReaderInterrupt); 794c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 7957f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // If notifying the reader of the interrupt finished the reader, we should pop it off the stack. 796c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 797c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 798c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 799c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 800c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid 801c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputEndOfFile () 802c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{ 803c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_input_reader_data.clear(); 804c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 8057f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 8067f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (reader_sp) 807c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice { 8087f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 809c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 8107f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // If notifying the reader of the end-of-file finished the reader, we should pop it off the stack. 811c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 812c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 813c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 814c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 815c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid 816c0446861315ac0d5994f93510e24cbcac9f534adCaroline TiceDebugger::CleanUpInputReaders () 817c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice{ 818c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice m_input_reader_data.clear(); 819c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice 8207f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // The bottom input reader should be the main debugger input reader. We do not want to close that one here. 821d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice while (m_input_reader_stack.GetSize() > 1) 822c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice { 8237f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 824c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice if (reader_sp) 825c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice { 826c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 827c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice reader_sp->SetIsDone (true); 828c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice } 829c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice } 830c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice} 831c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice 832c0446861315ac0d5994f93510e24cbcac9f534adCaroline Ticevoid 8334a348081030cdd2af758fddc869518357d9befd3Caroline TiceDebugger::NotifyTopInputReader (InputReaderAction notification) 8344a348081030cdd2af758fddc869518357d9befd3Caroline Tice{ 8354a348081030cdd2af758fddc869518357d9befd3Caroline Tice InputReaderSP reader_sp (GetCurrentInputReader()); 8364a348081030cdd2af758fddc869518357d9befd3Caroline Tice if (reader_sp) 8374a348081030cdd2af758fddc869518357d9befd3Caroline Tice { 8384a348081030cdd2af758fddc869518357d9befd3Caroline Tice reader_sp->Notify (notification); 8394a348081030cdd2af758fddc869518357d9befd3Caroline Tice 8404a348081030cdd2af758fddc869518357d9befd3Caroline Tice // Flush out any input readers that are done. 8414a348081030cdd2af758fddc869518357d9befd3Caroline Tice while (CheckIfTopInputReaderIsDone ()) 8424a348081030cdd2af758fddc869518357d9befd3Caroline Tice /* Do nothing. */; 8434a348081030cdd2af758fddc869518357d9befd3Caroline Tice } 8444a348081030cdd2af758fddc869518357d9befd3Caroline Tice} 8454a348081030cdd2af758fddc869518357d9befd3Caroline Tice 846b38df1e945846a5d956974ec157902a6ad748868Caroline Ticebool 847987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::InputReaderIsTopReader (const InputReaderSP& reader_sp) 848b38df1e945846a5d956974ec157902a6ad748868Caroline Tice{ 849892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader()); 850b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 851892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice return (reader_sp.get() == top_reader_sp.get()); 852b38df1e945846a5d956974ec157902a6ad748868Caroline Tice} 853b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 854b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 8554a348081030cdd2af758fddc869518357d9befd3Caroline Ticevoid 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::WriteToDefaultReader (const char *bytes, size_t bytes_len) 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes && bytes_len) 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.append (bytes, bytes_len); 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_reader_data.empty()) 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 864d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice while (!m_input_reader_stack.IsEmpty() && !m_input_reader_data.empty()) 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the input reader from the top of the stack 8677f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87153d68e749f0715691a95f23e9490d97e484b15daGreg Clayton size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(), 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.size()); 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_handled) 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.erase (0, bytes_handled); 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No bytes were handled, we might not have reached our 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // granularity, just return and wait for more data 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8857f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Flush out any input readers that are done. 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (CheckIfTopInputReaderIsDone ()) 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /* Do nothing. */; 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PushInputReader (const InputReaderSP& reader_sp) 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 8967f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 8977f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Deactivate the old top reader 8987f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader ()); 8997f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 9007f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (top_reader_sp) 9017f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice top_reader_sp->Notify (eInputReaderDeactivate); 9027f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 903d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack.Push (reader_sp); 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderActivate); 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 909987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::PopInputReader (const InputReaderSP& pop_reader_sp) 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The reader on the stop of the stack is done, so let the next 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // read on the stack referesh its prompt and if there is one... 915d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9177f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 918d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get()) 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 922d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack.Pop (); 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDeactivate); 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDone); 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 927d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 929d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice reader_sp = m_input_reader_stack.Top(); 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp) 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderReactivate); 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::CheckIfTopInputReaderIsDone () 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 945d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9477f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 948d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp && reader_sp->IsDone()) 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PopInputReader (reader_sp); 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::ActivateInputReader (const InputReaderSP &reader_sp) 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9625892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton int input_fd = m_input_file.GetFile().GetDescriptor(); 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9645892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (input_fd >= 0) 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9665892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton Terminal tty(input_fd); 9670fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 9680fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetEcho(reader_sp->GetEcho()); 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9700fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton switch (reader_sp->GetGranularity()) 9710fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton { 9720fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityByte: 9730fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityWord: 9740fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetCanonical (false); 9750fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 9760fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 9770fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityLine: 9780fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityAll: 9790fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetCanonical (true); 9800fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 9810fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 9820fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton default: 9830fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98763094e0bb161580564954dee512955c1c79d3476Greg Clayton 988e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP 989e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncOutputStream () 990e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{ 991e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 992e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham CommandInterpreter::eBroadcastBitAsynchronousOutputData)); 993e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham} 994e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham 995e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP 996e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncErrorStream () 997e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{ 998e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 999e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham CommandInterpreter::eBroadcastBitAsynchronousErrorData)); 1000e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham} 1001e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham 100216376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granatauint32_t 100316376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico GranataDebugger::GetNumDebuggers() 100416376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata{ 1005f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 1006f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 1007f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1008f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return GetDebuggerList().size(); 1009f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1010f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return 0; 101116376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata} 101216376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 101316376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granatalldb::DebuggerSP 101416376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico GranataDebugger::GetDebuggerAtIndex (uint32_t index) 101516376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata{ 101616376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata DebuggerSP debugger_sp; 101716376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 1018f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 1019f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 1020f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1021f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 102216376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 1023f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (index < debugger_list.size()) 1024f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_sp = debugger_list[index]; 1025f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1026f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton 102716376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata return debugger_sp; 102816376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata} 102916376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 1030558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebuggerSP 1031558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebugger::FindDebuggerWithID (lldb::user_id_t id) 1032558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice{ 1033987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton DebuggerSP debugger_sp; 1034558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 1035f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 1036558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 1037f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1038f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 1039f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 1040f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 1041558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 1042f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if ((*pos).get()->GetID() == id) 1043f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 1044f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_sp = *pos; 1045f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 1046f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1047558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 1048558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 1049558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice return debugger_sp; 1050558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice} 10516e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 1052d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic void 1053d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonTestPromptFormats (StackFrame *frame) 1054d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 1055d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (frame == NULL) 1056d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return; 1057d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1058d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton StreamString s; 1059d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *prompt_format = 1060d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{addr = '${addr}'\n}" 1061d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.id = '${process.id}'\n}" 1062d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.name = '${process.name}'\n}" 1063d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.file.basename = '${process.file.basename}'\n}" 1064d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.file.fullpath = '${process.file.fullpath}'\n}" 1065d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.id = '${thread.id}'\n}" 1066d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.index = '${thread.index}'\n}" 1067d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.name = '${thread.name}'\n}" 1068d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.queue = '${thread.queue}'\n}" 1069d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.stop-reason = '${thread.stop-reason}'\n}" 1070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{target.arch = '${target.arch}'\n}" 1071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{module.file.basename = '${module.file.basename}'\n}" 1072d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{module.file.fullpath = '${module.file.fullpath}'\n}" 1073d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{file.basename = '${file.basename}'\n}" 1074d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{file.fullpath = '${file.fullpath}'\n}" 1075d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.index = '${frame.index}'\n}" 1076d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.pc = '${frame.pc}'\n}" 1077d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.sp = '${frame.sp}'\n}" 1078d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.fp = '${frame.fp}'\n}" 1079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.flags = '${frame.flags}'\n}" 1080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rdi = '${frame.reg.rdi}'\n}" 1081d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rip = '${frame.reg.rip}'\n}" 1082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rsp = '${frame.reg.rsp}'\n}" 1083d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rbp = '${frame.reg.rbp}'\n}" 1084d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rflags = '${frame.reg.rflags}'\n}" 1085d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.xmm0 = '${frame.reg.xmm0}'\n}" 1086d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.carp = '${frame.reg.carp}'\n}" 1087d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.id = '${function.id}'\n}" 1088d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.name = '${function.name}'\n}" 10892fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton "{function.name-with-args = '${function.name-with-args}'\n}" 1090d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.addr-offset = '${function.addr-offset}'\n}" 1091d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.line-offset = '${function.line-offset}'\n}" 1092d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.pc-offset = '${function.pc-offset}'\n}" 1093d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.file.basename = '${line.file.basename}'\n}" 1094d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.file.fullpath = '${line.file.fullpath}'\n}" 1095d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.number = '${line.number}'\n}" 1096d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.start-addr = '${line.start-addr}'\n}" 1097d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.end-addr = '${line.end-addr}'\n}" 1098d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton; 1099d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1100d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextEverything)); 1101d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ExecutionContext exe_ctx; 1102a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton frame->CalculateExecutionContext(exe_ctx); 1103d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *end = NULL; 1104d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (Debugger::FormatPrompt (prompt_format, &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, &end)) 1105d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1106d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf("%s\n", s.GetData()); 1107d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1108d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 1109d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1110d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf ("error: at '%s'\n", end); 1111d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf ("what we got: %s\n", s.GetData()); 1112d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1113d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 1114d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 11159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool 11162c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanFormatDescriptor (const char* var_name_begin, 11172c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_end, 11182c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** var_name_final, 11192c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** percent_position, 1120987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Format* custom_format, 11212c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata ValueObject::ValueObjectRepresentationStyle* val_obj_display) 11229762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1123de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 11249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *percent_position = ::strchr(var_name_begin,'%'); 1125107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!*percent_position || *percent_position > var_name_end) 1126de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1127de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11287b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanFormatDescriptor] no format descriptor in string, skipping"); 11299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final = var_name_end; 1130de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 11319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 11329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 11339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final = *percent_position; 11349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char* format_name = new char[var_name_end-*var_name_final]; format_name[var_name_end-*var_name_final-1] = '\0'; 11359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata memcpy(format_name, *var_name_final+1, var_name_end-*var_name_final-1); 1136de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11377b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] parsing %s as a format descriptor", format_name); 11389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if ( !FormatManager::GetFormatFromCString(format_name, 11399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata true, 11409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *custom_format) ) 11419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1142de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11437b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] %s is an unknown format", format_name); 11449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // if this is an @ sign, print ObjC description 1145107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*format_name == '@') 1146cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleLanguageSpecific; 11479762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // if this is a V, print the value using the default format 1148de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'V') 1149cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1150e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // if this is an L, print the location of the value 1151de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'L') 1152cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleLocation; 1153e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata // if this is an S, print the summary after all 1154de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (*format_name == 'S') 1155cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleSummary; 11564e5397c1127d698c61df295f30909e573a1c9876Enrico Granata else if (*format_name == '#') 1157cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleChildrenCount; 11586f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata else if (*format_name == 'T') 1159cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleType; 1160de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (log) 11617b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] %s is an error, leaving the previous value alone", format_name); 11629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 11639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // a good custom format tells us to print the value using it 11649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 1165de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1166de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11677b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] will display value for this VO"); 1168cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1169de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 11709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata delete format_name; 11719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1172de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 11737b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("ScanFormatDescriptor] final format description outcome: custom_format = %d, val_obj_display = %d", 1174de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata *custom_format, 1175de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata *val_obj_display); 11769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 11779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 11789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 11799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool 11802c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanBracketedRange (const char* var_name_begin, 11812c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_end, 11822c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_final, 11832c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** open_bracket_position, 11842c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** separator_position, 11852c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** close_bracket_position, 11862c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** var_name_final_if_array_range, 11872c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata int64_t* index_lower, 11882c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata int64_t* index_higher) 11899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1190de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 11919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *open_bracket_position = ::strchr(var_name_begin,'['); 1192107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*open_bracket_position && *open_bracket_position < var_name_final) 11939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 11949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *separator_position = ::strchr(*open_bracket_position,'-'); // might be NULL if this is a simple var[N] bitfield 11959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *close_bracket_position = ::strchr(*open_bracket_position,']'); 11969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // as usual, we assume that [] will come before % 11979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata //printf("trying to expand a []\n"); 11989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final_if_array_range = *open_bracket_position; 1199107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*close_bracket_position - *open_bracket_position == 1) 12009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1201de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12027b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] '[]' detected.. going from 0 to end of data"); 12039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = 0; 12049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 12059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else if (*separator_position == NULL || *separator_position > var_name_end) 12069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 12079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char *end = NULL; 12089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 12099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = *index_lower; 1210de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12115f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("[ScanBracketedRange] [%" PRId64 "] detected, high index is same", *index_lower); 12129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1213107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (*close_bracket_position && *close_bracket_position < var_name_end) 12149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 12159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char *end = NULL; 12169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 12179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = ::strtoul (*separator_position+1, &end, 0); 1218de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12195f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("[ScanBracketedRange] [%" PRId64 "-%" PRId64 "] detected", *index_lower, *index_higher); 12209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 12219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 1222de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1223de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12247b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] expression is erroneous, cannot extract indices out of it"); 12259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return false; 1226de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 12279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (*index_lower > *index_higher && *index_higher > 0) 12289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1229de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12307b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] swapping indices"); 12319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata int temp = *index_lower; 12329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = *index_higher; 12339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = temp; 12349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 12359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1236de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (log) 12377b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] no bracketed range, skipping entirely"); 12389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 12399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 12409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 12419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic ValueObjectSP 12422c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataExpandIndexedExpression (ValueObject* valobj, 12432c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata uint32_t index, 12442c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata StackFrame* frame, 12452c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata bool deref_pointer) 12469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1247de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 1248ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* ptr_deref_format = "[%d]"; 1249ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata std::auto_ptr<char> ptr_deref_buffer(new char[10]); 1250ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ::sprintf(ptr_deref_buffer.get(), ptr_deref_format, index); 1251de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12527b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ExpandIndexedExpression] name to deref: %s",ptr_deref_buffer.get()); 1253ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* first_unparsed; 1254ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::GetValueForExpressionPathOptions options; 1255ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathEndResultType final_value_type; 1256ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop; 1257cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathAftermath what_next = (deref_pointer ? ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); 1258f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObjectSP item = valobj->GetValueForExpressionPath (ptr_deref_buffer.get(), 1259ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &first_unparsed, 1260ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &reason_to_stop, 1261ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &final_value_type, 1262ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1263ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &what_next); 1264ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!item) 1265ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1266de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12677b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ExpandIndexedExpression] ERROR: unparsed portion = %s, why stopping = %d," 1268de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1269ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 12709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1271ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1272ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1273de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12747b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ExpandIndexedExpression] ALL RIGHT: unparsed portion = %s, why stopping = %d," 1275de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1276ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1277ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 12789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return item; 12799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 12809762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1281d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonbool 1282d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonDebugger::FormatPrompt 1283d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton( 1284d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *format, 1285d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const SymbolContext *sc, 1286d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const ExecutionContext *exe_ctx, 1287d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const Address *addr, 1288d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Stream &s, 12891391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char **end, 1290f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObject* valobj 1291d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton) 1292d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 1293f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObject* realvalobj = NULL; // makes it super-easy to parse pointers 1294d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool success = true; 1295d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *p; 1296de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 1297d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton for (p = format; *p != '\0'; ++p) 1298d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1299f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (realvalobj) 13001391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1301f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata valobj = realvalobj; 1302f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata realvalobj = NULL; 13031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 1304d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton size_t non_special_chars = ::strcspn (p, "${}\\"); 1305d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (non_special_chars > 0) 1306d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1307d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (success) 1308d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Write (p, non_special_chars); 1309d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton p += non_special_chars; 1310d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1311d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1312d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p == '\0') 1313d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1314d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1315d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1316d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '{') 1317d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1318d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Start a new scope that must have everything it needs if it is to 1319d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // to make it into the final output stream "s". If you want to make 1320d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // a format that only prints out the function or symbol name if there 1321d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // is one in the symbol context you can use: 1322d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // "{function =${function.name}}" 1323d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // The first '{' starts a new scope that end with the matching '}' at 1324d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // the end of the string. The contents "function =${function.name}" 1325d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // will then be evaluated and only be output if there is a function 1326d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // or symbol with a valid name. 1327d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton StreamString sub_strm; 1328d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1329d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; // Skip the '{' 1330d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1331f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (FormatPrompt (p, sc, exe_ctx, addr, sub_strm, &p, valobj)) 1332d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1333d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // The stream had all it needed 1334d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Write(sub_strm.GetData(), sub_strm.GetSize()); 1335d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1336d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p != '}') 1337d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1338d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton success = false; 1339d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1340d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1341d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1342d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '}') 1343d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1344d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // End of a enclosing scope 1345d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1346d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1347d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '$') 1348d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1349d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We have a prompt variable to print 1350d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; 1351d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p == '{') 1352d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1353d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; 1354d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *var_name_begin = p; 1355d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *var_name_end = ::strchr (p, '}'); 1356d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1357d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_name_end && var_name_begin < var_name_end) 1358d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1359d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // if we have already failed to parse, skip this variable 1360d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (success) 1361d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1362d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *cstr = NULL; 1363d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Address format_addr; 1364d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool calculate_format_addr_function_offset = false; 1365d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Set reg_kind and reg_num to invalid values 1366d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton RegisterKind reg_kind = kNumRegisterKinds; 1367d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton uint32_t reg_num = LLDB_INVALID_REGNUM; 1368d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton FileSpec format_file_spec; 1369b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info = NULL; 1370d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton RegisterContext *reg_ctx = NULL; 13719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata bool do_deref_pointer = false; 1372cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 1373cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathEndResultType final_value_type = ValueObject::eExpressionPathEndResultTypePlain; 1374ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1375d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Each variable must set success to true below... 1376d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool var_success = false; 1377d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton switch (var_name_begin[0]) 1378d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 13791391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata case '*': 13801391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata case 'v': 1381979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata case 's': 13821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1383f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (!valobj) 1384979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 1385979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1386afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 13877b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1388afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1389979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // check for *var and *svar 1390979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin == '*') 1391979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1392979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata do_deref_pointer = true; 1393979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata var_name_begin++; 1394979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1395afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1396afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 13977b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1398afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1399979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin == 's') 1400979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1401dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata if (!valobj->IsSynthetic()) 1402dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata valobj = valobj->GetSyntheticValue().get(); 1403cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!valobj) 1404cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1405979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata var_name_begin++; 1406979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1407979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1408afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 14097b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1410afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1411979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // should be a 'v' by now 1412979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin != 'v') 1413979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 1414979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1415afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 14167b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1417afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1418ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathAftermath what_next = (do_deref_pointer ? 1419cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); 1420ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::GetValueForExpressionPathOptions options; 14219c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata options.DontCheckDotVsArrowSyntax().DoAllowBitfieldSyntax().DoAllowFragileIVar().DoAllowSyntheticChildren(); 1422cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ValueObjectRepresentationStyle val_obj_display = ValueObject::eValueObjectRepresentationStyleSummary; 1423107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ValueObject* target = NULL; 1424987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Format custom_format = eFormatInvalid; 1425107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* var_name_final = NULL; 1426107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* var_name_final_if_array_range = NULL; 1427107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* close_bracket_position = NULL; 1428107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton int64_t index_lower = -1; 1429107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton int64_t index_higher = -1; 1430107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton bool is_array_range = false; 1431ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* first_unparsed; 14321c61743af946076e988d88baf725382e99d905deEnrico Granata bool was_plain_var = false; 14331c61743af946076e988d88baf725382e99d905deEnrico Granata bool was_var_format = false; 143407baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata bool was_var_indexed = false; 1435ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1436f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (!valobj) break; 1437f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata // simplest case ${var}, just print valobj's value 1438107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (::strncmp (var_name_begin, "var}", strlen("var}")) == 0) 1439107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 14401c61743af946076e988d88baf725382e99d905deEnrico Granata was_plain_var = true; 1441f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj; 1442cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1443107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1444107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (::strncmp(var_name_begin,"var%",strlen("var%")) == 0) 1445107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 14461c61743af946076e988d88baf725382e99d905deEnrico Granata was_var_format = true; 1447107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this is a variable with some custom format applied to it 1448107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* percent_position; 1449f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj; 1450cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1451107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanFormatDescriptor (var_name_begin, 1452107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1453107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final, 1454107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &percent_position, 1455107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &custom_format, 1456107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &val_obj_display); 1457107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1458107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this is ${var.something} or multiple .something nested 1459107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (::strncmp (var_name_begin, "var", strlen("var")) == 0) 14601391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 146107baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (::strncmp(var_name_begin, "var[", strlen("var[")) == 0) 146207baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata was_var_indexed = true; 1463107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* percent_position; 1464107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanFormatDescriptor (var_name_begin, 1465107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1466107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final, 1467107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &percent_position, 1468107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &custom_format, 1469107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &val_obj_display); 1470107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1471107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* open_bracket_position; 1472107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* separator_position; 1473107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanBracketedRange (var_name_begin, 1474107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1475107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_final, 1476107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &open_bracket_position, 1477107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &separator_position, 1478107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &close_bracket_position, 1479107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final_if_array_range, 1480107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &index_lower, 1481107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &index_higher); 1482107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1483107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton Error error; 1484ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1485ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata std::auto_ptr<char> expr_path(new char[var_name_final-var_name_begin-1]); 1486ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ::memset(expr_path.get(), 0, var_name_final-var_name_begin-1); 1487ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata memcpy(expr_path.get(), var_name_begin+3,var_name_final-var_name_begin-3); 1488ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1489de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 14907b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] symbol to expand: %s",expr_path.get()); 1491ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1492f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj->GetValueForExpressionPath(expr_path.get(), 1493ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &first_unparsed, 1494ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &reason_to_stop, 1495ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &final_value_type, 1496ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1497ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &what_next).get(); 1498ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1499ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!target) 1500107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1501de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 15027b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ERROR: unparsed portion = %s, why stopping = %d," 1503de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1504ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1505ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 15069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1507ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1508ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1509de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 15107b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ALL RIGHT: unparsed portion = %s, why stopping = %d," 1511de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1512ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1513ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1514107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1515107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 15169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata break; 1517ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1518cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata is_array_range = (final_value_type == ValueObject::eExpressionPathEndResultTypeBoundedRange || 1519cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata final_value_type == ValueObject::eExpressionPathEndResultTypeUnboundedRange); 1520ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1521cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata do_deref_pointer = (what_next == ValueObject::eExpressionPathAftermathDereference); 1522107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 152313cb5406e7f013ca7c15b370ec2fa72f9a911ab5Enrico Granata if (do_deref_pointer && !is_array_range) 15249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1525107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // I have not deref-ed yet, let's do it 1526107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this happens when we are not going through GetValueForVariableExpressionPath 1527107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // to get to the target ValueObject 1528107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton Error error; 1529107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton target = target->Dereference(error).get(); 15302c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata if (error.Fail()) 15312c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata { 15322c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata if (log) 15337b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ERROR: %s\n", error.AsCString("unknown")); \ 15342c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata break; 15352c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata } 1536107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton do_deref_pointer = false; 15379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 153886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 153907baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // <rdar://problem/11338654> 154007baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // we do not want to use the summary for a bitfield of type T:n 154107baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // if we were originally dealing with just a T - that would get 154207baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // us into an endless recursion 154307baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (target->IsBitfield() && was_var_indexed) 154407baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata { 154507baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // TODO: check for a (T:n)-specific summary - we should still obey that 154607baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata StreamString bitfield_name; 154707baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata bitfield_name.Printf("%s:%d", target->GetTypeName().AsCString(), target->GetBitfieldBitSize()); 154807baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata lldb::TypeNameSpecifierImplSP type_sp(new TypeNameSpecifierImpl(bitfield_name.GetData(),false)); 154907baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (!DataVisualization::GetSummaryForType(type_sp)) 155007baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 155107baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata } 155207baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata 15531c61743af946076e988d88baf725382e99d905deEnrico Granata // TODO use flags for these 1554b912457e1eb6f97d3ee3adc74d1e0f6393e35d3cGreg Clayton bool is_array = ClangASTContext::IsArrayType(target->GetClangType(), NULL, NULL, NULL); 155586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata bool is_pointer = ClangASTContext::IsPointerType(target->GetClangType()); 15561c61743af946076e988d88baf725382e99d905deEnrico Granata bool is_aggregate = ClangASTContext::IsAggregateType(target->GetClangType()); 155786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1558cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((is_array || is_pointer) && (!is_array_range) && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) // this should be wrong, but there are some exceptions 155986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 15601c61743af946076e988d88baf725382e99d905deEnrico Granata StreamString str_temp; 1561de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 15627b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] I am into array || pointer && !range"); 15636f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 1564cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (target->HasSpecialPrintableRepresentation(val_obj_display, 1565cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata custom_format)) 15661c61743af946076e988d88baf725382e99d905deEnrico Granata { 15676f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // try to use the special cases 15686f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = target->DumpPrintableRepresentation(str_temp, 15696f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata val_obj_display, 15706f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata custom_format); 15716f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (log) 15727b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] special cases did%s match", var_success ? "" : "n't"); 15736f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 15746f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // should not happen 15756f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (!var_success) 15766f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << "<invalid usage of pointer value as object>"; 15776f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata else 15786f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << str_temp.GetData(); 15791c61743af946076e988d88baf725382e99d905deEnrico Granata var_success = true; 15806f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata break; 15811c61743af946076e988d88baf725382e99d905deEnrico Granata } 15821c61743af946076e988d88baf725382e99d905deEnrico Granata else 15836f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 1584ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata if (was_plain_var) // if ${var} 15856f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 15866f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 15876f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 1588ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata else if (is_pointer) // if pointer, value is the address stored 1589ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata { 15904a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton target->DumpPrintableRepresentation (s, 15914a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton val_obj_display, 15924a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton custom_format, 15934a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton ValueObject::ePrintableRepresentationSpecialCasesDisable); 1594ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata } 15956f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata else 15966f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 15976f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << "<invalid usage of pointer value as object>"; 15986f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 15996f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = true; 16006f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata break; 16016f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 16026f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 16036f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 16046f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // if directly trying to print ${var}, and this is an aggregate, display a nice 16056f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // type @ location message 16066f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (is_aggregate && was_plain_var) 16076f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 16086f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 16096f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = true; 16101c61743af946076e988d88baf725382e99d905deEnrico Granata break; 16111c61743af946076e988d88baf725382e99d905deEnrico Granata } 16121c61743af946076e988d88baf725382e99d905deEnrico Granata 16136f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // if directly trying to print ${var%V}, and this is an aggregate, do not let the user do it 1614cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_aggregate && ((was_var_format && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue))) 16151c61743af946076e988d88baf725382e99d905deEnrico Granata { 16161c61743af946076e988d88baf725382e99d905deEnrico Granata s << "<invalid use of aggregate type>"; 16171c61743af946076e988d88baf725382e99d905deEnrico Granata var_success = true; 161886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata break; 161986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 1620107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1621107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!is_array_range) 1622de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1623de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16247b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] dumping ordinary printable output"); 1625107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success = target->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1626de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 1627107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 1628de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1629de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16307b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] checking if I can handle as array"); 1631107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!is_array && !is_pointer) 1632107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton break; 1633de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16347b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] handle as array"); 1635ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* special_directions = NULL; 1636ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata StreamString special_directions_writer; 1637107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (close_bracket_position && (var_name_end-close_bracket_position > 1)) 1638107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1639ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString additional_data; 1640ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata additional_data.SetCStringWithLength(close_bracket_position+1, var_name_end-close_bracket_position-1); 1641ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata special_directions_writer.Printf("${%svar%s}", 1642ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata do_deref_pointer ? "*" : "", 1643ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata additional_data.GetCString()); 1644ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata special_directions = special_directions_writer.GetData(); 1645107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 16469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1647107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // let us display items index_lower thru index_higher of this array 1648107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar('['); 1649107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success = true; 1650107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1651107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (index_higher < 0) 1652f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata index_higher = valobj->GetNumChildren() - 1; 1653107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1654b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton uint32_t max_num_children = target->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); 1655018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 1656107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton for (;index_lower<=index_higher;index_lower++) 1657107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1658567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObject* item = ExpandIndexedExpression (target, 1659567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton index_lower, 1660567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx->GetFramePtr(), 1661567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton false).get(); 1662107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1663ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!item) 1664ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1665de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16665f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("[Debugger::FormatPrompt] ERROR in getting child item at index %" PRId64, index_lower); 1667ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1668ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1669ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1670de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16717b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] special_directions for child item: %s",special_directions); 1672ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1673ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1674107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!special_directions) 1675107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success &= item->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1676107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 1677107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success &= FormatPrompt(special_directions, sc, exe_ctx, addr, s, NULL, item); 1678107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1679018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata if (--max_num_children == 0) 1680018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata { 1681018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata s.PutCString(", ..."); 1682018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata break; 1683018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata } 1684018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 1685107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (index_lower < index_higher) 1686107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar(','); 1687107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1688107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar(']'); 16899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 16901391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 16919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata break; 1692d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'a': 1693d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "addr}", strlen("addr}")) == 0) 1694d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1695d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (addr && addr->IsValid()) 1696d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1697d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 1698d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = *addr; 1699d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1700d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1701f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "ansi.", strlen("ansi.")) == 0) 1702f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1703f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = true; 1704f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("ansi."); // Skip the "ansi." 1705f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "fg.", strlen("fg.")) == 0) 1706f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1707f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("fg."); // Skip the "fg." 1708f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0) 1709f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1710f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1711f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1712f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_black, 1713f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1714f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1715f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0) 1716f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1717f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1718f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1719f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_red, 1720f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1721f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1722f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0) 1723f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1724f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1725f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1726f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_green, 1727f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1728f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1729f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0) 1730f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1731f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1732f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1733f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_yellow, 1734f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1735f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1736f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0) 1737f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1738f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1739f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1740f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_blue, 1741f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1742f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1743f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0) 1744f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1745f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1746f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1747f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_purple, 1748f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1749f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1750f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0) 1751f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1752f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1753f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1754f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_cyan, 1755f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1756f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1757f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0) 1758f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1759f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1760f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1761f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_fg_white, 1762f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1763f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1764f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1765f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1766f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1767f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1768f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1769f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "bg.", strlen("bg.")) == 0) 1770f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1771f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_name_begin += strlen("bg."); // Skip the "bg." 1772f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton if (::strncmp (var_name_begin, "black}", strlen("black}")) == 0) 1773f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1774f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1775f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1776f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_black, 1777f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1778f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1779f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "red}", strlen("red}")) == 0) 1780f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1781f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1782f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1783f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_red, 1784f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1785f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1786f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "green}", strlen("green}")) == 0) 1787f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1788f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1789f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1790f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_green, 1791f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1792f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1793f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "yellow}", strlen("yellow}")) == 0) 1794f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1795f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1796f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1797f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_yellow, 1798f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1799f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1800f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "blue}", strlen("blue}")) == 0) 1801f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1802f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1803f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1804f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_blue, 1805f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1806f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1807f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "purple}", strlen("purple}")) == 0) 1808f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1809f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1810f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1811f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_purple, 1812f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1813f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1814f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "cyan}", strlen("cyan}")) == 0) 1815f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1816f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1817f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1818f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_cyan, 1819f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1820f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1821f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "white}", strlen("white}")) == 0) 1822f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1823f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1824f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1825f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_bg_white, 1826f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1827f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1828f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1829f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1830f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1831f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1832f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1833f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "normal}", strlen ("normal}")) == 0) 1834f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1835f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1836f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1837f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_normal, 1838f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1839f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1840f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "bold}", strlen("bold}")) == 0) 1841f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1842f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1843f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1844f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_bold, 1845f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1846f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1847f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "faint}", strlen("faint}")) == 0) 1848f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1849f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1850f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1851f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_faint, 1852f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1853f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1854f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "italic}", strlen("italic}")) == 0) 1855f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1856f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1857f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1858f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_italic, 1859f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1860f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1861f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "underline}", strlen("underline}")) == 0) 1862f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1863f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1864f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1865f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_underline, 1866f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1867f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1868f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "slow-blink}", strlen("slow-blink}")) == 0) 1869f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1870f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1871f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1872f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_slow_blink, 1873f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1874f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1875f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "fast-blink}", strlen("fast-blink}")) == 0) 1876f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1877f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1878f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1879f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_fast_blink, 1880f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1881f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1882f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "negative}", strlen("negative}")) == 0) 1883f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1884f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1885f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1886f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_negative, 1887f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1888f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1889f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "conceal}", strlen("conceal}")) == 0) 1890f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1891f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1892f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1893f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_conceal, 1894f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1895f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton 1896f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1897f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else if (::strncmp (var_name_begin, "crossed-out}", strlen("crossed-out}")) == 0) 1898f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1899f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton s.Printf ("%s%s%s", 1900f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_start, 1901f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_ctrl_crossed_out, 1902f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton lldb_utility::ansi::k_escape_end); 1903f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1904f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton else 1905f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton { 1906f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton var_success = false; 1907f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1908f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton } 1909d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1910d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1911d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'p': 1912d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "process.", strlen("process.")) == 0) 1913d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1914567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1915d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1916567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 1917567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 1918d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1919567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("process."); 1920567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 1921d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 19225f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("%" PRIu64, process->GetID()); 1923567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1924567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1925567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if ((::strncmp (var_name_begin, "name}", strlen("name}")) == 0) || 1926567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton (::strncmp (var_name_begin, "file.basename}", strlen("file.basename}")) == 0) || 1927567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton (::strncmp (var_name_begin, "file.fullpath}", strlen("file.fullpath}")) == 0)) 1928567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1929567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Module *exe_module = process->GetTarget().GetExecutableModulePointer(); 1930567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_module) 1931d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f') 1933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1934567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename(); 1935567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = format_file_spec; 1936567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1937567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else 1938567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1939567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_file_spec = exe_module->GetFileSpec(); 1940567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = format_file_spec; 1941567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1942d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1943d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1944d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1945567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1946d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1947d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1948d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1949d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 't': 1950d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "thread.", strlen("thread.")) == 0) 1951d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1952567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1953d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1954567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Thread *thread = exe_ctx->GetThreadPtr(); 1955567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread) 1956d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1957567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("thread."); 1958567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 1959d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 19605f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("0x%4.4" PRIx64, thread->GetID()); 1961567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1962567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1963567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) 1964567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1965567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.Printf("%u", thread->GetIndexID()); 1966567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1967567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1968567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) 1969567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1970567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = thread->GetName(); 1971567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = cstr && cstr[0]; 1972567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_success) 1973d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutCString(cstr); 1974567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1975567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "queue}", strlen("queue}")) == 0) 1976567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1977567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = thread->GetQueueName(); 1978567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = cstr && cstr[0]; 1979567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_success) 1980567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.PutCString(cstr); 1981567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1982567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "stop-reason}", strlen("stop-reason}")) == 0) 1983567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1984567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo (); 19856bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham if (stop_info_sp && stop_info_sp->IsValid()) 1986567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1987567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = stop_info_sp->GetDescription(); 1988567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (cstr && cstr[0]) 1989567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1990567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.PutCString(cstr); 1991567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1992567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1993d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1994d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 19951586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham else if (::strncmp (var_name_begin, "return-value}", strlen("return-value}")) == 0) 19961586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 19971586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham StopInfoSP stop_info_sp = thread->GetStopInfo (); 19986bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham if (stop_info_sp && stop_info_sp->IsValid()) 19991586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 20001586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham ValueObjectSP return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp); 20011586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham if (return_valobj_sp) 20021586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 2003016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham ValueObject::DumpValueObjectOptions dump_options; 2004016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham ValueObject::DumpValueObject (s, return_valobj_sp.get(), dump_options); 2005016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham var_success = true; 20061586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 20071586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 20081586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 2009d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2010d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2011d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2012d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "target.", strlen("target.")) == 0) 2013d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 201473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // TODO: hookup properties 201573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (!target_properties_sp) 201673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 201773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 201873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (target) 201973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// target_properties_sp = target->GetProperties(); 202073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 202173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 202273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (target_properties_sp) 202373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 202473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// var_name_begin += ::strlen ("target."); 202573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// const char *end_property = strchr(var_name_begin, '}'); 202673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (end_property) 202773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 202873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// ConstString property_name(var_name_begin, end_property - var_name_begin); 202973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// std::string property_value (target_properties_sp->GetPropertyValue(property_name)); 203073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (!property_value.empty()) 203173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 203273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// s.PutCString (property_value.c_str()); 203373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// var_success = true; 203473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 203573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 203673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 2037a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2038a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (target) 2039d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2040d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("target."); 2041d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "arch}", strlen("arch}")) == 0) 2042d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2043d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ArchSpec arch (target->GetArchitecture ()); 2044d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (arch.IsValid()) 2045d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2046940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton s.PutCString (arch.GetArchitectureName()); 2047d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2048d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2049d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 205073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 2051d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2052d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2053d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2054d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2055d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'm': 2056d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "module.", strlen("module.")) == 0) 2057d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2058a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc && sc->module_sp.get()) 2059d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2060a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Module *module = sc->module_sp.get(); 2061d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("module."); 2062d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2063d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 2064d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2065d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (module->GetFileSpec()) 2066d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2067d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2068d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2069d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 2070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = module->GetFileSpec().GetFilename(); 2072d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2073d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2074d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 2075d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2076d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = module->GetFileSpec(); 2077d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2078d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2081d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2083d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2084d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2085d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2086d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'f': 2087d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 2088d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2089d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && sc->comp_unit != NULL) 2090d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2091d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2092d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2093d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 2094d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2095d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = sc->comp_unit->GetFilename(); 2096d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2097d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2098d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 2099d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2100d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = *sc->comp_unit; 2101d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2102d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2103d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2104d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2105d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "frame.", strlen("frame.")) == 0) 2106d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2107567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 2108d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2109567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2110567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame) 2111d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2112567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("frame."); 2113567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) 2114567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2115567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.Printf("%u", frame->GetFrameIndex()); 2116567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2117567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2118567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "pc}", strlen("pc}")) == 0) 2119567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2120567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2121567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_PC; 2122567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2123567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2124567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "sp}", strlen("sp}")) == 0) 2125567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2126567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2127567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_SP; 2128567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2129567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2130567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "fp}", strlen("fp}")) == 0) 2131567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2132567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2133567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FP; 2134567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2135567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2136567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "flags}", strlen("flags}")) == 0) 2137567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2138567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2139567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FLAGS; 2140567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2141567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2142567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (::strncmp (var_name_begin, "reg.", strlen ("reg.")) == 0) 2143d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2144567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 2145567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (reg_ctx) 2146d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2147567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("reg."); 2148567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_name_begin < var_name_end) 2149567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2150567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton std::string reg_name (var_name_begin, var_name_end); 2151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str()); 2152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (reg_info) 2153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2155d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2156d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2157d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2158d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2159d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2160d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "function.", strlen("function.")) == 0) 2161d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2162d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && (sc->function != NULL || sc->symbol != NULL)) 2163d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2164d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("function."); 2165d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) 2166d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2167d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc->function) 21685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("function{0x%8.8" PRIx64 "}", sc->function->GetID()); 2169d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2170d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf("symbol[%u]", sc->symbol->GetID()); 2171d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2172d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2173d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2174d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) 2175d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2176d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc->function) 2177d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton cstr = sc->function->GetName().AsCString (NULL); 2178d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (sc->symbol) 2179d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 2180d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (cstr) 2181d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2182d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutCString(cstr); 2183b7af177d19c625088864845c89c16465c424df5aGreg Clayton 2184b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (sc->block) 2185b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2186b7af177d19c625088864845c89c16465c424df5aGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2187b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_block) 2188b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2189b7af177d19c625088864845c89c16465c424df5aGreg Clayton const InlineFunctionInfo *inline_info = sc->block->GetInlinedFunctionInfo(); 2190b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_info) 2191b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2192b7af177d19c625088864845c89c16465c424df5aGreg Clayton s.PutCString(" [inlined] "); 2193b7af177d19c625088864845c89c16465c424df5aGreg Clayton inline_info->GetName().Dump(&s); 2194b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2195b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2196b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2197d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2198d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2199d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2200f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else if (::strncmp (var_name_begin, "name-with-args}", strlen("name-with-args}")) == 0) 2201f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2202f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton // Print the function name with arguments in it 2203f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2204f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (sc->function) 2205f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2206f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton var_success = true; 2207f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton ExecutionContextScope *exe_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL; 2208f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = sc->function->GetName().AsCString (NULL); 2209f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (cstr) 2210f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2211f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const InlineFunctionInfo *inline_info = NULL; 2212f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableListSP variable_list_sp; 2213f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton bool get_function_vars = true; 2214f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (sc->block) 2215f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2216f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2217f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2218f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_block) 2219f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2220f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton get_function_vars = false; 2221f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton inline_info = sc->block->GetInlinedFunctionInfo(); 2222f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_info) 2223f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton variable_list_sp = inline_block->GetBlockVariableList (true); 2224f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2225f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2226f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2227f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (get_function_vars) 2228f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2229f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton variable_list_sp = sc->function->GetBlock(true).GetBlockVariableList (true); 2230f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2231f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2232f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_info) 2233f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2234f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (cstr); 2235f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (" [inlined] "); 2236f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = inline_info->GetName().GetCString(); 2237f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2238f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2239f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableList args; 2240f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (variable_list_sp) 2241f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2242f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const size_t num_variables = variable_list_sp->GetSize(); 2243f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton for (size_t var_idx = 0; var_idx < num_variables; ++var_idx) 2244f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2245f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableSP var_sp (variable_list_sp->GetVariableAtIndex(var_idx)); 2246f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (var_sp->GetScope() == eValueTypeVariableArgument) 2247f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton args.AddVariable (var_sp); 2248f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2249f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2250f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2251f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (args.GetSize() > 0) 2252f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2253f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *open_paren = strchr (cstr, '('); 2254f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *close_paren = NULL; 2255f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (open_paren) 2256f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton close_paren = strchr (open_paren, ')'); 2257f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2258f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (open_paren) 2259f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.Write(cstr, open_paren - cstr + 1); 2260f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2261f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2262f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (cstr); 2263f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutChar ('('); 2264f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2265c43e7b88339a0267220c56b7207955d035fea4cbGreg Clayton const size_t num_args = args.GetSize(); 2266f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton for (size_t arg_idx = 0; arg_idx < num_args; ++arg_idx) 2267f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2268f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableSP var_sp (args.GetVariableAtIndex (arg_idx)); 2269f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton ValueObjectSP var_value_sp (ValueObjectVariable::Create (exe_scope, var_sp)); 2270f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *var_name = var_value_sp->GetName().GetCString(); 2271f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *var_value = var_value_sp->GetValueAsCString(); 22728e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton if (arg_idx > 0) 22738e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton s.PutCString (", "); 2274f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (var_value_sp->GetError().Success()) 2275f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.Printf ("%s=%s", var_name, var_value); 22768e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton else 22778e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton s.Printf ("%s=<unavailable>", var_name); 2278f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2279f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2280f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (close_paren) 2281f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (close_paren); 2282f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2283f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutChar(')'); 2284f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2285f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2286f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2287f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2288f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString(cstr); 2289f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2290f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2291f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2292f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else if (sc->symbol) 2293f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2294f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 2295f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (cstr) 2296f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2297f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString(cstr); 2298f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton var_success = true; 2299f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2300f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2301f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2302d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "addr-offset}", strlen("addr-offset}")) == 0) 2303d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2304d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = addr != NULL; 2305d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2306d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2307d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = *addr; 2308d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2309d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2310d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2311d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "line-offset}", strlen("line-offset}")) == 0) 2312d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2313d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = sc->line_entry.range.GetBaseAddress().IsValid(); 2314d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2315d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2316d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 2317d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2318d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2319d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2320d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "pc-offset}", strlen("pc-offset}")) == 0) 2321d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2322567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2323567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = frame != NULL; 2324d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2325d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2326567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_addr = frame->GetFrameCodeAddress(); 2327d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2328d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2329d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2330d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2331d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2332d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2333d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2334d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'l': 2335d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "line.", strlen("line.")) == 0) 2336d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2337d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && sc->line_entry.IsValid()) 2338d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2339d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("line."); 2340d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "file.", strlen("file.")) == 0) 2341d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2342d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2343d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2344d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (::strncmp (var_name_begin, "basename}", strlen("basename}")) == 0) 2345d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2346d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = sc->line_entry.file.GetFilename(); 2347d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2348d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2349d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "fullpath}", strlen("fullpath}")) == 0) 2350d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2351d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = sc->line_entry.file; 2352d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2353d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2354d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2355d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (::strncmp (var_name_begin, "number}", strlen("number}")) == 0) 2356d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2357d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2358d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf("%u", sc->line_entry.line); 2359d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2360d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if ((::strncmp (var_name_begin, "start-addr}", strlen("start-addr}")) == 0) || 2361d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton (::strncmp (var_name_begin, "end-addr}", strlen("end-addr}")) == 0)) 2362d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2363d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = sc && sc->line_entry.range.GetBaseAddress().IsValid(); 2364d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2365d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2366d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 2367d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_name_begin[0] == 'e') 2368d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr.Slide (sc->line_entry.range.GetByteSize()); 2369d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2370d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2371d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2372d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2373d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2374d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2375d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2376d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2377d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2378d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // If format addr is valid, then we need to print an address 2379d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_num != LLDB_INVALID_REGNUM) 2380d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2381567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2382d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We have a register value to display... 2383d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_num == LLDB_REGNUM_GENERIC_PC && reg_kind == eRegisterKindGeneric) 2384d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2385567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_addr = frame->GetFrameCodeAddress(); 2386d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2387d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2388d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2389d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_ctx == NULL) 2390567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 2391d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2392d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_ctx) 2393d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2394d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_kind != kNumRegisterKinds) 2395d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(reg_kind, reg_num); 2396d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_num); 2397d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = reg_info != NULL; 2398d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2399d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2400d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2401d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2402d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_info != NULL) 2403d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2404061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 2405061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton var_success = reg_ctx->ReadRegister (reg_info, reg_value); 2406061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (var_success) 2407d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2408997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton reg_value.Dump(&s, reg_info, false, false, eFormatDefault); 2409d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2410d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2411d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2412d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (format_file_spec) 2413d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2414d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s << format_file_spec; 2415d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2416d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2417d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // If format addr is valid, then we need to print an address 2418d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (format_addr.IsValid()) 2419d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2420a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = false; 2421a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2422d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (calculate_format_addr_function_offset) 2423d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2424d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Address func_addr; 2425d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2426a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc) 2427a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2428a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc->function) 2429b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2430a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton func_addr = sc->function->GetAddressRange().GetBaseAddress(); 2431b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (sc->block) 2432b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2433b7af177d19c625088864845c89c16465c424df5aGreg Clayton // Check to make sure we aren't in an inline 2434b7af177d19c625088864845c89c16465c424df5aGreg Clayton // function. If we are, use the inline block 2435b7af177d19c625088864845c89c16465c424df5aGreg Clayton // range that contains "format_addr" since 2436b7af177d19c625088864845c89c16465c424df5aGreg Clayton // blocks can be discontiguous. 2437b7af177d19c625088864845c89c16465c424df5aGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2438b7af177d19c625088864845c89c16465c424df5aGreg Clayton AddressRange inline_range; 2439b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_block && inline_block->GetRangeContainingAddress (format_addr, inline_range)) 2440b7af177d19c625088864845c89c16465c424df5aGreg Clayton func_addr = inline_range.GetBaseAddress(); 2441b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2442b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 24430c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton else if (sc->symbol && sc->symbol->ValueIsAddress()) 24440c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton func_addr = sc->symbol->GetAddress(); 2445a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2446a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2447a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (func_addr.IsValid()) 2448d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2449d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (func_addr.GetSection() == format_addr.GetSection()) 2450d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2451d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t func_file_addr = func_addr.GetFileAddress(); 2452d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t addr_file_addr = format_addr.GetFileAddress(); 2453d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (addr_file_addr > func_file_addr) 24545f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" + %" PRIu64, addr_file_addr - func_file_addr); 2455d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (addr_file_addr < func_file_addr) 24565f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" - %" PRIu64, func_file_addr - addr_file_addr); 2457a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2458d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2459d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2460a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2461a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2462a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (target) 2463a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2464a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton addr_t func_load_addr = func_addr.GetLoadAddress (target); 2465a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton addr_t addr_load_addr = format_addr.GetLoadAddress (target); 2466a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (addr_load_addr > func_load_addr) 24675f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" + %" PRIu64, addr_load_addr - func_load_addr); 2468a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else if (addr_load_addr < func_load_addr) 24695f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" - %" PRIu64, func_load_addr - addr_load_addr); 2470a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2471a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2472a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2473d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2474d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2475d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2476d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2477a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2478d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t vaddr = LLDB_INVALID_ADDRESS; 2479a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (exe_ctx && !target->GetSectionLoadList().IsEmpty()) 2480a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton vaddr = format_addr.GetLoadAddress (target); 2481d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (vaddr == LLDB_INVALID_ADDRESS) 2482d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton vaddr = format_addr.GetFileAddress (); 2483d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2484d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (vaddr != LLDB_INVALID_ADDRESS) 2485a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2486395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton int addr_width = target->GetArchitecture().GetAddressByteSize() * 2; 24877fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton if (addr_width == 0) 24887fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton addr_width = 16; 24895f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("0x%*.*" PRIx64, addr_width, addr_width, vaddr); 2490a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2491a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2492d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2493d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2494d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2495d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2496d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success == false) 2497d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton success = false; 2498d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2499d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton p = var_name_end; 2500d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2501d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2502d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2503d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2504d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2505d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2506d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We got a dollar sign with no '{' after it, it must just be a dollar sign 2507d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutChar(*p); 2508d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2509d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2510d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '\\') 2511d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2512d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; // skip the slash 2513d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton switch (*p) 2514d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2515d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'a': s.PutChar ('\a'); break; 2516d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'b': s.PutChar ('\b'); break; 2517d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'f': s.PutChar ('\f'); break; 2518d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'n': s.PutChar ('\n'); break; 2519d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'r': s.PutChar ('\r'); break; 2520d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 't': s.PutChar ('\t'); break; 2521d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'v': s.PutChar ('\v'); break; 2522d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '\'': s.PutChar ('\''); break; 2523d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '\\': s.PutChar ('\\'); break; 2524d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '0': 2525d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // 1 to 3 octal chars 2526d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2527a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Make a string that can hold onto the initial zero char, 2528a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // up to 3 octal digits, and a terminating NULL. 2529a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char oct_str[5] = { 0, 0, 0, 0, 0 }; 2530a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2531a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton int i; 2532a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton for (i=0; (p[i] >= '0' && p[i] <= '7') && i<4; ++i) 2533a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton oct_str[i] = p[i]; 2534a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2535a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // We don't want to consume the last octal character since 2536a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // the main for loop will do this for us, so we advance p by 2537a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // one less than i (even if i is zero) 2538a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton p += i - 1; 2539a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton unsigned long octal_value = ::strtoul (oct_str, NULL, 8); 2540a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (octal_value <= UINT8_MAX) 2541d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2542a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char octal_char = octal_value; 2543a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.Write (&octal_char, 1); 2544d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2545d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2546d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2547d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2548d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'x': 2549d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // hex number in the format 2550a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (isxdigit(p[1])) 2551d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2552a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton ++p; // Skip the 'x' 2553d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2554a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Make a string that can hold onto two hex chars plus a 2555a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // NULL terminator 2556a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char hex_str[3] = { 0,0,0 }; 2557a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton hex_str[0] = *p; 2558a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (isxdigit(p[1])) 2559d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2560a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton ++p; // Skip the first of the two hex chars 2561a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton hex_str[1] = *p; 2562d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2563a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2564a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton unsigned long hex_value = strtoul (hex_str, NULL, 16); 2565a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (hex_value <= UINT8_MAX) 2566a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.PutChar (hex_value); 2567a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2568a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else 2569a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2570a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.PutChar('x'); 2571d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2572d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2573d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2574d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton default: 2575a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Just desensitize any other character by just printing what 2576a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // came after the '\' 2577a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s << *p; 2578d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2579d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2580d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2581d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2582d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2583d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2584d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (end) 2585d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton *end = p; 2586d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return success; 2587d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 2588d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 25896c530f2201be4788dedf3d5970399220fbd50b11Jim Inghamvoid 25906c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton) 25916c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham{ 2592d8465214c43d29755822670ad21ced2506faae7aJim Ingham // For simplicity's sake, I am not going to deal with how to close down any 2593d8465214c43d29755822670ad21ced2506faae7aJim Ingham // open logging streams, I just redirect everything from here on out to the 2594d8465214c43d29755822670ad21ced2506faae7aJim Ingham // callback. 25956c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 25966c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham} 25976c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 25986c530f2201be4788dedf3d5970399220fbd50b11Jim Inghambool 25996c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::EnableLog (const char *channel, const char **categories, const char *log_file, uint32_t log_options, Stream &error_stream) 26006c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham{ 26016c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham Log::Callbacks log_callbacks; 26026c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26036c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham StreamSP log_stream_sp; 2604b386d82334b65fb984348f2027b1cb7714de993fSean Callanan if (m_log_callback_stream_sp) 26056c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26066c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp = m_log_callback_stream_sp; 26076c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham // For now when using the callback mode you always get thread & timestamp. 26086c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME; 26096c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26106c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else if (log_file == NULL || *log_file == '\0') 26116c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26126c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp.reset(new StreamFile(GetOutputFile().GetDescriptor(), false)); 26136c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26146c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26156c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26166c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham LogStreamMap::iterator pos = m_log_streams.find(log_file); 26172fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton if (pos != m_log_streams.end()) 26182fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton log_stream_sp = pos->second.lock(); 26192fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton if (!log_stream_sp) 26206c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26216c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp.reset (new StreamFile (log_file)); 26226c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_streams[log_file] = log_stream_sp; 26236c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26246c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26256c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham assert (log_stream_sp.get()); 26266c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26276c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_options == 0) 26286c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 26296c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26306c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (Log::GetLogChannelCallbacks (channel, log_callbacks)) 26316c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26326c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_callbacks.enable (log_stream_sp, log_options, categories, &error_stream); 26336c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return true; 26346c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26356c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26366c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26376c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham LogChannelSP log_channel_sp (LogChannel::FindPlugin (channel)); 26386c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_channel_sp) 26396c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26406c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_channel_sp->Enable (log_stream_sp, log_options, &error_stream, categories)) 26416c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26426c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return true; 26436c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26446c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26456c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26466c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham error_stream.Printf ("Invalid log channel '%s'.\n", channel); 26476c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26486c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26496c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26506c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26516c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26526c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham error_stream.Printf ("Invalid log channel '%s'.\n", channel); 26536c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26546c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26556c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26566c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26576c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham} 26586c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 2659