TypeSummary.cpp revision f509c5ec066599a3399fced39ea36996184939e8
1f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===-- TypeSummary.cpp ----------------------------------------*- C++ -*-===// 2f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// 3f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// The LLVM Compiler Infrastructure 4f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// 5f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// This file is distributed under the University of Illinois Open Source 6f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// License. See LICENSE.TXT for details. 7f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// 8f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===----------------------------------------------------------------------===// 9f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 10f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C Includes 11f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 12f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C++ Includes 13f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 14f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Other libraries and framework includes 15f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 16f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Project includes 17f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/lldb-public.h" 18f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/lldb-enumerations.h" 19f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 20f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Core/Debugger.h" 21f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Core/StreamString.h" 22f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Core/Timer.h" 23f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/TypeSummary.h" 24f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Interpreter/CommandInterpreter.h" 25f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Symbol/ClangASTType.h" 26f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Target/StackFrame.h" 27f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/Target/Target.h" 28f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 29f509c5ec066599a3399fced39ea36996184939e8Enrico Granatausing namespace lldb; 30f509c5ec066599a3399fced39ea36996184939e8Enrico Granatausing namespace lldb_private; 31f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 32f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeSummaryImpl::TypeSummaryImpl (const TypeSummaryImpl::Flags& flags) : 33f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_flags(flags) 34f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 35f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 36f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 37f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 38f509c5ec066599a3399fced39ea36996184939e8Enrico GranataStringSummaryFormat::StringSummaryFormat (const TypeSummaryImpl::Flags& flags, 39f509c5ec066599a3399fced39ea36996184939e8Enrico Granata const char *format_cstr) : 40f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeSummaryImpl(flags), 41f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_format() 42f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 43f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (format_cstr) 44f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_format.assign(format_cstr); 45f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 46f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 47f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool 48f509c5ec066599a3399fced39ea36996184939e8Enrico GranataStringSummaryFormat::FormatObject (ValueObject *valobj, 49f509c5ec066599a3399fced39ea36996184939e8Enrico Granata std::string& retval) 50f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 51f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!valobj) 52f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 53f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign("NULL ValueObject"); 54f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 55f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 56f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 57f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StreamString s; 58f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ExecutionContext exe_ctx (valobj->GetExecutionContextRef()); 59f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SymbolContext sc; 60f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StackFrame *frame = exe_ctx.GetFramePtr(); 61f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (frame) 62f509c5ec066599a3399fced39ea36996184939e8Enrico Granata sc = frame->GetSymbolContext(lldb::eSymbolContextEverything); 63f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 64f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (IsOneliner()) 65f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 66f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ValueObject* object; 67f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 68f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ValueObjectSP synth_valobj = valobj->GetSyntheticValue(); 69f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (synth_valobj) 70f509c5ec066599a3399fced39ea36996184939e8Enrico Granata object = synth_valobj.get(); 71f509c5ec066599a3399fced39ea36996184939e8Enrico Granata else 72f509c5ec066599a3399fced39ea36996184939e8Enrico Granata object = valobj; 73f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 74f509c5ec066599a3399fced39ea36996184939e8Enrico Granata const uint32_t num_children = object->GetNumChildren(); 75f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (num_children) 76f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 77f509c5ec066599a3399fced39ea36996184939e8Enrico Granata s.PutChar('('); 78f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 79f509c5ec066599a3399fced39ea36996184939e8Enrico Granata for (uint32_t idx=0; idx<num_children; ++idx) 80f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 81f509c5ec066599a3399fced39ea36996184939e8Enrico Granata lldb::ValueObjectSP child_sp(object->GetChildAtIndex(idx, true)); 82f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (child_sp.get()) 83f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 84f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (idx) 85f509c5ec066599a3399fced39ea36996184939e8Enrico Granata s.PutCString(", "); 86f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!HideNames()) 87f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 88f509c5ec066599a3399fced39ea36996184939e8Enrico Granata s.PutCString(child_sp.get()->GetName().AsCString()); 89f509c5ec066599a3399fced39ea36996184939e8Enrico Granata s.PutCString(" = "); 90f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 91f509c5ec066599a3399fced39ea36996184939e8Enrico Granata child_sp.get()->DumpPrintableRepresentation(s, 92f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ValueObject::eValueObjectRepresentationStyleSummary, 93f509c5ec066599a3399fced39ea36996184939e8Enrico Granata lldb::eFormatInvalid, 94f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ValueObject::ePrintableRepresentationSpecialCasesDisable); 95f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 96f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 97f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 98f509c5ec066599a3399fced39ea36996184939e8Enrico Granata s.PutChar(')'); 99f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 100f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign(s.GetString()); 101f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return true; 102f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 103f509c5ec066599a3399fced39ea36996184939e8Enrico Granata else 104f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 105f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign("error: oneliner for no children"); 106f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 107f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 108f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 109f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 110f509c5ec066599a3399fced39ea36996184939e8Enrico Granata else 111f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 112f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (Debugger::FormatPrompt(m_format.c_str(), &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, NULL, valobj)) 113f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 114f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign(s.GetString()); 115f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return true; 116f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 117f509c5ec066599a3399fced39ea36996184939e8Enrico Granata else 118f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 119f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign("error: summary string parsing error"); 120f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 121f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 122f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 123f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 124f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 125f509c5ec066599a3399fced39ea36996184939e8Enrico Granatastd::string 126f509c5ec066599a3399fced39ea36996184939e8Enrico GranataStringSummaryFormat::GetDescription () 127f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 128f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StreamString sstr; 129f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 130f509c5ec066599a3399fced39ea36996184939e8Enrico Granata sstr.Printf ("`%s`%s%s%s%s%s%s%s", m_format.c_str(), 131f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Cascades() ? "" : " (not cascading)", 132f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintChildren() ? "" : " (show children)", 133f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintValue() ? " (hide value)" : "", 134f509c5ec066599a3399fced39ea36996184939e8Enrico Granata IsOneliner() ? " (one-line printout)" : "", 135f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsPointers() ? " (skip pointers)" : "", 136f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsReferences() ? " (skip references)" : "", 137f509c5ec066599a3399fced39ea36996184939e8Enrico Granata HideNames() ? " (hide member names)" : ""); 138f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return sstr.GetString(); 139f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 140f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 141f509c5ec066599a3399fced39ea36996184939e8Enrico GranataCXXFunctionSummaryFormat::CXXFunctionSummaryFormat (const TypeSummaryImpl::Flags& flags, 142f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Callback impl, 143f509c5ec066599a3399fced39ea36996184939e8Enrico Granata const char* description) : 144f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeSummaryImpl(flags), 145f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_impl(impl), 146f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_description(description ? description : "") 147f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 148f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 149f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 150f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool 151f509c5ec066599a3399fced39ea36996184939e8Enrico GranataCXXFunctionSummaryFormat::FormatObject (ValueObject *valobj, 152f509c5ec066599a3399fced39ea36996184939e8Enrico Granata std::string& dest) 153f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 154f509c5ec066599a3399fced39ea36996184939e8Enrico Granata dest.clear(); 155f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StreamString stream; 156f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!m_impl || m_impl(*valobj,stream) == false) 157f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 158f509c5ec066599a3399fced39ea36996184939e8Enrico Granata dest.assign(stream.GetData()); 159f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return true; 160f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 161f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 162f509c5ec066599a3399fced39ea36996184939e8Enrico Granatastd::string 163f509c5ec066599a3399fced39ea36996184939e8Enrico GranataCXXFunctionSummaryFormat::GetDescription () 164f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 165f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StreamString sstr; 166f509c5ec066599a3399fced39ea36996184939e8Enrico Granata sstr.Printf ("`%s (%p) `%s%s%s%s%s%s%s", m_description.c_str(),m_impl, 167f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Cascades() ? "" : " (not cascading)", 168f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintChildren() ? "" : " (show children)", 169f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintValue() ? " (hide value)" : "", 170f509c5ec066599a3399fced39ea36996184939e8Enrico Granata IsOneliner() ? " (one-line printout)" : "", 171f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsPointers() ? " (skip pointers)" : "", 172f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsReferences() ? " (skip references)" : "", 173f509c5ec066599a3399fced39ea36996184939e8Enrico Granata HideNames() ? " (hide member names)" : ""); 174f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return sstr.GetString(); 175f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 176f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 177f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifndef LLDB_DISABLE_PYTHON 178f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 179f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 180f509c5ec066599a3399fced39ea36996184939e8Enrico GranataScriptSummaryFormat::ScriptSummaryFormat (const TypeSummaryImpl::Flags& flags, 181f509c5ec066599a3399fced39ea36996184939e8Enrico Granata const char * function_name, 182f509c5ec066599a3399fced39ea36996184939e8Enrico Granata const char * python_script) : 183f509c5ec066599a3399fced39ea36996184939e8Enrico GranataTypeSummaryImpl(flags), 184f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_function_name(), 185f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_python_script(), 186f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_script_function_sp() 187f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 188f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (function_name) 189f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_function_name.assign(function_name); 190f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (python_script) 191f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_python_script.assign(python_script); 192f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 193f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 194f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool 195f509c5ec066599a3399fced39ea36996184939e8Enrico GranataScriptSummaryFormat::FormatObject (ValueObject *valobj, 196f509c5ec066599a3399fced39ea36996184939e8Enrico Granata std::string& retval) 197f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 198f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 199f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 200f509c5ec066599a3399fced39ea36996184939e8Enrico Granata TargetSP target_sp(valobj->GetTargetSP()); 201f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 202f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!target_sp) 203f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 204f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign("error: no target"); 205f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 206f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 207f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 208f509c5ec066599a3399fced39ea36996184939e8Enrico Granata ScriptInterpreter *script_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter(); 209f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 210f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (!script_interpreter) 211f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 212f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval.assign("error: no ScriptInterpreter"); 213f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 214f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 215f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 216f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return script_interpreter->GetScriptedSummary(m_function_name.c_str(), 217f509c5ec066599a3399fced39ea36996184939e8Enrico Granata valobj->GetSP(), 218f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_script_function_sp, 219f509c5ec066599a3399fced39ea36996184939e8Enrico Granata retval); 220f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 221f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 222f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 223f509c5ec066599a3399fced39ea36996184939e8Enrico Granatastd::string 224f509c5ec066599a3399fced39ea36996184939e8Enrico GranataScriptSummaryFormat::GetDescription () 225f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 226f509c5ec066599a3399fced39ea36996184939e8Enrico Granata StreamString sstr; 227f509c5ec066599a3399fced39ea36996184939e8Enrico Granata sstr.Printf ("%s%s%s%s%s%s%s\n%s", Cascades() ? "" : " (not cascading)", 228f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintChildren() ? "" : " (show children)", 229f509c5ec066599a3399fced39ea36996184939e8Enrico Granata !DoesPrintValue() ? " (hide value)" : "", 230f509c5ec066599a3399fced39ea36996184939e8Enrico Granata IsOneliner() ? " (one-line printout)" : "", 231f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsPointers() ? " (skip pointers)" : "", 232f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SkipsReferences() ? " (skip references)" : "", 233f509c5ec066599a3399fced39ea36996184939e8Enrico Granata HideNames() ? " (hide member names)" : "", 234f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_python_script.c_str()); 235f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return sstr.GetString(); 236f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 237f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 238f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 239f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif // #ifndef LLDB_DISABLE_PYTHON 240