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