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