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