124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Debugger.cpp --------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 126d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/API/SBDebugger.h" 136d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 145c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "lldb/Core/Debugger.h" 155c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 165c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include <map> 175c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton 181391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/DeclCXX.h" 191391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "clang/AST/Type.h" 201391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConnectionFileDescriptor.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/InputReader.h" 2449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton#include "lldb/Core/PluginManager.h" 26061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 28e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham#include "lldb/Core/StreamAsynchronousIO.h" 296c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham#include "lldb/Core/StreamCallback.h" 30d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Core/StreamString.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "lldb/Core/ValueObject.h" 33f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton#include "lldb/Core/ValueObjectVariable.h" 34f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/DataVisualization.h" 35f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/FormatManager.h" 366d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "lldb/Host/DynamicLibrary.h" 370fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton#include "lldb/Host/Terminal.h" 3863094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h" 3973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueSInt64.h" 4073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueString.h" 4149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ClangASTContext.h" 4249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 4349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h" 4449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Symbol.h" 45f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton#include "lldb/Symbol/VariableList.h" 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 48d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/RegisterContext.h" 49d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#include "lldb/Target/StopInfo.h" 502e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata#include "lldb/Target/Target.h" 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 52f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton#include "lldb/Utility/AnsiTerminal.h" 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic uint32_t g_shared_debugger_refcount = 0; 59558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Ticestatic lldb::user_id_t g_unique_id = 1; 60558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 61d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Static Functions 62d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 63d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic Mutex & 64d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerListMutex () 65d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 66d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton static Mutex g_mutex(Mutex::eMutexTypeRecursive); 67d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return g_mutex; 68d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 69d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 70d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytontypedef std::vector<DebuggerSP> DebuggerList; 71d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 72d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic DebuggerList & 73d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonGetDebuggerList() 74d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 75d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // hide the static debugger list inside a singleton accessor to avoid 76d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // global init contructors 77d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton static DebuggerList g_list; 78d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return g_list; 79d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 8073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 8173844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionEnumValueElement 8273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytong_show_disassembly_enum_values[] = 8373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 8473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeNever, "never", "Never show disassembly when displaying a stop context."}, 8573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeNoSource, "no-source", "Show disassembly when there is no source information, or the source file is missing when displaying a stop context."}, 8673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { Debugger::eStopDisassemblyTypeAlways, "always", "Always show disassembly when displaying a stop context."}, 8773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 0, NULL, NULL } 8873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 8973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 9073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionEnumValueElement 9173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytong_language_enumerators[] = 9273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 9373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguageNone, "none", "Disable scripting languages."}, 9473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguagePython, "python", "Select python as the default scripting language."}, 9573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { eScriptLanguageDefault, "default", "Select the lldb default as the default scripting language."}, 9644ac98c5c04de0b1b558f4207c88be68279a651cGreg Clayton { 0, NULL, NULL } 9773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 9873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 9973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define MODULE_WITH_FUNC "{ ${module.file.basename}{`${function.name-with-args}${function.pc-offset}}}" 10073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define FILE_AND_LINE "{ at ${line.file.basename}:${line.number}}" 10173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 1024b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain#define DEFAULT_THREAD_FORMAT "thread #${thread.index}: tid = ${thread.id%tid}"\ 10373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{, ${frame.pc}}"\ 10473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton MODULE_WITH_FUNC\ 10573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FILE_AND_LINE\ 1064b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain "{, name = '${thread.name}'}"\ 1074b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain "{, queue = '${thread.queue}'}"\ 10873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{, stop reason = ${thread.stop-reason}}"\ 10973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "{\\nReturn value: ${thread.return-value}}"\ 11073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "\\n" 11173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#define DEFAULT_FRAME_FORMAT "frame #${frame.index}: ${frame.pc}"\ 11373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton MODULE_WITH_FUNC\ 11473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton FILE_AND_LINE\ 11573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton "\\n" 11673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 11873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 1199f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytonstatic PropertyDefinition 1209f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytong_properties[] = 12173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 12273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "auto-confirm", OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true all confirmation prompts will receive their default reply." }, 12373844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 12473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "notify-void", OptionValue::eTypeBoolean, true, false, NULL, NULL, "Notify the user explicitly if an expression returns void (default: false)." }, 1253b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton{ "prompt", OptionValue::eTypeString , true, OptionValueString::eOptionEncodeCharacterEscapeSequences, "(lldb) ", NULL, "The debugger command line prompt displayed for the user." }, 12673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "script-lang", OptionValue::eTypeEnum , true, eScriptLanguagePython, NULL, g_language_enumerators, "The script language to be used for evaluating user-written scripts." }, 12773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "stop-disassembly-count", OptionValue::eTypeSInt64 , true, 4 , NULL, NULL, "The number of disassembly lines to show when displaying a stopped context." }, 12873844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 12973844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 13073844aa19a7360b662e2be710fc3c969d6c86606Greg 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." }, 13173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "term-width", OptionValue::eTypeSInt64 , true, 80 , NULL, NULL, "The maximum number of columns to use for displaying text." }, 13273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "thread-format", OptionValue::eTypeString , true, 0 , DEFAULT_THREAD_FORMAT, NULL, "The default thread format string to use when displaying thread information." }, 13373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ "use-external-editor", OptionValue::eTypeBoolean, true, false, NULL, NULL, "Whether to use an external editor or not." }, 13417d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain{ "use-color", OptionValue::eTypeBoolean, true, true , NULL, NULL, "Whether to use Ansi color codes or not." }, 13587e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 13687e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton { NULL, OptionValue::eTypeInvalid, true, 0 , NULL, NULL, NULL } 13773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 138d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 13973844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonenum 14073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 14173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyAutoConfirm = 0, 14273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyFrameFormat, 14373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyNotiftVoid, 14473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyPrompt, 14573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyScriptLanguage, 14673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopDisassemblyCount, 14773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopDisassemblyDisplay, 14873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopLineCountAfter, 14973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyStopLineCountBefore, 15073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyTerminalWidth, 15173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ePropertyThreadFormat, 15217d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain ePropertyUseExternalEditor, 15317d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain ePropertyUseColor, 15473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}; 155d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 15673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 15773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const char * 15873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetFrameFormat() const 15973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 16073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp->GetFrameFormat(); 16173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 16273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const char * 16373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetThreadFormat() const 16473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 16573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp->GetThreadFormat(); 16673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 16773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 1683b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 1693b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 1703b1afc6cc5689b749a48a1506f17ca593b1cda42Greg ClaytonError 1713b1afc6cc5689b749a48a1506f17ca593b1cda42Greg ClaytonDebugger::SetPropertyValue (const ExecutionContext *exe_ctx, 1723b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton VarSetOperationType op, 1733b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *property_path, 1743b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *value) 1753b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton{ 1762e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata bool is_load_script = strcmp(property_path,"target.load-script-from-symbol-file") == 0; 1772e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata TargetSP target_sp; 17807e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata LoadScriptFromSymFile load_script_old_value; 1792e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata if (is_load_script && exe_ctx->GetTargetSP()) 1802e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata { 1812e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata target_sp = exe_ctx->GetTargetSP(); 1822e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata load_script_old_value = target_sp->TargetProperties::GetLoadScriptFromSymbolFile(); 1832e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata } 1843b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton Error error (Properties::SetPropertyValue (exe_ctx, op, property_path, value)); 1853b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton if (error.Success()) 1863b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton { 1872e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata // FIXME it would be nice to have "on-change" callbacks for properties 1883b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton if (strcmp(property_path, g_properties[ePropertyPrompt].name) == 0) 1893b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton { 1903b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton const char *new_prompt = GetPrompt(); 19117d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain std::string str = lldb_utility::ansi::FormatAnsiTerminalCodes (new_prompt, GetUseColor()); 19217d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain if (str.length()) 19317d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain new_prompt = str.c_str(); 1943b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton EventSP prompt_change_event_sp (new Event(CommandInterpreter::eBroadcastBitResetPrompt, new EventDataBytes (new_prompt))); 1953b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton GetCommandInterpreter().BroadcastEvent (prompt_change_event_sp); 1963b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton } 19717d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain else if (strcmp(property_path, g_properties[ePropertyUseColor].name) == 0) 19817d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain { 19917d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain // use-color changed. Ping the prompt so it can reset the ansi terminal codes. 20017d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain SetPrompt (GetPrompt()); 20117d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain } 20207e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata else if (is_load_script && target_sp && load_script_old_value == eLoadScriptFromSymFileWarn) 2032e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata { 20407e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata if (target_sp->TargetProperties::GetLoadScriptFromSymbolFile() == eLoadScriptFromSymFileTrue) 2052e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata { 2062e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata std::list<Error> errors; 20702af494c397d62f22bea65d36ad47080b6adc8afEnrico Granata StreamString feedback_stream; 20802af494c397d62f22bea65d36ad47080b6adc8afEnrico Granata if (!target_sp->LoadScriptingResources(errors,&feedback_stream)) 2092e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata { 2102e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata for (auto error : errors) 2112e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata { 21202af494c397d62f22bea65d36ad47080b6adc8afEnrico Granata GetErrorStream().Printf("%s\n",error.AsCString()); 2132e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata } 21402af494c397d62f22bea65d36ad47080b6adc8afEnrico Granata if (feedback_stream.GetSize()) 21502af494c397d62f22bea65d36ad47080b6adc8afEnrico Granata GetErrorStream().Printf("%s",feedback_stream.GetData()); 2162e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata } 2172e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata } 2182e7f2db1b0c4c6d904811fba7d7877b19288c874Enrico Granata } 2193b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton } 2203b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton return error; 2213b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton} 2223b1afc6cc5689b749a48a1506f17ca593b1cda42Greg Clayton 22373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 22473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetAutoConfirm () const 225be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 22673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyAutoConfirm; 2279f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 228be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 229be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 23073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 23173844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetFrameFormat() const 2321e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan{ 23373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyFrameFormat; 2349f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 2351e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan} 2361e1e6cb5314a8f31630dc817a52fb68a70b623feSean Callanan 23773844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 23873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetNotifyVoid () const 239be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 24073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyNotiftVoid; 2419f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 242be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 243be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 24473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 24573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetPrompt() const 246be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 24773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyPrompt; 2489f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 249be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 250be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 25173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonvoid 25273844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetPrompt(const char *p) 253be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 25473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyPrompt; 25573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 25673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const char *new_prompt = GetPrompt(); 25717d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain std::string str = lldb_utility::ansi::FormatAnsiTerminalCodes (new_prompt, GetUseColor()); 25817d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain if (str.length()) 25917d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain new_prompt = str.c_str(); 26073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton EventSP prompt_change_event_sp (new Event(CommandInterpreter::eBroadcastBitResetPrompt, new EventDataBytes (new_prompt)));; 26173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton GetCommandInterpreter().BroadcastEvent (prompt_change_event_sp); 262be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 263be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 26473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonconst char * 26573844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetThreadFormat() const 266be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 26773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyThreadFormat; 2689f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, g_properties[idx].default_cstr_value); 269be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 270be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 27173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::ScriptLanguage 27273844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetScriptLanguage() const 273be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 27473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyScriptLanguage; 2759f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return (lldb::ScriptLanguage)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 276be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 277be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 27873844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 27973844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetScriptLanguage (lldb::ScriptLanguage script_lang) 280be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 28173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyScriptLanguage; 28273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsEnumeration (NULL, idx, script_lang); 283be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 284be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 28573844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 28673844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetTerminalWidth () const 287be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 28873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyTerminalWidth; 2899f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 290be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 291be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 29273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 29373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetTerminalWidth (uint32_t term_width) 294be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 29573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyTerminalWidth; 29673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsSInt64 (NULL, idx, term_width); 297be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 298be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 29973844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 30073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetUseExternalEditor () const 301be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 30273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyUseExternalEditor; 3039f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 304be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 305be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 30673844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonbool 30773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::SetUseExternalEditor (bool b) 308be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 30973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyUseExternalEditor; 31073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 311be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton} 312be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 31317d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartainbool 31417d5a0358d60922707fdab6ec9c3251ca44dd614Michael SartainDebugger::GetUseColor () const 31517d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain{ 31617d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain const uint32_t idx = ePropertyUseColor; 31717d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 31817d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain} 31917d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain 32017d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartainbool 32117d5a0358d60922707fdab6ec9c3251ca44dd614Michael SartainDebugger::SetUseColor (bool b) 32217d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain{ 32317d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain const uint32_t idx = ePropertyUseColor; 32417d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain bool ret = m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 32517d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain SetPrompt (GetPrompt()); 32617d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain return ret; 32717d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain} 32817d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain 32973844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 33073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetStopSourceLineCount (bool before) const 331be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton{ 33273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = before ? ePropertyStopLineCountBefore : ePropertyStopLineCountAfter; 3339f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 33473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 335be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 33673844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::StopDisassemblyType 33773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetStopDisassemblyDisplay () const 33873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 33973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyStopDisassemblyDisplay; 3409f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return (Debugger::StopDisassemblyType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 34173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 342be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 34373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonuint32_t 34473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonDebugger::GetDisassemblyLineCount () const 34573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 34673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton const uint32_t idx = ePropertyStopDisassemblyCount; 3479f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 34873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 349be9875dc16a839be592110d9de6dc2c9285c5b61Greg Clayton 350d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton#pragma mark Debugger 351d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 35273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//const DebuggerPropertiesSP & 35373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//Debugger::GetSettings() const 35473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//{ 35573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// return m_properties_sp; 35673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//} 35773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 358990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 3590aa2e55f0e9422405ad33675adc1e35044537adbCaroline Ticeint 3600aa2e55f0e9422405ad33675adc1e35044537adbCaroline TiceDebugger::TestDebuggerRefCount () 3610aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice{ 3620aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice return g_shared_debugger_refcount; 3630aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice} 3640aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Initialize () 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 368f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount++ == 0) 369c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::Initialize(); 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::Terminate () 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37563094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount > 0) 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37763094e0bb161580564954dee512955c1c79d3476Greg Clayton g_shared_debugger_refcount--; 37863094e0bb161580564954dee512955c1c79d3476Greg Clayton if (g_shared_debugger_refcount == 0) 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 380c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::WillTerminate(); 381c0c1b0c0cfd2aeaf01111762fd66e59d6273bceaGreg Clayton lldb_private::Terminate(); 382202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice 383202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice // Clear our master list of debugger objects 384202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice Mutex::Locker locker (GetDebuggerListMutex ()); 385202f6b8715dbff8971ce69bb61cfb8bfc447c24cCaroline Tice GetDebuggerList().clear(); 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3902a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid 3912a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsInitialize () 3922a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 393c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Target::SettingsInitialize (); 3942a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 3952a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 3962a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Ticevoid 3972a456816c5d7c575f2e141acd48bb5f8085d9910Caroline TiceDebugger::SettingsTerminate () 3982a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice{ 399c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Target::SettingsTerminate (); 4002a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice} 4012a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice 4026d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatabool 403323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico GranataDebugger::LoadPlugin (const FileSpec& spec, Error& error) 4046d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 4056d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec)); 406323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata if (!dynlib_sp || dynlib_sp->IsValid() == false) 407323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata { 408323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata if (spec.Exists()) 409323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata error.SetErrorString("this file does not represent a loadable dylib"); 410323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata else 411323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata error.SetErrorString("no such file"); 412323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata return false; 413323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata } 4146d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::DebuggerSP debugger_sp(shared_from_this()); 4156d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata lldb::SBDebugger debugger_sb(debugger_sp); 4160bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) function. 4176d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays 4186d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol<LLDBCommandPluginInit>("_ZN4lldb16PluginInitializeENS_10SBDebuggerE"); 4196d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (!init_func) 420323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata { 421323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata error.SetErrorString("cannot find the initialization function lldb::PluginInitialize(lldb::SBDebugger)"); 4226d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return false; 423323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata } 4246d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (init_func(debugger_sb)) 4256d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4266d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata m_loaded_plugins.push_back(dynlib_sp); 4276d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return true; 4286d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 429323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata error.SetErrorString("dylib refused to be loaded"); 4306d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return false; 4316d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 4326d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4336d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatastatic FileSpec::EnumerateDirectoryResult 4346d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataLoadPluginCallback 4356d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata( 4366d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata void *baton, 4376d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::FileType file_type, 4386d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const FileSpec &file_spec 4396d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata ) 4406d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 4416d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata Error error; 4426d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4436d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata static ConstString g_dylibext("dylib"); 4440bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain static ConstString g_solibext("so"); 4456d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4466d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (!baton) 4476d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultQuit; 4486d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4496d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata Debugger *debugger = (Debugger*)baton; 4506d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4516d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // If we have a regular file, a symbolic link or unknown file type, try 4526d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // and process the file. We must handle unknown as sometimes the directory 4536d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // enumeration might be enumerating a file system that doesn't have correct 4546d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // file type information. 4556d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (file_type == FileSpec::eFileTypeRegular || 4566d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeSymbolicLink || 4576d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeUnknown ) 4586d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4596d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec plugin_file_spec (file_spec); 4606d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata plugin_file_spec.ResolvePath (); 4616d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4620bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain if (plugin_file_spec.GetFileNameExtension() != g_dylibext && 4630bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain plugin_file_spec.GetFileNameExtension() != g_solibext) 4640bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain { 4656d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 4660bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain } 4676d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 468323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata Error plugin_load_error; 469323c03778ea1a2b3d9bd4cb749f502e3f5792275Enrico Granata debugger->LoadPlugin (plugin_file_spec, plugin_load_error); 4706d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4716d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 4726d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4736d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4746d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata else if (file_type == FileSpec::eFileTypeUnknown || 4756d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeDirectory || 4766d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata file_type == FileSpec::eFileTypeSymbolicLink ) 4776d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4786d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // Try and recurse into anything that a directory or symbolic link. 4796d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // We must also do this for unknown as sometimes the directory enumeration 4806d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // might be enurating a file system that doesn't have correct file type 4816d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata // information. 4826d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultEnter; 4836d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 4846d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4856d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata return FileSpec::eEnumerateDirectoryResultNext; 4866d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 4876d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 4886d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granatavoid 4896d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico GranataDebugger::InstanceInitialize () 4906d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata{ 4916d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec dir_spec; 4926d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_directories = true; 4936d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_files = true; 4946d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata const bool find_other = true; 4956d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata char dir_path[PATH_MAX]; 4966d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (Host::GetLLDBPath (ePathTypeLLDBSystemPlugins, dir_spec)) 4976d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 4986d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path))) 4996d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 5006d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::EnumerateDirectory (dir_path, 5016d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_directories, 5026d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_files, 5036d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_other, 5046d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LoadPluginCallback, 5056d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata this); 5066d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 5076d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 5086d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 5096d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (Host::GetLLDBPath (ePathTypeLLDBUserPlugins, dir_spec)) 5106d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 5116d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path))) 5126d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata { 5136d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata FileSpec::EnumerateDirectory (dir_path, 5146d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_directories, 5156d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_files, 5166d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata find_other, 5176d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata LoadPluginCallback, 5186d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata this); 5196d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 5206d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata } 52187e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton 52287e9d32a982a0fb76b8657a897ad5781f9a5d25eGreg Clayton PluginManager::DebuggerInitialize (*this); 5236d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata} 5246d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata 52563094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebuggerSP 5266c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::CreateInstance (lldb::LogOutputCallback log_callback, void *baton) 52763094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 5286c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham DebuggerSP debugger_sp (new Debugger(log_callback, baton)); 529f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 53063094e0bb161580564954dee512955c1c79d3476Greg Clayton { 53163094e0bb161580564954dee512955c1c79d3476Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 53263094e0bb161580564954dee512955c1c79d3476Greg Clayton GetDebuggerList().push_back(debugger_sp); 53363094e0bb161580564954dee512955c1c79d3476Greg Clayton } 5346d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata debugger_sp->InstanceInitialize (); 53563094e0bb161580564954dee512955c1c79d3476Greg Clayton return debugger_sp; 53663094e0bb161580564954dee512955c1c79d3476Greg Clayton} 53763094e0bb161580564954dee512955c1c79d3476Greg Clayton 538c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Ticevoid 539987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::Destroy (DebuggerSP &debugger_sp) 540c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice{ 541c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice if (debugger_sp.get() == NULL) 542c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice return; 543c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice 544c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham debugger_sp->Clear(); 545c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham 546f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 547c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice { 548f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 549f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList (); 550f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 551f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin (); pos != end; ++pos) 552c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice { 553f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if ((*pos).get() == debugger_sp.get()) 554f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 555f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_list.erase (pos); 556f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return; 557f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 558c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice } 559c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice } 560c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice} 561c4ed12f9db1a526401f29a4cef17d78fa5e3da26Caroline Tice 562987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebuggerSP 5636e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline TiceDebugger::FindDebuggerWithInstanceName (const ConstString &instance_name) 5646e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice{ 565987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton DebuggerSP debugger_sp; 566c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton if (g_shared_debugger_refcount > 0) 567c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 568c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 569c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton DebuggerList &debugger_list = GetDebuggerList(); 570c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 571c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton 572c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 573c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 574c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton if ((*pos).get()->m_instance_name == instance_name) 575c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton { 576c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton debugger_sp = *pos; 577c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton break; 578c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 579c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 580c6e82e4a323d7a7168b05365c53c9bc2e0d418e3Greg Clayton } 5816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice return debugger_sp; 5826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice} 58363094e0bb161580564954dee512955c1c79d3476Greg Clayton 58463094e0bb161580564954dee512955c1c79d3476Greg ClaytonTargetSP 58563094e0bb161580564954dee512955c1c79d3476Greg ClaytonDebugger::FindTargetWithProcessID (lldb::pid_t pid) 58663094e0bb161580564954dee512955c1c79d3476Greg Clayton{ 587987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton TargetSP target_sp; 588f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 58963094e0bb161580564954dee512955c1c79d3476Greg Clayton { 590f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 591f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 592f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 593f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 594f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 595f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid); 596f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (target_sp) 597f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 598f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 59963094e0bb161580564954dee512955c1c79d3476Greg Clayton } 60063094e0bb161580564954dee512955c1c79d3476Greg Clayton return target_sp; 60163094e0bb161580564954dee512955c1c79d3476Greg Clayton} 60263094e0bb161580564954dee512955c1c79d3476Greg Clayton 6031c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonTargetSP 6041c4642c6ab741d85c98d4288cf922c9a2ef77007Greg ClaytonDebugger::FindTargetWithProcess (Process *process) 6051c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton{ 6061c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton TargetSP target_sp; 607f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 6081c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton { 609f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 610f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 611f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 612f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 613f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 614f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton target_sp = (*pos)->GetTargetList().FindTargetWithProcess (process); 615f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (target_sp) 616f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 617f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 6181c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton } 6191c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton return target_sp; 6201c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton} 6211c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 6226c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::Debugger (lldb::LogOutputCallback log_callback, void *baton) : 623558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice UserID (g_unique_id++), 62473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Properties(OptionValuePropertiesSP(new OptionValueProperties())), 625eecb0f3b5021e37311f9588f14bcab38a35b8e9aGreg Clayton m_input_comm("debugger.input"), 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_file (), 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_output_file (), 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_error_file (), 629b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state (), 6305a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham m_target_list (*this), 631b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_platform_list (), 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_listener ("lldb.Debugger"), 633535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton m_source_manager_ap(), 634cc637461f6c59851302836c64e0cb002de4f4571Jim Ingham m_source_file_cache(), 63563094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)), 636d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack (), 63773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_input_reader_data (), 63873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_instance_name() 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton char instance_cstr[256]; 64173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton snprintf(instance_cstr, sizeof(instance_cstr), "debugger_%d", (int)GetID()); 64273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_instance_name.SetCString(instance_cstr); 6436c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_callback) 6446c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 64563094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->Initialize (); 646b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Always add our default platform to the platform list 647b1888f24fa181489840b9acf193e224d125d0776Greg Clayton PlatformSP default_platform_sp (Platform::GetDefaultPlatform()); 648b1888f24fa181489840b9acf193e224d125d0776Greg Clayton assert (default_platform_sp.get()); 649b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_platform_list.Append (default_platform_sp, true); 65073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 6519f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_collection_sp->Initialize (g_properties); 65273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton m_collection_sp->AppendProperty (ConstString("target"), 65373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton ConstString("Settings specify to debugging targets."), 65473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton true, 65573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton Target::GetGlobalProperties()->GetValueProperties()); 6569f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton if (m_command_interpreter_ap.get()) 6579f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton { 6589f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_collection_sp->AppendProperty (ConstString("interpreter"), 6599f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton ConstString("Settings specify to the debugger's command interpreter."), 6609f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton true, 6619f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton m_command_interpreter_ap->GetValueProperties()); 6629f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton } 66373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton OptionValueSInt64 *term_width = m_collection_sp->GetPropertyAtIndexAsOptionValueSInt64 (NULL, ePropertyTerminalWidth); 66473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton term_width->SetMinimumValue(10); 66573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton term_width->SetMaximumValue(1024); 66617d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain 66717d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain // Turn off use-color if this is a dumb terminal. 66817d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain const char *term = getenv ("TERM"); 66917d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain if (term && !strcmp (term, "dumb")) 67017d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain SetUseColor (false); 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::~Debugger () 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 675c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham Clear(); 676c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham} 677c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham 678c0c53249938e49e006a982057e9106a97da5ea89Jim Inghamvoid 679c0c53249938e49e006a982057e9106a97da5ea89Jim InghamDebugger::Clear() 680c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham{ 681c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice CleanUpInputReaders(); 6822f57db09a49f2a05a620b8163bbe1e748a46ec73Greg Clayton m_listener.Clear(); 68363094e0bb161580564954dee512955c1c79d3476Greg Clayton int num_targets = m_target_list.GetNumTargets(); 68463094e0bb161580564954dee512955c1c79d3476Greg Clayton for (int i = 0; i < num_targets; i++) 68563094e0bb161580564954dee512955c1c79d3476Greg Clayton { 6862fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton TargetSP target_sp (m_target_list.GetTargetAtIndex (i)); 6872fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (target_sp) 688c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham { 6892fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 6902fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton if (process_sp) 6916e46a3ebaf487676b636a2e92b030e5e9a781ecfJim Ingham process_sp->Finalize(); 6922fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton target_sp->Destroy(); 693c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham } 69463094e0bb161580564954dee512955c1c79d3476Greg Clayton } 6955a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham BroadcasterManager::Clear (); 696e585240956453d98413a0f9461a04500f9cba605Greg Clayton 697e585240956453d98413a0f9461a04500f9cba605Greg Clayton // Close the input file _before_ we close the input read communications class 698e585240956453d98413a0f9461a04500f9cba605Greg Clayton // as it does NOT own the input file, our m_input_file does. 699b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state.Clear(); 700e585240956453d98413a0f9461a04500f9cba605Greg Clayton GetInputFile().Close (); 701e585240956453d98413a0f9461a04500f9cba605Greg Clayton // Now that we have closed m_input_file, we can now tell our input communication 702e585240956453d98413a0f9461a04500f9cba605Greg Clayton // class to close down. Its read thread should quickly exit after we close 703e585240956453d98413a0f9461a04500f9cba605Greg Clayton // the input file handle above. 704e585240956453d98413a0f9461a04500f9cba605Greg Clayton m_input_comm.Clear (); 705c0c53249938e49e006a982057e9106a97da5ea89Jim Ingham} 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 708421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::GetCloseInputOnEOF () const 709421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{ 710421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton return m_input_comm.GetCloseOnEOF(); 711421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton} 712421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton 713421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonvoid 714421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg ClaytonDebugger::SetCloseInputOnEOF (bool b) 715421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton{ 716421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton m_input_comm.SetCloseOnEOF(b); 717421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton} 718421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Clayton 719421ca5014ea0e163998b9a8e0d777d3adb5c872eGreg Claytonbool 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::GetAsyncExecution () 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72263094e0bb161580564954dee512955c1c79d3476Greg Clayton return !m_command_interpreter_ap->GetSynchronous(); 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetAsyncExecution (bool async_execution) 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72863094e0bb161580564954dee512955c1c79d3476Greg Clayton m_command_interpreter_ap->SetSynchronous (!async_execution); 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership) 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7355892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &in_file = GetInputFile(); 7365892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton in_file.SetStream (fh, tranfer_ownership); 7375892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (in_file.IsValid() == false) 7385892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton in_file.SetStream (stdin, true); 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Disconnect from any old connection if we had one 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.Disconnect (); 742bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // Pass false as the second argument to ConnectionFileDescriptor below because 743bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // our "in_file" above will already take ownership if requested and we don't 744bba48364984bada19ba2aff2993ec583927d8150Greg Clayton // want to objects trying to own and close a file descriptor. 745bba48364984bada19ba2aff2993ec583927d8150Greg Clayton m_input_comm.SetConnection (new ConnectionFileDescriptor (in_file.GetDescriptor(), false)); 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this); 747b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 748b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham // Save away the terminal state if that is relevant, so that we can restore it in RestoreInputState. 749b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham SaveInputTerminalState (); 750b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_comm.StartReadThread (&error) == false) 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7545892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &err_file = GetErrorFile(); 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7565892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.Printf ("error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error"); 7575892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton exit(1); 7585892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton } 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership) 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7645892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &out_file = GetOutputFile(); 7655892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton out_file.SetStream (fh, tranfer_ownership); 7665892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (out_file.IsValid() == false) 7675892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton out_file.SetStream (stdout, false); 7680aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice 769db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata // do not create the ScriptInterpreter just for setting the output file handle 770db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata // as the constructor will know how to do the right thing on its own 771db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata const bool can_create = false; 772db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata ScriptInterpreter* script_interpreter = GetCommandInterpreter().GetScriptInterpreter(can_create); 773db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (script_interpreter) 774db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata script_interpreter->ResetOutputFileHandle (fh); 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership) 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7805892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton File &err_file = GetErrorFile(); 7815892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.SetStream (fh, tranfer_ownership); 7825892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (err_file.IsValid() == false) 7835892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton err_file.SetStream (stderr, false); 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 786b1087a27f7babc43f332c9d49ac4554892133a41Jim Inghamvoid 787b1087a27f7babc43f332c9d49ac4554892133a41Jim InghamDebugger::SaveInputTerminalState () 788b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham{ 789b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham File &in_file = GetInputFile(); 790b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham if (in_file.GetDescriptor() != File::kInvalidDescriptor) 791b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state.Save(in_file.GetDescriptor(), true); 792b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham} 793b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 794b1087a27f7babc43f332c9d49ac4554892133a41Jim Inghamvoid 795b1087a27f7babc43f332c9d49ac4554892133a41Jim InghamDebugger::RestoreInputTerminalState () 796b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham{ 797b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham m_terminal_state.Restore(); 798b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham} 799b1087a27f7babc43f332c9d49ac4554892133a41Jim Ingham 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerExecutionContext 801c833295baeec641086f536e78050388af36784f8Jim InghamDebugger::GetSelectedExecutionContext () 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExecutionContext exe_ctx; 804567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton TargetSP target_sp(GetSelectedTarget()); 805567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetTargetSP (target_sp); 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (target_sp) 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 809567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ProcessSP process_sp (target_sp->GetProcessSP()); 810567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetProcessSP (process_sp); 811567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process_sp && process_sp->IsRunning() == false) 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 813567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread()); 814567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread_sp) 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 816567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetThreadSP (thread_sp); 817567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetSelectedFrame()); 818567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr() == NULL) 819567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx.SetFrameSP (thread_sp->GetStackFrameAtIndex (0)); 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return exe_ctx; 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8277f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceInputReaderSP 8287f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline TiceDebugger::GetCurrentInputReader () 8297f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice{ 8307f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp; 8317f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 832d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 8337f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice { 8347f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Clear any finished readers from the stack 8357f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice while (CheckIfTopInputReaderIsDone()) ; 8367f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 837d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 838d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice reader_sp = m_input_reader_stack.Top(); 8397f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice } 8407f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 8417f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice return reader_sp; 8427f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice} 8437f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len) 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 847c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (bytes_len > 0) 848c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len); 849c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice else 850c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice ((Debugger *)baton)->DispatchInputEndOfFile (); 851c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::DispatchInput (const char *bytes, size_t bytes_len) 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 857c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice if (bytes == NULL || bytes_len == 0) 858c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice return; 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WriteToDefaultReader (bytes, bytes_len); 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 864c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputInterrupt () 865c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{ 866c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_input_reader_data.clear(); 867c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 8687f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 8697f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (reader_sp) 870c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice { 8717f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice reader_sp->Notify (eInputReaderInterrupt); 872c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 8737f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // If notifying the reader of the interrupt finished the reader, we should pop it off the stack. 874c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 875c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 876c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 877c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 878c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid 879c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline TiceDebugger::DispatchInputEndOfFile () 880c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice{ 881c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice m_input_reader_data.clear(); 882c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 8837f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 8847f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (reader_sp) 885c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice { 8867f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 887c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 8887f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // If notifying the reader of the end-of-file finished the reader, we should pop it off the stack. 889c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice while (CheckIfTopInputReaderIsDone ()) ; 890c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice } 891c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice} 892c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice 893c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Ticevoid 894c0446861315ac0d5994f93510e24cbcac9f534adCaroline TiceDebugger::CleanUpInputReaders () 895c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice{ 896c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice m_input_reader_data.clear(); 897c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice 8987f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // The bottom input reader should be the main debugger input reader. We do not want to close that one here. 899d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice while (m_input_reader_stack.GetSize() > 1) 900c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice { 9017f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 902c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice if (reader_sp) 903c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice { 904c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice reader_sp->Notify (eInputReaderEndOfFile); 905c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice reader_sp->SetIsDone (true); 906c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice } 907c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice } 908c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice} 909c0446861315ac0d5994f93510e24cbcac9f534adCaroline Tice 910c0446861315ac0d5994f93510e24cbcac9f534adCaroline Ticevoid 9114a348081030cdd2af758fddc869518357d9befd3Caroline TiceDebugger::NotifyTopInputReader (InputReaderAction notification) 9124a348081030cdd2af758fddc869518357d9befd3Caroline Tice{ 9134a348081030cdd2af758fddc869518357d9befd3Caroline Tice InputReaderSP reader_sp (GetCurrentInputReader()); 9144a348081030cdd2af758fddc869518357d9befd3Caroline Tice if (reader_sp) 9154a348081030cdd2af758fddc869518357d9befd3Caroline Tice { 9164a348081030cdd2af758fddc869518357d9befd3Caroline Tice reader_sp->Notify (notification); 9174a348081030cdd2af758fddc869518357d9befd3Caroline Tice 9184a348081030cdd2af758fddc869518357d9befd3Caroline Tice // Flush out any input readers that are done. 9194a348081030cdd2af758fddc869518357d9befd3Caroline Tice while (CheckIfTopInputReaderIsDone ()) 9204a348081030cdd2af758fddc869518357d9befd3Caroline Tice /* Do nothing. */; 9214a348081030cdd2af758fddc869518357d9befd3Caroline Tice } 9224a348081030cdd2af758fddc869518357d9befd3Caroline Tice} 9234a348081030cdd2af758fddc869518357d9befd3Caroline Tice 924b38df1e945846a5d956974ec157902a6ad748868Caroline Ticebool 925987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::InputReaderIsTopReader (const InputReaderSP& reader_sp) 926b38df1e945846a5d956974ec157902a6ad748868Caroline Tice{ 927892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader()); 928b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 929892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice return (reader_sp.get() == top_reader_sp.get()); 930b38df1e945846a5d956974ec157902a6ad748868Caroline Tice} 931b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 932b38df1e945846a5d956974ec157902a6ad748868Caroline Tice 9334a348081030cdd2af758fddc869518357d9befd3Caroline Ticevoid 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::WriteToDefaultReader (const char *bytes, size_t bytes_len) 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes && bytes_len) 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.append (bytes, bytes_len); 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_input_reader_data.empty()) 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 942d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice while (!m_input_reader_stack.IsEmpty() && !m_input_reader_data.empty()) 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the input reader from the top of the stack 9457f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP reader_sp (GetCurrentInputReader ()); 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94953d68e749f0715691a95f23e9490d97e484b15daGreg Clayton size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(), 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.size()); 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (bytes_handled) 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_input_reader_data.erase (0, bytes_handled); 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No bytes were handled, we might not have reached our 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // granularity, just return and wait for more data 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9637f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Flush out any input readers that are done. 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (CheckIfTopInputReaderIsDone ()) 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /* Do nothing. */; 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::PushInputReader (const InputReaderSP& reader_sp) 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!reader_sp) 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 9747f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 9757f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Deactivate the old top reader 9767f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice InputReaderSP top_reader_sp (GetCurrentInputReader ()); 9777f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 9787f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice if (top_reader_sp) 9797f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice top_reader_sp->Notify (eInputReaderDeactivate); 9807f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice 981d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack.Push (reader_sp); 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderActivate); 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 987987c7ebe1daa425ba7abfa9643800e3237146fc0Greg ClaytonDebugger::PopInputReader (const InputReaderSP& pop_reader_sp) 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The reader on the stop of the stack is done, so let the next 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // read on the stack referesh its prompt and if there is one... 993d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9957f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 996d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get()) 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1000d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice m_input_reader_stack.Pop (); 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDeactivate); 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderDone); 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1005d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1007d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice reader_sp = m_input_reader_stack.Top(); 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp) 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ActivateInputReader (reader_sp); 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reader_sp->Notify (eInputReaderReactivate); 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::CheckIfTopInputReaderIsDone () 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool result = false; 1023d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice if (!m_input_reader_stack.IsEmpty()) 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10257f99fc8c51b4eb67d4c1e6ab89c7ba12a6cfd1fcCaroline Tice // Cannot call GetCurrentInputReader here, as that would cause an infinite loop. 1026d8662f50b3cdcdec80c652ad3bb1d0130b397681Caroline Tice InputReaderSP reader_sp(m_input_reader_stack.Top()); 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reader_sp && reader_sp->IsDone()) 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result = true; 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PopInputReader (reader_sp); 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDebugger::ActivateInputReader (const InputReaderSP &reader_sp) 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10405892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton int input_fd = m_input_file.GetFile().GetDescriptor(); 104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10425892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton if (input_fd >= 0) 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10445892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton Terminal tty(input_fd); 10450fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 10460fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetEcho(reader_sp->GetEcho()); 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10480fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton switch (reader_sp->GetGranularity()) 10490fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton { 10500fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityByte: 10510fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityWord: 10520fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetCanonical (false); 10530fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 10540fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 10550fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityLine: 10560fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton case eInputReaderGranularityAll: 10570fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton tty.SetCanonical (true); 10580fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 10590fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton 10600fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton default: 10610fdd4a0ed890af386d86ee404ffe58e0e2d6020bGreg Clayton break; 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 106563094e0bb161580564954dee512955c1c79d3476Greg Clayton 1066e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP 1067e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncOutputStream () 1068e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{ 1069e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 1070e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham CommandInterpreter::eBroadcastBitAsynchronousOutputData)); 1071e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham} 1072e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham 1073e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamStreamSP 1074e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim InghamDebugger::GetAsyncErrorStream () 1075e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham{ 1076e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham return StreamSP (new StreamAsynchronousIO (GetCommandInterpreter(), 1077e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham CommandInterpreter::eBroadcastBitAsynchronousErrorData)); 1078e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham} 1079e5ed8e90471d8f56d054909f06e91b06ce38ff05Jim Ingham 108036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 108116376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico GranataDebugger::GetNumDebuggers() 108216376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata{ 1083f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 1084f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 1085f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1086f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return GetDebuggerList().size(); 1087f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1088f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton return 0; 108916376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata} 109016376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 109116376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granatalldb::DebuggerSP 109236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonDebugger::GetDebuggerAtIndex (size_t index) 109316376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata{ 109416376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata DebuggerSP debugger_sp; 109516376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 1096f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 1097f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 1098f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1099f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 110016376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 1101f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (index < debugger_list.size()) 1102f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_sp = debugger_list[index]; 1103f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1104f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton 110516376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata return debugger_sp; 110616376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata} 110716376ed044df3ee70fcf69e19f06af01e71a8e9aEnrico Granata 1108558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebuggerSP 1109558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline TiceDebugger::FindDebuggerWithID (lldb::user_id_t id) 1110558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice{ 1111987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton DebuggerSP debugger_sp; 1112558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice 1113f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if (g_shared_debugger_refcount > 0) 1114558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 1115f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton Mutex::Locker locker (GetDebuggerListMutex ()); 1116f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList &debugger_list = GetDebuggerList(); 1117f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton DebuggerList::iterator pos, end = debugger_list.end(); 1118f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton for (pos = debugger_list.begin(); pos != end; ++pos) 1119558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice { 1120f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton if ((*pos).get()->GetID() == id) 1121f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton { 1122f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton debugger_sp = *pos; 1123f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton break; 1124f9de1922a6542ba6a3d56df122e3548a7d15b51bGreg Clayton } 1125558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 1126558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice } 1127558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice return debugger_sp; 1128558be58c085ed1d3e33c01f5ea3bf0eff63ab827Caroline Tice} 11296e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice 1130d0a5a23d734da7a2170802ccd096f53b8a527811Greg Claytonstatic void 1131d0a5a23d734da7a2170802ccd096f53b8a527811Greg ClaytonTestPromptFormats (StackFrame *frame) 1132d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 1133d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (frame == NULL) 1134d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return; 1135d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1136d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton StreamString s; 1137d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *prompt_format = 1138d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{addr = '${addr}'\n}" 1139d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.id = '${process.id}'\n}" 1140d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.name = '${process.name}'\n}" 1141d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.file.basename = '${process.file.basename}'\n}" 1142d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{process.file.fullpath = '${process.file.fullpath}'\n}" 1143d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.id = '${thread.id}'\n}" 1144d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.index = '${thread.index}'\n}" 1145d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.name = '${thread.name}'\n}" 1146d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.queue = '${thread.queue}'\n}" 1147d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{thread.stop-reason = '${thread.stop-reason}'\n}" 1148d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{target.arch = '${target.arch}'\n}" 1149d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{module.file.basename = '${module.file.basename}'\n}" 1150d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{module.file.fullpath = '${module.file.fullpath}'\n}" 1151d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{file.basename = '${file.basename}'\n}" 1152d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{file.fullpath = '${file.fullpath}'\n}" 1153d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.index = '${frame.index}'\n}" 1154d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.pc = '${frame.pc}'\n}" 1155d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.sp = '${frame.sp}'\n}" 1156d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.fp = '${frame.fp}'\n}" 1157d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.flags = '${frame.flags}'\n}" 1158d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rdi = '${frame.reg.rdi}'\n}" 1159d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rip = '${frame.reg.rip}'\n}" 1160d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rsp = '${frame.reg.rsp}'\n}" 1161d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rbp = '${frame.reg.rbp}'\n}" 1162d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.rflags = '${frame.reg.rflags}'\n}" 1163d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.xmm0 = '${frame.reg.xmm0}'\n}" 1164d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{frame.reg.carp = '${frame.reg.carp}'\n}" 1165d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.id = '${function.id}'\n}" 1166d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.name = '${function.name}'\n}" 11672fc9b6fb9c3bc5cb02e8250fbd97f34a2bc0542eGreg Clayton "{function.name-with-args = '${function.name-with-args}'\n}" 1168d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.addr-offset = '${function.addr-offset}'\n}" 1169d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.line-offset = '${function.line-offset}'\n}" 1170d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{function.pc-offset = '${function.pc-offset}'\n}" 1171d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.file.basename = '${line.file.basename}'\n}" 1172d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.file.fullpath = '${line.file.fullpath}'\n}" 1173d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.number = '${line.number}'\n}" 1174d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.start-addr = '${line.start-addr}'\n}" 1175d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton "{line.end-addr = '${line.end-addr}'\n}" 1176d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton; 1177d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1178d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextEverything)); 1179d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ExecutionContext exe_ctx; 1180a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton frame->CalculateExecutionContext(exe_ctx); 118117d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain if (Debugger::FormatPrompt (prompt_format, &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s)) 1182d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1183d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf("%s\n", s.GetData()); 1184d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1185d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 1186d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1187d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton printf ("what we got: %s\n", s.GetData()); 1188d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1189d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 1190d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 11919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool 11922c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanFormatDescriptor (const char* var_name_begin, 11932c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_end, 11942c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** var_name_final, 11952c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** percent_position, 1196987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Format* custom_format, 11972c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata ValueObject::ValueObjectRepresentationStyle* val_obj_display) 11989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1199952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 12009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *percent_position = ::strchr(var_name_begin,'%'); 1201107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!*percent_position || *percent_position > var_name_end) 1202de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1203de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12047b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanFormatDescriptor] no format descriptor in string, skipping"); 12059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final = var_name_end; 1206de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 12079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 12089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 12099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final = *percent_position; 12106a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata std::string format_name(*var_name_final+1, var_name_end-*var_name_final-1); 1211de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1212b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata log->Printf("[ScanFormatDescriptor] parsing %s as a format descriptor", format_name.c_str()); 12136a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata if ( !FormatManager::GetFormatFromCString(format_name.c_str(), 12149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata true, 12159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *custom_format) ) 12169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1217de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1218b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata log->Printf("[ScanFormatDescriptor] %s is an unknown format", format_name.c_str()); 12196a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata 12206a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata switch (format_name.front()) 12216a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata { 12226a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata case '@': // if this is an @ sign, print ObjC description 12236a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleLanguageSpecific; 12246a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata break; 12256a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata case 'V': // if this is a V, print the value using the default format 12266a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 12276a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata break; 12286a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata case 'L': // if this is an L, print the location of the value 12296a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleLocation; 12306a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata break; 12316a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata case 'S': // if this is an S, print the summary after all 12326a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleSummary; 12336a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata break; 12346a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata case '#': // if this is a '#', print the number of children 12356a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleChildrenCount; 12366a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata break; 12376a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata case 'T': // if this is a 'T', print the type 12386a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleType; 12396a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata break; 124073cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata case 'N': // if this is a 'N', print the name 124173cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleName; 124273cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata break; 124373cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata case '>': // if this is a '>', print the name 124473cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleExpressionPath; 124573cfdbc9c81c5eb24c5dcd34afba8e2b441cb720Enrico Granata break; 12466a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata default: 12470c2921f5b9dab2ca1832bb746ab3aa3f66fdd0b5Jim Ingham if (log) 12480c2921f5b9dab2ca1832bb746ab3aa3f66fdd0b5Jim Ingham log->Printf("ScanFormatDescriptor] %s is an error, leaving the previous value alone", format_name.c_str()); 12496a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata break; 12506a94de3d25428fa4b9c9a56cba8b710f79236335Enrico Granata } 12519762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 12529762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // a good custom format tells us to print the value using it 12539762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 1254de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1255de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1256b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata log->Printf("[ScanFormatDescriptor] will display value for this VO"); 1257cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata *val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1258de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 12599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1260de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1261b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata log->Printf("[ScanFormatDescriptor] final format description outcome: custom_format = %d, val_obj_display = %d", 1262de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata *custom_format, 1263de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata *val_obj_display); 12649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 12659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 12669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 12679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic bool 12682c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataScanBracketedRange (const char* var_name_begin, 12692c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_end, 12702c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char* var_name_final, 12712c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** open_bracket_position, 12722c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** separator_position, 12732c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** close_bracket_position, 12742c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata const char** var_name_final_if_array_range, 12752c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata int64_t* index_lower, 12762c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata int64_t* index_higher) 12779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1278952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 12799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *open_bracket_position = ::strchr(var_name_begin,'['); 1280107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*open_bracket_position && *open_bracket_position < var_name_final) 12819762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 12829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *separator_position = ::strchr(*open_bracket_position,'-'); // might be NULL if this is a simple var[N] bitfield 12839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *close_bracket_position = ::strchr(*open_bracket_position,']'); 12849762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata // as usual, we assume that [] will come before % 12859762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata //printf("trying to expand a []\n"); 12869762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *var_name_final_if_array_range = *open_bracket_position; 1287107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (*close_bracket_position - *open_bracket_position == 1) 12889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1289de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12907b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] '[]' detected.. going from 0 to end of data"); 12919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = 0; 12929762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 12939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else if (*separator_position == NULL || *separator_position > var_name_end) 12949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 12959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char *end = NULL; 12969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 12979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = *index_lower; 1298de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 12995f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("[ScanBracketedRange] [%" PRId64 "] detected, high index is same", *index_lower); 13009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1301107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else if (*close_bracket_position && *close_bracket_position < var_name_end) 13029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 13039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata char *end = NULL; 13049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = ::strtoul (*open_bracket_position+1, &end, 0); 13059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = ::strtoul (*separator_position+1, &end, 0); 1306de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 13075f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("[ScanBracketedRange] [%" PRId64 "-%" PRId64 "] detected", *index_lower, *index_higher); 13089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 13099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata else 1310de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1311de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 13127b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] expression is erroneous, cannot extract indices out of it"); 13139762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return false; 1314de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 13159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata if (*index_lower > *index_higher && *index_higher > 0) 13169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1317de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 13187b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] swapping indices"); 131936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton int64_t temp = *index_lower; 13209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_lower = *index_higher; 13219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata *index_higher = temp; 13229762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 13239762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1324de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata else if (log) 13257b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ScanBracketedRange] no bracketed range, skipping entirely"); 13269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return true; 13279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 13289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 13294b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartaintemplate <typename T> 13304b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartainstatic bool RunScriptFormatKeyword(Stream &s, ScriptInterpreter *script_interpreter, T t, const std::string& script_name) 13314b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain{ 13324b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (script_interpreter) 13334b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 13344b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain Error script_error; 13354b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain std::string script_output; 13364b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain 13374b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (script_interpreter->RunScriptFormatKeyword(script_name.c_str(), t, script_output, script_error) && script_error.Success()) 13384b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 13394b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain s.Printf("%s", script_output.c_str()); 13404b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain return true; 13414b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 13424b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else 13434b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 13444b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain s.Printf("<error: %s>",script_error.AsCString()); 13454b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 13464b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 13474b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain return false; 13484b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain} 13494b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain 13509762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatastatic ValueObjectSP 13512c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico GranataExpandIndexedExpression (ValueObject* valobj, 135236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t index, 13532c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata StackFrame* frame, 13542c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata bool deref_pointer) 13559762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{ 1356952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 1357ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* ptr_deref_format = "[%d]"; 1358bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata std::string ptr_deref_buffer(10,0); 1359bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata ::sprintf(&ptr_deref_buffer[0], ptr_deref_format, index); 1360de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1361bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata log->Printf("[ExpandIndexedExpression] name to deref: %s",ptr_deref_buffer.c_str()); 1362ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* first_unparsed; 1363ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::GetValueForExpressionPathOptions options; 1364ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathEndResultType final_value_type; 1365ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop; 1366cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathAftermath what_next = (deref_pointer ? ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); 1367bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata ValueObjectSP item = valobj->GetValueForExpressionPath (ptr_deref_buffer.c_str(), 1368ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &first_unparsed, 1369ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &reason_to_stop, 1370ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &final_value_type, 1371ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1372ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &what_next); 1373ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!item) 1374ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1375de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 13767b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ExpandIndexedExpression] ERROR: unparsed portion = %s, why stopping = %d," 1377de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1378ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 13799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1380ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1381ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1382de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 13837b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[ExpandIndexedExpression] ALL RIGHT: unparsed portion = %s, why stopping = %d," 1384de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1385ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1386ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 13879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata return item; 13889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata} 13899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 13904b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartainstatic inline bool 13914b93aee16f3a81aaf18114c88cc52482262035f3Michael SartainIsToken(const char *var_name_begin, const char *var) 13924b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain{ 13934b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain return (::strncmp (var_name_begin, var, strlen(var)) == 0); 13944b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain} 13954b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain 13964b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartainstatic bool 13974b93aee16f3a81aaf18114c88cc52482262035f3Michael SartainIsTokenWithFormat(const char *var_name_begin, const char *var, std::string &format, const char *default_format, 13984b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr) 13994b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain{ 14004b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain int var_len = strlen(var); 14014b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (::strncmp (var_name_begin, var, var_len) == 0) 14024b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 14034b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain var_name_begin += var_len; 14044b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (*var_name_begin == '}') 14054b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 14064b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain format = default_format; 14074b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain return true; 14084b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 14094b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (*var_name_begin == '%') 14104b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 14114b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain // Allow format specifiers: x|X|u with optional width specifiers. 14124b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain // ${thread.id%x} ; hex 14134b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain // ${thread.id%X} ; uppercase hex 14144b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain // ${thread.id%u} ; unsigned decimal 14154b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain // ${thread.id%8.8X} ; width.precision + specifier 14164b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain // ${thread.id%tid} ; unsigned on FreeBSD/Linux, otherwise default_format (0x%4.4x for thread.id) 14174b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain int dot_count = 0; 14184b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain const char *specifier = NULL; 14194b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain int width_precision_length = 0; 14204b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain const char *width_precision = ++var_name_begin; 14214b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain while (isdigit(*var_name_begin) || *var_name_begin == '.') 14224b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 14234b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain dot_count += (*var_name_begin == '.'); 14244b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (dot_count > 1) 14254b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain break; 14264b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain var_name_begin++; 14274b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain width_precision_length++; 14284b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 14294b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain 14304b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "tid}")) 14314b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 14324b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain Target *target = Target::GetTargetFromContexts (exe_ctx_ptr, sc_ptr); 14334b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (target) 14344b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 14354b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain ArchSpec arch (target->GetArchitecture ()); 14364b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain llvm::Triple::OSType ostype = arch.IsValid() ? arch.GetTriple().getOS() : llvm::Triple::UnknownOS; 14374b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if ((ostype == llvm::Triple::FreeBSD) || (ostype == llvm::Triple::Linux)) 14384b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain specifier = PRIu64; 14394b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 14404b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (!specifier) 14414b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 14424b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain format = default_format; 14434b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain return true; 14444b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 14454b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 14464b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "x}")) 14474b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain specifier = PRIx64; 14484b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "X}")) 14494b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain specifier = PRIX64; 14504b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "u}")) 14514b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain specifier = PRIu64; 14524b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain 14534b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (specifier) 14544b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain { 14554b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain format = "%"; 14564b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (width_precision_length) 14574b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain format += std::string(width_precision, width_precision_length); 14584b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain format += specifier; 14594b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain return true; 14604b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 14614b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 14624b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain } 14634b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain return false; 14644b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain} 14654b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain 146617d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartainstatic bool 146717d5a0358d60922707fdab6ec9c3251ca44dd614Michael SartainFormatPromptRecurse 1468d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton( 1469d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *format, 1470d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const SymbolContext *sc, 1471d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const ExecutionContext *exe_ctx, 1472d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const Address *addr, 1473d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Stream &s, 14741391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata const char **end, 1475f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObject* valobj 1476d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton) 1477d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton{ 1478f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata ValueObject* realvalobj = NULL; // makes it super-easy to parse pointers 1479d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool success = true; 1480d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *p; 1481952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 148217d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain 1483d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton for (p = format; *p != '\0'; ++p) 1484d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1485f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (realvalobj) 14861391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1487f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata valobj = realvalobj; 1488f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata realvalobj = NULL; 14891391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 1490d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton size_t non_special_chars = ::strcspn (p, "${}\\"); 1491d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (non_special_chars > 0) 1492d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1493d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (success) 1494d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Write (p, non_special_chars); 1495d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton p += non_special_chars; 1496d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1497d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1498d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p == '\0') 1499d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1500d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1501d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1502d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '{') 1503d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1504d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Start a new scope that must have everything it needs if it is to 1505d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // to make it into the final output stream "s". If you want to make 1506d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // a format that only prints out the function or symbol name if there 1507d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // is one in the symbol context you can use: 1508d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // "{function =${function.name}}" 1509d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // The first '{' starts a new scope that end with the matching '}' at 1510d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // the end of the string. The contents "function =${function.name}" 1511d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // will then be evaluated and only be output if there is a function 1512d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // or symbol with a valid name. 1513d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton StreamString sub_strm; 1514d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1515d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; // Skip the '{' 151617d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain 151717d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain if (FormatPromptRecurse (p, sc, exe_ctx, addr, sub_strm, &p, valobj)) 1518d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1519d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // The stream had all it needed 1520d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Write(sub_strm.GetData(), sub_strm.GetSize()); 1521d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1522d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p != '}') 1523d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1524d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton success = false; 1525d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1526d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1527d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1528d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '}') 1529d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1530d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // End of a enclosing scope 1531d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1532d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1533d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '$') 1534d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1535d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We have a prompt variable to print 1536d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; 1537d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (*p == '{') 1538d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1539d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; 1540d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *var_name_begin = p; 1541d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *var_name_end = ::strchr (p, '}'); 1542d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1543d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_name_end && var_name_begin < var_name_end) 1544d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1545d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // if we have already failed to parse, skip this variable 1546d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (success) 1547d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1548d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton const char *cstr = NULL; 15494b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain std::string token_format; 1550d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Address format_addr; 1551d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool calculate_format_addr_function_offset = false; 1552d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Set reg_kind and reg_num to invalid values 1553d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton RegisterKind reg_kind = kNumRegisterKinds; 1554d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton uint32_t reg_num = LLDB_INVALID_REGNUM; 1555d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton FileSpec format_file_spec; 1556b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info = NULL; 1557d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton RegisterContext *reg_ctx = NULL; 15589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata bool do_deref_pointer = false; 1559cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathScanEndReason reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString; 1560cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ExpressionPathEndResultType final_value_type = ValueObject::eExpressionPathEndResultTypePlain; 1561ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1562d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // Each variable must set success to true below... 1563d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton bool var_success = false; 1564d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton switch (var_name_begin[0]) 1565d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 15661391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata case '*': 15671391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata case 'v': 1568979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata case 's': 15691391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 1570f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (!valobj) 1571979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 1572979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1573afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 15747b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] initial string: %s",var_name_begin); 1575afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1576979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // check for *var and *svar 1577979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin == '*') 1578979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1579979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata do_deref_pointer = true; 1580979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata var_name_begin++; 1581b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata if (log) 1582b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata log->Printf("[Debugger::FormatPrompt] found a deref, new string is: %s",var_name_begin); 1583979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1584afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1585979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin == 's') 1586979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata { 1587dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata if (!valobj->IsSynthetic()) 1588dba1de8d585f27601162f674d30ab71d9c83ccdeEnrico Granata valobj = valobj->GetSyntheticValue().get(); 1589cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (!valobj) 1590cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata break; 1591979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata var_name_begin++; 1592b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata if (log) 1593b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata log->Printf("[Debugger::FormatPrompt] found a synthetic, new string is: %s",var_name_begin); 1594979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata } 1595979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1596979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata // should be a 'v' by now 1597979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata if (*var_name_begin != 'v') 1598979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata break; 1599979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata 1600afb7c85df796f74262917e44dd68f668dade3911Enrico Granata if (log) 1601b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata log->Printf("[Debugger::FormatPrompt] string I am working with: %s",var_name_begin); 1602afb7c85df796f74262917e44dd68f668dade3911Enrico Granata 1603ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::ExpressionPathAftermath what_next = (do_deref_pointer ? 1604cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing); 1605ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ValueObject::GetValueForExpressionPathOptions options; 16069c57fc067307ebb1abe50de6ff704d4b2ae9b9d4Enrico Granata options.DontCheckDotVsArrowSyntax().DoAllowBitfieldSyntax().DoAllowFragileIVar().DoAllowSyntheticChildren(); 1607cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata ValueObject::ValueObjectRepresentationStyle val_obj_display = ValueObject::eValueObjectRepresentationStyleSummary; 1608107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ValueObject* target = NULL; 1609987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton Format custom_format = eFormatInvalid; 1610107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* var_name_final = NULL; 1611107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* var_name_final_if_array_range = NULL; 1612107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* close_bracket_position = NULL; 1613107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton int64_t index_lower = -1; 1614107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton int64_t index_higher = -1; 1615107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton bool is_array_range = false; 1616ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* first_unparsed; 16171c61743af946076e988d88baf725382e99d905deEnrico Granata bool was_plain_var = false; 16181c61743af946076e988d88baf725382e99d905deEnrico Granata bool was_var_format = false; 161907baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata bool was_var_indexed = false; 1620ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1621f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata if (!valobj) break; 1622f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata // simplest case ${var}, just print valobj's value 16234b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "var}")) 1624107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 16251c61743af946076e988d88baf725382e99d905deEnrico Granata was_plain_var = true; 1626f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj; 1627cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1628107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 16294b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin,"var%")) 1630107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 16311c61743af946076e988d88baf725382e99d905deEnrico Granata was_var_format = true; 1632107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this is a variable with some custom format applied to it 1633107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* percent_position; 1634f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata target = valobj; 1635cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 1636107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanFormatDescriptor (var_name_begin, 1637107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1638107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final, 1639107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &percent_position, 1640107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &custom_format, 1641107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &val_obj_display); 1642107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1643107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this is ${var.something} or multiple .something nested 16444b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "var")) 16451391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata { 16464b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "var[")) 164707baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata was_var_indexed = true; 1648107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* percent_position; 1649107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanFormatDescriptor (var_name_begin, 1650107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1651107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final, 1652107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &percent_position, 1653107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &custom_format, 1654107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &val_obj_display); 1655107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1656107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* open_bracket_position; 1657107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton const char* separator_position; 1658107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton ScanBracketedRange (var_name_begin, 1659107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_end, 1660107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_name_final, 1661107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &open_bracket_position, 1662107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &separator_position, 1663107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &close_bracket_position, 1664107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &var_name_final_if_array_range, 1665107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &index_lower, 1666107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton &index_higher); 1667107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1668107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton Error error; 1669bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata 1670bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata std::string expr_path(var_name_final-var_name_begin-1,0); 1671bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata memcpy(&expr_path[0], var_name_begin+3,var_name_final-var_name_begin-3); 1672bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata 1673de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 1674bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata log->Printf("[Debugger::FormatPrompt] symbol to expand: %s",expr_path.c_str()); 1675ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1676bee6cf7b4ee68d3ba0e72110cdd818ab55ab0b3fEnrico Granata target = valobj->GetValueForExpressionPath(expr_path.c_str(), 1677ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &first_unparsed, 1678ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &reason_to_stop, 1679ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &final_value_type, 1680ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata options, 1681ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata &what_next).get(); 1682ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1683ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!target) 1684107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1685de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16867b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ERROR: unparsed portion = %s, why stopping = %d," 1687de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1688ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1689ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata break; 16909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 1691ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1692ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1693de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 16947b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ALL RIGHT: unparsed portion = %s, why stopping = %d," 1695de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata " final_value_type %d", 1696ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata first_unparsed, reason_to_stop, final_value_type); 1697ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1698107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1699107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 17009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata break; 1701ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1702cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata is_array_range = (final_value_type == ValueObject::eExpressionPathEndResultTypeBoundedRange || 1703cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata final_value_type == ValueObject::eExpressionPathEndResultTypeUnboundedRange); 1704ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1705cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata do_deref_pointer = (what_next == ValueObject::eExpressionPathAftermathDereference); 1706107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 170713cb5406e7f013ca7c15b370ec2fa72f9a911ab5Enrico Granata if (do_deref_pointer && !is_array_range) 17089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata { 1709107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // I have not deref-ed yet, let's do it 1710107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // this happens when we are not going through GetValueForVariableExpressionPath 1711107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // to get to the target ValueObject 1712107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton Error error; 1713107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton target = target->Dereference(error).get(); 17142c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata if (error.Fail()) 17152c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata { 17162c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata if (log) 17177b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] ERROR: %s\n", error.AsCString("unknown")); \ 17182c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata break; 17192c6a3d80dab3cf50c26fefe037357a4e6e621258Enrico Granata } 1720107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton do_deref_pointer = false; 17219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 172286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 172307baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // <rdar://problem/11338654> 172407baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // we do not want to use the summary for a bitfield of type T:n 172507baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // if we were originally dealing with just a T - that would get 172607baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // us into an endless recursion 172707baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (target->IsBitfield() && was_var_indexed) 172807baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata { 172907baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata // TODO: check for a (T:n)-specific summary - we should still obey that 173007baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata StreamString bitfield_name; 173107baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata bitfield_name.Printf("%s:%d", target->GetTypeName().AsCString(), target->GetBitfieldBitSize()); 173207baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata lldb::TypeNameSpecifierImplSP type_sp(new TypeNameSpecifierImpl(bitfield_name.GetData(),false)); 173307baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata if (!DataVisualization::GetSummaryForType(type_sp)) 173407baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata val_obj_display = ValueObject::eValueObjectRepresentationStyleValue; 173507baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata } 173607baf83fe7ae25ac87d38cd4fc19647b020adfadEnrico Granata 17371c61743af946076e988d88baf725382e99d905deEnrico Granata // TODO use flags for these 173852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint32_t type_info_flags = target->GetClangType().GetTypeInfo(NULL); 173952f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_array = (type_info_flags & ClangASTType::eTypeIsArray) != 0; 174052f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_pointer = (type_info_flags & ClangASTType::eTypeIsPointer) != 0; 174152f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_aggregate = target->GetClangType().IsAggregateType(); 174286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata 1743cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if ((is_array || is_pointer) && (!is_array_range) && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue) // this should be wrong, but there are some exceptions 174486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata { 17451c61743af946076e988d88baf725382e99d905deEnrico Granata StreamString str_temp; 1746de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 17477b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] I am into array || pointer && !range"); 17486f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 1749c2676e8ca4a654fd167f00163d013a4e71eeaba2Greg Clayton if (target->HasSpecialPrintableRepresentation(val_obj_display, custom_format)) 17501c61743af946076e988d88baf725382e99d905deEnrico Granata { 17516f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // try to use the special cases 17526f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = target->DumpPrintableRepresentation(str_temp, 17536f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata val_obj_display, 17546f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata custom_format); 17556f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (log) 17567b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] special cases did%s match", var_success ? "" : "n't"); 17576f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 17586f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // should not happen 1759c2676e8ca4a654fd167f00163d013a4e71eeaba2Greg Clayton if (var_success) 17606f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << str_temp.GetData(); 17611c61743af946076e988d88baf725382e99d905deEnrico Granata var_success = true; 17626f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata break; 17631c61743af946076e988d88baf725382e99d905deEnrico Granata } 17641c61743af946076e988d88baf725382e99d905deEnrico Granata else 17656f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 1766ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata if (was_plain_var) // if ${var} 17676f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 17686f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 17696f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 1770ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata else if (is_pointer) // if pointer, value is the address stored 1771ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata { 17724a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton target->DumpPrintableRepresentation (s, 17734a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton val_obj_display, 17744a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton custom_format, 17754a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton ValueObject::ePrintableRepresentationSpecialCasesDisable); 1776ef1923d722126810ef879edb959eed8c85a0742fEnrico Granata } 17776f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = true; 17786f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata break; 17796f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 17806f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata } 17816f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata 17826f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // if directly trying to print ${var}, and this is an aggregate, display a nice 17836f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // type @ location message 17846f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata if (is_aggregate && was_plain_var) 17856f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata { 17866f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata s << target->GetTypeName() << " @ " << target->GetLocationAsCString(); 17876f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata var_success = true; 17881c61743af946076e988d88baf725382e99d905deEnrico Granata break; 17891c61743af946076e988d88baf725382e99d905deEnrico Granata } 17901c61743af946076e988d88baf725382e99d905deEnrico Granata 17916f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata // if directly trying to print ${var%V}, and this is an aggregate, do not let the user do it 1792cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata if (is_aggregate && ((was_var_format && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue))) 17931c61743af946076e988d88baf725382e99d905deEnrico Granata { 17941c61743af946076e988d88baf725382e99d905deEnrico Granata s << "<invalid use of aggregate type>"; 17951c61743af946076e988d88baf725382e99d905deEnrico Granata var_success = true; 179686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata break; 179786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata } 1798107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1799107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!is_array_range) 1800de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1801de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 18027b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] dumping ordinary printable output"); 1803107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success = target->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1804de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata } 1805107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 1806de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata { 1807de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 18087b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] checking if I can handle as array"); 1809107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!is_array && !is_pointer) 1810107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton break; 1811de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 18127b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] handle as array"); 1813ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata const char* special_directions = NULL; 1814ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata StreamString special_directions_writer; 1815107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (close_bracket_position && (var_name_end-close_bracket_position > 1)) 1816107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1817ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata ConstString additional_data; 1818ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata additional_data.SetCStringWithLength(close_bracket_position+1, var_name_end-close_bracket_position-1); 1819ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata special_directions_writer.Printf("${%svar%s}", 1820ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata do_deref_pointer ? "*" : "", 1821ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata additional_data.GetCString()); 1822ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata special_directions = special_directions_writer.GetData(); 1823107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 18249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata 1825107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton // let us display items index_lower thru index_higher of this array 1826107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar('['); 1827107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success = true; 1828107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1829107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (index_higher < 0) 1830f501c5913d5daaf45a906477bdf466bb74ed10fbEnrico Granata index_higher = valobj->GetNumChildren() - 1; 1831107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1832b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton uint32_t max_num_children = target->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); 1833018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 1834107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton for (;index_lower<=index_higher;index_lower++) 1835107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton { 1836567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObject* item = ExpandIndexedExpression (target, 1837567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton index_lower, 1838567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton exe_ctx->GetFramePtr(), 1839567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton false).get(); 1840107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1841ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata if (!item) 1842ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1843de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 18445f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("[Debugger::FormatPrompt] ERROR in getting child item at index %" PRId64, index_lower); 1845ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1846ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata else 1847ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata { 1848de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata if (log) 18497b6950331083ad156a433bdcc0a6d015e1491714Enrico Granata log->Printf("[Debugger::FormatPrompt] special_directions for child item: %s",special_directions); 1850ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata } 1851ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata 1852107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (!special_directions) 1853107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton var_success &= item->DumpPrintableRepresentation(s,val_obj_display, custom_format); 1854107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton else 185517d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain var_success &= FormatPromptRecurse(special_directions, sc, exe_ctx, addr, s, NULL, item); 1856107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton 1857018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata if (--max_num_children == 0) 1858018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata { 1859018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata s.PutCString(", ..."); 1860018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata break; 1861018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata } 1862018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata 1863107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (index_lower < index_higher) 1864107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar(','); 1865107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton } 1866107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton s.PutChar(']'); 18679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata } 18681391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata } 18699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata break; 1870d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'a': 18714b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "addr}")) 1872d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1873d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (addr && addr->IsValid()) 1874d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1875d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 1876d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = *addr; 1877d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1878d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1879d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1880d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1881d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'p': 18824b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "process.")) 1883d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1884567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1885d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1886567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 1887567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 1888d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1889567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("process."); 18904b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsTokenWithFormat (var_name_begin, "id", token_format, "%" PRIu64, exe_ctx, sc)) 1891d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 18924b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain s.Printf(token_format.c_str(), process->GetID()); 1893567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1894567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 18954b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if ((IsToken (var_name_begin, "name}")) || 18964b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain (IsToken (var_name_begin, "file.basename}")) || 18974b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain (IsToken (var_name_begin, "file.fullpath}"))) 1898567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1899567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Module *exe_module = process->GetTarget().GetExecutableModulePointer(); 1900567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_module) 1901d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1902567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f') 1903567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1904567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename(); 1905567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = format_file_spec; 1906567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1907567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else 1908567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1909567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_file_spec = exe_module->GetFileSpec(); 1910567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = format_file_spec; 1911567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1912d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1913d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 19144b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "script:")) 1915001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata { 1916001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata var_name_begin += ::strlen("script:"); 1917001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata std::string script_name(var_name_begin,var_name_end); 1918001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata ScriptInterpreter* script_interpreter = process->GetTarget().GetDebugger().GetCommandInterpreter().GetScriptInterpreter(); 19194b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (RunScriptFormatKeyword (s, script_interpreter, process, script_name)) 19204b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain var_success = true; 1921001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata } 1922d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1923567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1924d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1925d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 1926d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 1927d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 't': 19284b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "thread.")) 1929d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1930567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 1931d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Thread *thread = exe_ctx->GetThreadPtr(); 1933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (thread) 1934d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 1935567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("thread."); 19364b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsTokenWithFormat (var_name_begin, "id", token_format, "0x%4.4" PRIx64, exe_ctx, sc)) 1937d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 19384b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain s.Printf(token_format.c_str(), thread->GetID()); 1939567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1940567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 19414b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsTokenWithFormat (var_name_begin, "protocol_id", token_format, "0x%4.4" PRIx64, exe_ctx, sc)) 1942a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton { 19434b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain s.Printf(token_format.c_str(), thread->GetProtocolID()); 1944a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton var_success = true; 1945a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton } 19464b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsTokenWithFormat (var_name_begin, "index", token_format, "%" PRIu64, exe_ctx, sc)) 1947567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 19484b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain s.Printf(token_format.c_str(), (uint64_t)thread->GetIndexID()); 1949567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1950567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 19514b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "name}")) 1952567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1953567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = thread->GetName(); 1954567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = cstr && cstr[0]; 1955567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_success) 1956d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutCString(cstr); 1957567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 19584b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "queue}")) 1959567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1960567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = thread->GetQueueName(); 1961567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = cstr && cstr[0]; 1962567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_success) 1963567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.PutCString(cstr); 1964567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 19654b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "stop-reason}")) 1966567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1967567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo (); 19686bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham if (stop_info_sp && stop_info_sp->IsValid()) 1969567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1970567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr = stop_info_sp->GetDescription(); 1971567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (cstr && cstr[0]) 1972567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 1973567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.PutCString(cstr); 1974567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 1975567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 1976d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 1977d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 19784b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "return-value}")) 19791586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 19801586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham StopInfoSP stop_info_sp = thread->GetStopInfo (); 19816bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham if (stop_info_sp && stop_info_sp->IsValid()) 19821586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 19831586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham ValueObjectSP return_valobj_sp = StopInfo::GetReturnValueObject (stop_info_sp); 19841586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham if (return_valobj_sp) 19851586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 1986c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata ValueObject::DumpValueObject (s, return_valobj_sp.get()); 1987016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham var_success = true; 19881586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 19891586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 19901586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 19914b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "script:")) 1992001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata { 1993001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata var_name_begin += ::strlen("script:"); 1994001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata std::string script_name(var_name_begin,var_name_end); 1995001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata ScriptInterpreter* script_interpreter = thread->GetProcess()->GetTarget().GetDebugger().GetCommandInterpreter().GetScriptInterpreter(); 19964b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (RunScriptFormatKeyword (s, script_interpreter, thread, script_name)) 19974b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain var_success = true; 1998001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata } 1999d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2000d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2001d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 20024b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "target.")) 2003d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 200473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton // TODO: hookup properties 200573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (!target_properties_sp) 200673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 200773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 200873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (target) 200973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// target_properties_sp = target->GetProperties(); 201073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 201173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// 201273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (target_properties_sp) 201373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 201473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// var_name_begin += ::strlen ("target."); 201573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// const char *end_property = strchr(var_name_begin, '}'); 201673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (end_property) 201773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 201873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// ConstString property_name(var_name_begin, end_property - var_name_begin); 201973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// std::string property_value (target_properties_sp->GetPropertyValue(property_name)); 202073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// if (!property_value.empty()) 202173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// { 202273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// s.PutCString (property_value.c_str()); 202373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// var_success = true; 202473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 202573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 202673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// } 2027a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2028a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (target) 2029d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2030d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("target."); 20314b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "arch}")) 2032d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2033d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ArchSpec arch (target->GetArchitecture ()); 2034d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (arch.IsValid()) 2035d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2036940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton s.PutCString (arch.GetArchitectureName()); 2037d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2038d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2039d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 20404b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "script:")) 2041001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata { 2042001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata var_name_begin += ::strlen("script:"); 2043001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata std::string script_name(var_name_begin,var_name_end); 2044001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata ScriptInterpreter* script_interpreter = target->GetDebugger().GetCommandInterpreter().GetScriptInterpreter(); 20454b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (RunScriptFormatKeyword (s, script_interpreter, target, script_name)) 20464b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain var_success = true; 2047001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata } 204873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 2049d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2050d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2051d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2052d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2053d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'm': 20544b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "module.")) 2055d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2056a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc && sc->module_sp.get()) 2057d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2058a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Module *module = sc->module_sp.get(); 2059d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("module."); 2060d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 20614b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "file.")) 2062d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2063d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (module->GetFileSpec()) 2064d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2065d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2066d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 20674b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "basename}")) 2068d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2069d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = module->GetFileSpec().GetFilename(); 2070d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2071d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 20724b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "fullpath}")) 2073d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2074d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = module->GetFileSpec(); 2075d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2076d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2077d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2078d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2079d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2080d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2081d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2082d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2083d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2084d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'f': 20854b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "file.")) 2086d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2087d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && sc->comp_unit != NULL) 2088d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2089d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2090d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 20914b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "basename}")) 2092d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2093d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = sc->comp_unit->GetFilename(); 2094d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2095d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 20964b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "fullpath}")) 2097d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2098d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = *sc->comp_unit; 2099d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2100d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2101d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2102d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 21034b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "frame.")) 2104d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2105567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 2106d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2107567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2108567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame) 2109d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2110567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("frame."); 21114b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "index}")) 2112567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2113567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s.Printf("%u", frame->GetFrameIndex()); 2114567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2115567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 21164b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "pc}")) 2117567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2118567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2119567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_PC; 2120567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2121567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 21224b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "sp}")) 2123567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2124567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2125567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_SP; 2126567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2127567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 21284b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "fp}")) 2129567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2130567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2131567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FP; 2132567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2133567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 21344b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "flags}")) 2135567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2136567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_kind = eRegisterKindGeneric; 2137567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_num = LLDB_REGNUM_GENERIC_FLAGS; 2138567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2139567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 21404b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "reg.")) 2141d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2142567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 2143567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (reg_ctx) 2144d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2145567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_name_begin += ::strlen ("reg."); 2146567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (var_name_begin < var_name_end) 2147567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 2148567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton std::string reg_name (var_name_begin, var_name_end); 2149567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str()); 2150567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (reg_info) 2151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = true; 2152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 2153d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2154d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 21554b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "script:")) 2156001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata { 2157001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata var_name_begin += ::strlen("script:"); 2158001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata std::string script_name(var_name_begin,var_name_end); 2159001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata ScriptInterpreter* script_interpreter = frame->GetThread()->GetProcess()->GetTarget().GetDebugger().GetCommandInterpreter().GetScriptInterpreter(); 21604b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (RunScriptFormatKeyword (s, script_interpreter, frame, script_name)) 21614b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain var_success = true; 2162001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata } 2163d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2164d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2165d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 21664b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "function.")) 2167d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2168d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && (sc->function != NULL || sc->symbol != NULL)) 2169d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2170d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("function."); 21714b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "id}")) 2172d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2173d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc->function) 21745f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("function{0x%8.8" PRIx64 "}", sc->function->GetID()); 2175d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2176d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.Printf("symbol[%u]", sc->symbol->GetID()); 2177d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2178d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2179d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 21804b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "name}")) 2181d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2182d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc->function) 2183d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton cstr = sc->function->GetName().AsCString (NULL); 2184d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (sc->symbol) 2185d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 2186d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (cstr) 2187d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2188d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutCString(cstr); 2189b7af177d19c625088864845c89c16465c424df5aGreg Clayton 2190b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (sc->block) 2191b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2192b7af177d19c625088864845c89c16465c424df5aGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2193b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_block) 2194b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2195b7af177d19c625088864845c89c16465c424df5aGreg Clayton const InlineFunctionInfo *inline_info = sc->block->GetInlinedFunctionInfo(); 2196b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_info) 2197b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2198b7af177d19c625088864845c89c16465c424df5aGreg Clayton s.PutCString(" [inlined] "); 2199b7af177d19c625088864845c89c16465c424df5aGreg Clayton inline_info->GetName().Dump(&s); 2200b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2201b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2202b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2203d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 2204d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2205d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 22064b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "name-with-args}")) 2207f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2208f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton // Print the function name with arguments in it 2209f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2210f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (sc->function) 2211f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2212f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton var_success = true; 2213f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton ExecutionContextScope *exe_scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL; 2214f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = sc->function->GetName().AsCString (NULL); 2215f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (cstr) 2216f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2217f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const InlineFunctionInfo *inline_info = NULL; 2218f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableListSP variable_list_sp; 2219f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton bool get_function_vars = true; 2220f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (sc->block) 2221f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2222f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2223f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2224f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_block) 2225f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2226f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton get_function_vars = false; 2227f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton inline_info = sc->block->GetInlinedFunctionInfo(); 2228f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_info) 2229f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton variable_list_sp = inline_block->GetBlockVariableList (true); 2230f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2231f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2232f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2233f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (get_function_vars) 2234f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2235f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton variable_list_sp = sc->function->GetBlock(true).GetBlockVariableList (true); 2236f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2237f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2238f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (inline_info) 2239f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2240f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (cstr); 2241f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (" [inlined] "); 2242f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = inline_info->GetName().GetCString(); 2243f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2244f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2245f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableList args; 2246f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (variable_list_sp) 2247994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument, args); 2248f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (args.GetSize() > 0) 2249f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2250f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *open_paren = strchr (cstr, '('); 2251f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *close_paren = NULL; 2252f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (open_paren) 22532938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton { 22544b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (open_paren, "(anonymous namespace)")) 22552938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton { 22562938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton open_paren = strchr (open_paren + strlen("(anonymous namespace)"), '('); 22572938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton if (open_paren) 22582938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton close_paren = strchr (open_paren, ')'); 22592938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton } 22602938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton else 22612938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton close_paren = strchr (open_paren, ')'); 22622938217a06aa2d741488ff36902ea3f0b9a24f15Greg Clayton } 2263f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2264f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (open_paren) 2265f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.Write(cstr, open_paren - cstr + 1); 2266f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2267f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2268f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (cstr); 2269f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutChar ('('); 2270f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2271c43e7b88339a0267220c56b7207955d035fea4cbGreg Clayton const size_t num_args = args.GetSize(); 2272f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton for (size_t arg_idx = 0; arg_idx < num_args; ++arg_idx) 2273f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2274f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton VariableSP var_sp (args.GetVariableAtIndex (arg_idx)); 2275f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton ValueObjectSP var_value_sp (ValueObjectVariable::Create (exe_scope, var_sp)); 2276f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *var_name = var_value_sp->GetName().GetCString(); 2277f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton const char *var_value = var_value_sp->GetValueAsCString(); 22788e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton if (arg_idx > 0) 22798e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton s.PutCString (", "); 2280f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (var_value_sp->GetError().Success()) 2281994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata { 2282994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata if (var_value) 2283994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata s.Printf ("%s=%s", var_name, var_value); 2284994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata else 2285994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata s.Printf ("%s=%s at %s", var_name, var_value_sp->GetTypeName().GetCString(), var_value_sp->GetLocationAsCString()); 2286994b86bcbf78930c309ec0e38f2d980e8c338c04Enrico Granata } 22878e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton else 22888e6ee9c69292d7f3987a9c0586f2229bb9cd085bGreg Clayton s.Printf ("%s=<unavailable>", var_name); 2289f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2290f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2291f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (close_paren) 2292f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString (close_paren); 2293f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2294f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutChar(')'); 2295f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton 2296f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2297f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else 2298f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2299f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString(cstr); 2300f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2301f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2302f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2303f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton else if (sc->symbol) 2304f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2305f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton cstr = sc->symbol->GetName().AsCString (NULL); 2306f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton if (cstr) 2307f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton { 2308f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton s.PutCString(cstr); 2309f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton var_success = true; 2310f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2311f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 2312f9971c43929cf5edfac024f2b0036e75ede678a7Greg Clayton } 23134b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "addr-offset}")) 2314d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2315d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = addr != NULL; 2316d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2317d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2318d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = *addr; 2319d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2320d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2321d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 23224b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "line-offset}")) 2323d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2324d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = sc->line_entry.range.GetBaseAddress().IsValid(); 2325d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2326d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2327d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 2328d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2329d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2330d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 23314b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "pc-offset}")) 2332d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2333567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2334567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton var_success = frame != NULL; 2335d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2336d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2337567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_addr = frame->GetFrameCodeAddress(); 2338d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton calculate_format_addr_function_offset = true; 2339d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2340d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2341d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2342d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2343d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2344d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2345d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'l': 23464b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "line.")) 2347d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2348d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (sc && sc->line_entry.IsValid()) 2349d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2350d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("line."); 23514b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "file.")) 2352d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2353d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_name_begin += ::strlen ("file."); 2354d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 23554b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain if (IsToken (var_name_begin, "basename}")) 2356d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2357d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec.GetFilename() = sc->line_entry.file.GetFilename(); 2358d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2359d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 23604b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsToken (var_name_begin, "fullpath}")) 2361d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2362d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_file_spec = sc->line_entry.file; 2363d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = format_file_spec; 2364d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2365d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 23664b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if (IsTokenWithFormat (var_name_begin, "number", token_format, "%" PRIu64, exe_ctx, sc)) 2367d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2368d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = true; 23694b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain s.Printf(token_format.c_str(), (uint64_t)sc->line_entry.line); 2370d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 23714b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain else if ((IsToken (var_name_begin, "start-addr}")) || 23724b93aee16f3a81aaf18114c88cc52482262035f3Michael Sartain (IsToken (var_name_begin, "end-addr}"))) 2373d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2374d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = sc && sc->line_entry.range.GetBaseAddress().IsValid(); 2375d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2376d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2377d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr = sc->line_entry.range.GetBaseAddress(); 2378d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_name_begin[0] == 'e') 2379d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton format_addr.Slide (sc->line_entry.range.GetByteSize()); 2380d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2381d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2382d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2383d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2384d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2385d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2386d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2387d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success) 2388d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2389d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // If format addr is valid, then we need to print an address 2390d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_num != LLDB_INVALID_REGNUM) 2391d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2392567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 2393d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We have a register value to display... 2394d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_num == LLDB_REGNUM_GENERIC_PC && reg_kind == eRegisterKindGeneric) 2395d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2396567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton format_addr = frame->GetFrameCodeAddress(); 2397d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2398d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2399d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2400d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_ctx == NULL) 2401567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton reg_ctx = frame->GetRegisterContext().get(); 2402d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2403d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_ctx) 2404d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2405d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_kind != kNumRegisterKinds) 2406d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(reg_kind, reg_num); 2407d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_num); 2408d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton var_success = reg_info != NULL; 2409d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2410d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2411d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2412d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2413d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (reg_info != NULL) 2414d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2415061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 2416061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton var_success = reg_ctx->ReadRegister (reg_info, reg_value); 2417061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (var_success) 2418d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2419997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton reg_value.Dump(&s, reg_info, false, false, eFormatDefault); 2420d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2421d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2422d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2423d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (format_file_spec) 2424d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2425d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s << format_file_spec; 2426d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2427d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2428d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // If format addr is valid, then we need to print an address 2429d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (format_addr.IsValid()) 2430d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2431a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = false; 2432a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2433d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (calculate_format_addr_function_offset) 2434d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2435d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton Address func_addr; 2436d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2437a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc) 2438a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2439a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (sc->function) 2440b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2441a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton func_addr = sc->function->GetAddressRange().GetBaseAddress(); 2442b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (sc->block) 2443b7af177d19c625088864845c89c16465c424df5aGreg Clayton { 2444b7af177d19c625088864845c89c16465c424df5aGreg Clayton // Check to make sure we aren't in an inline 2445b7af177d19c625088864845c89c16465c424df5aGreg Clayton // function. If we are, use the inline block 2446b7af177d19c625088864845c89c16465c424df5aGreg Clayton // range that contains "format_addr" since 2447b7af177d19c625088864845c89c16465c424df5aGreg Clayton // blocks can be discontiguous. 2448b7af177d19c625088864845c89c16465c424df5aGreg Clayton Block *inline_block = sc->block->GetContainingInlinedBlock (); 2449b7af177d19c625088864845c89c16465c424df5aGreg Clayton AddressRange inline_range; 2450b7af177d19c625088864845c89c16465c424df5aGreg Clayton if (inline_block && inline_block->GetRangeContainingAddress (format_addr, inline_range)) 2451b7af177d19c625088864845c89c16465c424df5aGreg Clayton func_addr = inline_range.GetBaseAddress(); 2452b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 2453b7af177d19c625088864845c89c16465c424df5aGreg Clayton } 24540c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton else if (sc->symbol && sc->symbol->ValueIsAddress()) 24550c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton func_addr = sc->symbol->GetAddress(); 2456a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2457a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2458a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (func_addr.IsValid()) 2459d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2460d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (func_addr.GetSection() == format_addr.GetSection()) 2461d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2462d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t func_file_addr = func_addr.GetFileAddress(); 2463d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t addr_file_addr = format_addr.GetFileAddress(); 2464d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (addr_file_addr > func_file_addr) 24655f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" + %" PRIu64, addr_file_addr - func_file_addr); 2466d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (addr_file_addr < func_file_addr) 24675f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" - %" PRIu64, func_file_addr - addr_file_addr); 2468a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2469d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2470d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2471a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2472a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2473a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (target) 2474a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2475a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton addr_t func_load_addr = func_addr.GetLoadAddress (target); 2476a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton addr_t addr_load_addr = format_addr.GetLoadAddress (target); 2477a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (addr_load_addr > func_load_addr) 24785f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" + %" PRIu64, addr_load_addr - func_load_addr); 2479a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else if (addr_load_addr < func_load_addr) 24805f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf(" - %" PRIu64, func_load_addr - addr_load_addr); 2481a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2482a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2483a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2484d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2485d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2486d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2487d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2488a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton Target *target = Target::GetTargetFromContexts (exe_ctx, sc); 2489d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton addr_t vaddr = LLDB_INVALID_ADDRESS; 2490a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (exe_ctx && !target->GetSectionLoadList().IsEmpty()) 2491a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton vaddr = format_addr.GetLoadAddress (target); 2492d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (vaddr == LLDB_INVALID_ADDRESS) 2493d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton vaddr = format_addr.GetFileAddress (); 2494d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2495d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (vaddr != LLDB_INVALID_ADDRESS) 2496a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2497395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton int addr_width = target->GetArchitecture().GetAddressByteSize() * 2; 24987fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton if (addr_width == 0) 24997fab17c7489f6990a4af7896b91f58b05a5ca853Greg Clayton addr_width = 16; 25005f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s.Printf("0x%*.*" PRIx64, addr_width, addr_width, vaddr); 2501a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton var_success = true; 2502a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2503d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2504d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2505d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2506d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2507d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (var_success == false) 2508d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton success = false; 2509d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2510d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton p = var_name_end; 2511d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2512d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2513d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2514d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2515d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else 2516d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2517d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // We got a dollar sign with no '{' after it, it must just be a dollar sign 2518d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton s.PutChar(*p); 2519d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2520d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2521d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton else if (*p == '\\') 2522d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2523d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton ++p; // skip the slash 2524d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton switch (*p) 2525d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2526d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'a': s.PutChar ('\a'); break; 2527d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'b': s.PutChar ('\b'); break; 2528d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'f': s.PutChar ('\f'); break; 2529d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'n': s.PutChar ('\n'); break; 2530d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'r': s.PutChar ('\r'); break; 2531d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 't': s.PutChar ('\t'); break; 2532d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'v': s.PutChar ('\v'); break; 2533d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '\'': s.PutChar ('\''); break; 2534d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '\\': s.PutChar ('\\'); break; 2535d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case '0': 2536d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // 1 to 3 octal chars 2537d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2538a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Make a string that can hold onto the initial zero char, 2539a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // up to 3 octal digits, and a terminating NULL. 2540a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char oct_str[5] = { 0, 0, 0, 0, 0 }; 2541a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2542a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton int i; 2543a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton for (i=0; (p[i] >= '0' && p[i] <= '7') && i<4; ++i) 2544a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton oct_str[i] = p[i]; 2545a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2546a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // We don't want to consume the last octal character since 2547a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // the main for loop will do this for us, so we advance p by 2548a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // one less than i (even if i is zero) 2549a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton p += i - 1; 2550a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton unsigned long octal_value = ::strtoul (oct_str, NULL, 8); 2551a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (octal_value <= UINT8_MAX) 2552d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 255336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton s.PutChar((char)octal_value); 2554d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2555d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2556d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2557d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2558d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton case 'x': 2559d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton // hex number in the format 2560a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (isxdigit(p[1])) 2561d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2562a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton ++p; // Skip the 'x' 2563d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2564a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Make a string that can hold onto two hex chars plus a 2565a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // NULL terminator 2566a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton char hex_str[3] = { 0,0,0 }; 2567a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton hex_str[0] = *p; 2568a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (isxdigit(p[1])) 2569d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton { 2570a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton ++p; // Skip the first of the two hex chars 2571a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton hex_str[1] = *p; 2572d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2573a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton 2574a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton unsigned long hex_value = strtoul (hex_str, NULL, 16); 2575a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton if (hex_value <= UINT8_MAX) 257636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton s.PutChar ((char)hex_value); 2577a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton } 2578a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton else 2579a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton { 2580a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s.PutChar('x'); 2581d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2582d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2583d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2584d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton default: 2585a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // Just desensitize any other character by just printing what 2586a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton // came after the '\' 2587a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton s << *p; 2588d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton break; 2589d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2590d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2591d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 2592d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2593d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton } 2594d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton if (end) 2595d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton *end = p; 2596d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton return success; 2597d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton} 2598d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 259917d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartainbool 260017d5a0358d60922707fdab6ec9c3251ca44dd614Michael SartainDebugger::FormatPrompt 260117d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain( 260217d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain const char *format, 260317d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain const SymbolContext *sc, 260417d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain const ExecutionContext *exe_ctx, 260517d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain const Address *addr, 260617d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain Stream &s, 260717d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain ValueObject* valobj 260817d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain) 260917d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain{ 261017d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain bool use_color = exe_ctx ? exe_ctx->GetTargetRef().GetDebugger().GetUseColor() : true; 261117d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain std::string format_str = lldb_utility::ansi::FormatAnsiTerminalCodes (format, use_color); 261217d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain if (format_str.length()) 261317d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain format = format_str.c_str(); 261417d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain return FormatPromptRecurse (format, sc, exe_ctx, addr, s, NULL, valobj); 261517d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain} 261617d5a0358d60922707fdab6ec9c3251ca44dd614Michael Sartain 26176c530f2201be4788dedf3d5970399220fbd50b11Jim Inghamvoid 26186c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::SetLoggingCallback (lldb::LogOutputCallback log_callback, void *baton) 26196c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham{ 2620d8465214c43d29755822670ad21ced2506faae7aJim Ingham // For simplicity's sake, I am not going to deal with how to close down any 2621d8465214c43d29755822670ad21ced2506faae7aJim Ingham // open logging streams, I just redirect everything from here on out to the 2622d8465214c43d29755822670ad21ced2506faae7aJim Ingham // callback. 26236c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_callback_stream_sp.reset (new StreamCallback (log_callback, baton)); 26246c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham} 26256c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26266c530f2201be4788dedf3d5970399220fbd50b11Jim Inghambool 26276c530f2201be4788dedf3d5970399220fbd50b11Jim InghamDebugger::EnableLog (const char *channel, const char **categories, const char *log_file, uint32_t log_options, Stream &error_stream) 26286c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham{ 26296c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham Log::Callbacks log_callbacks; 26306c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26316c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham StreamSP log_stream_sp; 2632b386d82334b65fb984348f2027b1cb7714de993fSean Callanan if (m_log_callback_stream_sp) 26336c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26346c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp = m_log_callback_stream_sp; 26356c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham // For now when using the callback mode you always get thread & timestamp. 26366c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_THREAD_NAME; 26376c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26386c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else if (log_file == NULL || *log_file == '\0') 26396c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26406c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp.reset(new StreamFile(GetOutputFile().GetDescriptor(), false)); 26416c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26426c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26436c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26446c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham LogStreamMap::iterator pos = m_log_streams.find(log_file); 26452fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton if (pos != m_log_streams.end()) 26462fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton log_stream_sp = pos->second.lock(); 26472fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton if (!log_stream_sp) 26486c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26496c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_stream_sp.reset (new StreamFile (log_file)); 26506c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham m_log_streams[log_file] = log_stream_sp; 26516c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26526c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26536c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham assert (log_stream_sp.get()); 26546c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26556c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_options == 0) 26566c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 26576c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 26580e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton if (Log::GetLogChannelCallbacks (ConstString(channel), log_callbacks)) 26596c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26606c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham log_callbacks.enable (log_stream_sp, log_options, categories, &error_stream); 26616c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return true; 26626c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26636c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26646c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26656c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham LogChannelSP log_channel_sp (LogChannel::FindPlugin (channel)); 26666c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_channel_sp) 26676c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26686c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham if (log_channel_sp->Enable (log_stream_sp, log_options, &error_stream, categories)) 26696c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26706c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return true; 26716c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26726c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26736c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26746c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham error_stream.Printf ("Invalid log channel '%s'.\n", channel); 26756c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26766c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26776c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26786c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham else 26796c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham { 26806c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham error_stream.Printf ("Invalid log channel '%s'.\n", channel); 26816c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26826c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26836c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham } 26846c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham return false; 26856c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham} 26866c530f2201be4788dedf3d5970399220fbd50b11Jim Ingham 2687535f53c8795b3592ce835804af5cef89be39ceeaGreg ClaytonSourceManager & 2688535f53c8795b3592ce835804af5cef89be39ceeaGreg ClaytonDebugger::GetSourceManager () 2689535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton{ 2690535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton if (m_source_manager_ap.get() == NULL) 2691535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton m_source_manager_ap.reset (new SourceManager (shared_from_this())); 2692535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton return *m_source_manager_ap; 2693535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton} 2694535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton 2695535f53c8795b3592ce835804af5cef89be39ceeaGreg Clayton 2696