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