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 21using namespace lldb; 22using namespace lldb_private; 23using namespace lldb_private::formatters; 24 25void 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 RegularExpression(type_name.GetStringRef()), format_sp); 33 else 34 category_sp->GetTypeFormatsContainer()->Add(std::move(type_name), 35 format_sp); 36} 37 38void 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 RegularExpression(type_name.GetStringRef()), summary_sp); 44 else 45 category_sp->GetTypeSummariesContainer()->Add(std::move(type_name), 46 summary_sp); 47} 48 49void 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 RegularExpression(type_name.GetStringRef()), summary_sp); 57 else 58 category_sp->GetTypeSummariesContainer()->Add(std::move(type_name), 59 summary_sp); 60} 61 62void 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 RegularExpression(type_name.GetStringRef()), summary_sp); 71 else 72 category_sp->GetTypeSummariesContainer()->Add(std::move(type_name), 73 summary_sp); 74} 75 76void lldb_private::formatters::AddCXXSummary( 77 TypeCategoryImpl::SharedPointer category_sp, 78 CXXFunctionSummaryFormat::Callback funct, const char *description, 79 ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) { 80 lldb::TypeSummaryImplSP summary_sp( 81 new CXXFunctionSummaryFormat(flags, funct, description)); 82 if (regex) 83 category_sp->GetRegexTypeSummariesContainer()->Add( 84 RegularExpression(type_name.GetStringRef()), summary_sp); 85 else 86 category_sp->GetTypeSummariesContainer()->Add(std::move(type_name), 87 summary_sp); 88} 89 90void lldb_private::formatters::AddCXXSynthetic( 91 TypeCategoryImpl::SharedPointer category_sp, 92 CXXSyntheticChildren::CreateFrontEndCallback generator, 93 const char *description, ConstString type_name, 94 ScriptedSyntheticChildren::Flags flags, bool regex) { 95 lldb::SyntheticChildrenSP synth_sp( 96 new CXXSyntheticChildren(flags, description, generator)); 97 if (regex) 98 category_sp->GetRegexTypeSyntheticsContainer()->Add( 99 RegularExpression(type_name.GetStringRef()), synth_sp); 100 else 101 category_sp->GetTypeSyntheticsContainer()->Add(std::move(type_name), 102 synth_sp); 103} 104 105void lldb_private::formatters::AddFilter( 106 TypeCategoryImpl::SharedPointer category_sp, 107 std::vector<std::string> children, const char *description, 108 ConstString type_name, ScriptedSyntheticChildren::Flags flags, bool regex) { 109 TypeFilterImplSP filter_sp(new TypeFilterImpl(flags)); 110 for (auto child : children) 111 filter_sp->AddExpressionPath(child); 112 if (regex) 113 category_sp->GetRegexTypeFiltersContainer()->Add( 114 RegularExpression(type_name.GetStringRef()), filter_sp); 115 else 116 category_sp->GetTypeFiltersContainer()->Add(std::move(type_name), 117 filter_sp); 118} 119 120size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name) { 121 if (!item_name || !*item_name) 122 return UINT32_MAX; 123 if (*item_name != '[') 124 return UINT32_MAX; 125 item_name++; 126 char *endptr = nullptr; 127 unsigned long int idx = ::strtoul(item_name, &endptr, 0); 128 if (idx == 0 && endptr == item_name) 129 return UINT32_MAX; 130 if (idx == ULONG_MAX) 131 return UINT32_MAX; 132 return idx; 133} 134 135lldb::addr_t 136lldb_private::formatters::GetArrayAddressOrPointerValue(ValueObject &valobj) { 137 lldb::addr_t data_addr = LLDB_INVALID_ADDRESS; 138 139 if (valobj.IsPointerType()) 140 data_addr = valobj.GetValueAsUnsigned(0); 141 else if (valobj.IsArrayType()) 142 data_addr = valobj.GetAddressOf(); 143 144 return data_addr; 145} 146