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