1 //===-- FormattersHelpers.cpp -------------------------------------*- C++ 2 //-*-===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is distributed under the University of Illinois Open Source 7 // License. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 // C Includes 12 13 // C++ Includes 14 15 // Other libraries and framework includes 16 17 // Project includes 18 #include "lldb/DataFormatters/FormattersHelpers.h" 19 20 #include "lldb/Core/ConstString.h" 21 #include "lldb/Core/RegularExpression.h" 22 #include "lldb/Target/StackFrame.h" 23 #include "lldb/Target/Target.h" 24 #include "lldb/Target/Thread.h" 25 26 using namespace lldb; 27 using namespace lldb_private; 28 using namespace lldb_private::formatters; 29 30 void lldb_private::formatters::AddFormat( 31 TypeCategoryImpl::SharedPointer category_sp, lldb::Format format, 32 ConstString type_name, TypeFormatImpl::Flags flags, bool regex) { 33 lldb::TypeFormatImplSP format_sp(new TypeFormatImpl_Format(format, flags)); 34 35 if (regex) 36 category_sp->GetRegexTypeFormatsContainer()->Add( 37 RegularExpressionSP(new RegularExpression(type_name.GetStringRef())), 38 format_sp); 39 else 40 category_sp->GetTypeFormatsContainer()->Add(type_name, format_sp); 41 } 42 43 void lldb_private::formatters::AddSummary( 44 TypeCategoryImpl::SharedPointer category_sp, TypeSummaryImplSP summary_sp, 45 ConstString type_name, bool regex) { 46 if (regex) 47 category_sp->GetRegexTypeSummariesContainer()->Add( 48 RegularExpressionSP(new RegularExpression(type_name.GetStringRef())), 49 summary_sp); 50 else 51 category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); 52 } 53 54 void lldb_private::formatters::AddStringSummary( 55 TypeCategoryImpl::SharedPointer category_sp, const char *string, 56 ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) { 57 lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, string)); 58 59 if (regex) 60 category_sp->GetRegexTypeSummariesContainer()->Add( 61 RegularExpressionSP(new RegularExpression(type_name.GetStringRef())), 62 summary_sp); 63 else 64 category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); 65 } 66 67 void lldb_private::formatters::AddOneLineSummary( 68 TypeCategoryImpl::SharedPointer category_sp, ConstString type_name, 69 TypeSummaryImpl::Flags flags, bool regex) { 70 flags.SetShowMembersOneLiner(true); 71 lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, "")); 72 73 if (regex) 74 category_sp->GetRegexTypeSummariesContainer()->Add( 75 RegularExpressionSP(new RegularExpression(type_name.GetStringRef())), 76 summary_sp); 77 else 78 category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); 79 } 80 81 #ifndef LLDB_DISABLE_PYTHON 82 void lldb_private::formatters::AddCXXSummary( 83 TypeCategoryImpl::SharedPointer category_sp, 84 CXXFunctionSummaryFormat::Callback funct, const char *description, 85 ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) { 86 lldb::TypeSummaryImplSP summary_sp( 87 new CXXFunctionSummaryFormat(flags, funct, description)); 88 if (regex) 89 category_sp->GetRegexTypeSummariesContainer()->Add( 90 RegularExpressionSP(new RegularExpression(type_name.GetStringRef())), 91 summary_sp); 92 else 93 category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); 94 } 95 96 void lldb_private::formatters::AddCXXSynthetic( 97 TypeCategoryImpl::SharedPointer category_sp, 98 CXXSyntheticChildren::CreateFrontEndCallback generator, 99 const char *description, ConstString type_name, 100 ScriptedSyntheticChildren::Flags flags, bool regex) { 101 lldb::SyntheticChildrenSP synth_sp( 102 new CXXSyntheticChildren(flags, description, generator)); 103 if (regex) 104 category_sp->GetRegexTypeSyntheticsContainer()->Add( 105 RegularExpressionSP(new RegularExpression(type_name.GetStringRef())), 106 synth_sp); 107 else 108 category_sp->GetTypeSyntheticsContainer()->Add(type_name, synth_sp); 109 } 110 111 void lldb_private::formatters::AddFilter( 112 TypeCategoryImpl::SharedPointer category_sp, 113 std::vector<std::string> children, const char *description, 114 ConstString type_name, ScriptedSyntheticChildren::Flags flags, bool regex) { 115 TypeFilterImplSP filter_sp(new TypeFilterImpl(flags)); 116 for (auto child : children) 117 filter_sp->AddExpressionPath(child); 118 if (regex) 119 category_sp->GetRegexTypeFiltersContainer()->Add( 120 RegularExpressionSP(new RegularExpression(type_name.GetStringRef())), 121 filter_sp); 122 else 123 category_sp->GetTypeFiltersContainer()->Add(type_name, filter_sp); 124 } 125 #endif 126 127 size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name) { 128 if (!item_name || !*item_name) 129 return UINT32_MAX; 130 if (*item_name != '[') 131 return UINT32_MAX; 132 item_name++; 133 char *endptr = NULL; 134 unsigned long int idx = ::strtoul(item_name, &endptr, 0); 135 if (idx == 0 && endptr == item_name) 136 return UINT32_MAX; 137 if (idx == ULONG_MAX) 138 return UINT32_MAX; 139 return idx; 140 } 141 142 lldb::addr_t 143 lldb_private::formatters::GetArrayAddressOrPointerValue(ValueObject &valobj) { 144 lldb::addr_t data_addr = LLDB_INVALID_ADDRESS; 145 146 if (valobj.IsPointerType()) 147 data_addr = valobj.GetValueAsUnsigned(0); 148 else if (valobj.IsArrayType()) 149 data_addr = valobj.GetAddressOf(); 150 151 return data_addr; 152 } 153