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