1dda28197Spatrick //===-- FormattersHelpers.cpp ---------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick
10061da546Spatrick
11061da546Spatrick
12061da546Spatrick #include "lldb/DataFormatters/FormattersHelpers.h"
13*f6aab3d8Srobert #include "lldb/Core/Module.h"
14061da546Spatrick #include "lldb/Target/StackFrame.h"
15061da546Spatrick #include "lldb/Target/Target.h"
16061da546Spatrick #include "lldb/Target/Thread.h"
17061da546Spatrick #include "lldb/Utility/ConstString.h"
18061da546Spatrick #include "lldb/Utility/RegularExpression.h"
19061da546Spatrick
20061da546Spatrick using namespace lldb;
21061da546Spatrick using namespace lldb_private;
22061da546Spatrick using namespace lldb_private::formatters;
23061da546Spatrick
AddFormat(TypeCategoryImpl::SharedPointer category_sp,lldb::Format format,ConstString type_name,TypeFormatImpl::Flags flags,bool regex)24061da546Spatrick void lldb_private::formatters::AddFormat(
25061da546Spatrick TypeCategoryImpl::SharedPointer category_sp, lldb::Format format,
26061da546Spatrick ConstString type_name, TypeFormatImpl::Flags flags, bool regex) {
27061da546Spatrick lldb::TypeFormatImplSP format_sp(new TypeFormatImpl_Format(format, flags));
28061da546Spatrick
29*f6aab3d8Srobert FormatterMatchType match_type =
30*f6aab3d8Srobert regex ? eFormatterMatchRegex : eFormatterMatchExact;
31*f6aab3d8Srobert category_sp->AddTypeFormat(type_name.GetStringRef(), match_type, format_sp);
32061da546Spatrick }
33061da546Spatrick
AddSummary(TypeCategoryImpl::SharedPointer category_sp,TypeSummaryImplSP summary_sp,ConstString type_name,bool regex)34061da546Spatrick void lldb_private::formatters::AddSummary(
35061da546Spatrick TypeCategoryImpl::SharedPointer category_sp, TypeSummaryImplSP summary_sp,
36061da546Spatrick ConstString type_name, bool regex) {
37*f6aab3d8Srobert FormatterMatchType match_type =
38*f6aab3d8Srobert regex ? eFormatterMatchRegex : eFormatterMatchExact;
39*f6aab3d8Srobert category_sp->AddTypeSummary(type_name.GetStringRef(), match_type, summary_sp);
40061da546Spatrick }
41061da546Spatrick
AddStringSummary(TypeCategoryImpl::SharedPointer category_sp,const char * string,ConstString type_name,TypeSummaryImpl::Flags flags,bool regex)42061da546Spatrick void lldb_private::formatters::AddStringSummary(
43061da546Spatrick TypeCategoryImpl::SharedPointer category_sp, const char *string,
44061da546Spatrick ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) {
45061da546Spatrick lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, string));
46061da546Spatrick
47*f6aab3d8Srobert FormatterMatchType match_type =
48*f6aab3d8Srobert regex ? eFormatterMatchRegex : eFormatterMatchExact;
49*f6aab3d8Srobert category_sp->AddTypeSummary(type_name.GetStringRef(), match_type, summary_sp);
50061da546Spatrick }
51061da546Spatrick
AddOneLineSummary(TypeCategoryImpl::SharedPointer category_sp,ConstString type_name,TypeSummaryImpl::Flags flags,bool regex)52061da546Spatrick void lldb_private::formatters::AddOneLineSummary(
53061da546Spatrick TypeCategoryImpl::SharedPointer category_sp, ConstString type_name,
54061da546Spatrick TypeSummaryImpl::Flags flags, bool regex) {
55061da546Spatrick flags.SetShowMembersOneLiner(true);
56061da546Spatrick lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, ""));
57061da546Spatrick
58*f6aab3d8Srobert FormatterMatchType match_type =
59*f6aab3d8Srobert regex ? eFormatterMatchRegex : eFormatterMatchExact;
60*f6aab3d8Srobert category_sp->AddTypeSummary(type_name.GetStringRef(), match_type, summary_sp);
61061da546Spatrick }
62061da546Spatrick
AddCXXSummary(TypeCategoryImpl::SharedPointer category_sp,CXXFunctionSummaryFormat::Callback funct,const char * description,ConstString type_name,TypeSummaryImpl::Flags flags,bool regex)63061da546Spatrick void lldb_private::formatters::AddCXXSummary(
64061da546Spatrick TypeCategoryImpl::SharedPointer category_sp,
65061da546Spatrick CXXFunctionSummaryFormat::Callback funct, const char *description,
66061da546Spatrick ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) {
67061da546Spatrick lldb::TypeSummaryImplSP summary_sp(
68061da546Spatrick new CXXFunctionSummaryFormat(flags, funct, description));
69*f6aab3d8Srobert
70*f6aab3d8Srobert FormatterMatchType match_type =
71*f6aab3d8Srobert regex ? eFormatterMatchRegex : eFormatterMatchExact;
72*f6aab3d8Srobert category_sp->AddTypeSummary(type_name.GetStringRef(), match_type, summary_sp);
73061da546Spatrick }
74061da546Spatrick
AddCXXSynthetic(TypeCategoryImpl::SharedPointer category_sp,CXXSyntheticChildren::CreateFrontEndCallback generator,const char * description,ConstString type_name,ScriptedSyntheticChildren::Flags flags,bool regex)75061da546Spatrick void lldb_private::formatters::AddCXXSynthetic(
76061da546Spatrick TypeCategoryImpl::SharedPointer category_sp,
77061da546Spatrick CXXSyntheticChildren::CreateFrontEndCallback generator,
78061da546Spatrick const char *description, ConstString type_name,
79061da546Spatrick ScriptedSyntheticChildren::Flags flags, bool regex) {
80061da546Spatrick lldb::SyntheticChildrenSP synth_sp(
81061da546Spatrick new CXXSyntheticChildren(flags, description, generator));
82*f6aab3d8Srobert FormatterMatchType match_type =
83*f6aab3d8Srobert regex ? eFormatterMatchRegex : eFormatterMatchExact;
84*f6aab3d8Srobert category_sp->AddTypeSynthetic(type_name.GetStringRef(), match_type, synth_sp);
85061da546Spatrick }
86061da546Spatrick
AddFilter(TypeCategoryImpl::SharedPointer category_sp,std::vector<std::string> children,const char * description,ConstString type_name,ScriptedSyntheticChildren::Flags flags,bool regex)87061da546Spatrick void lldb_private::formatters::AddFilter(
88061da546Spatrick TypeCategoryImpl::SharedPointer category_sp,
89061da546Spatrick std::vector<std::string> children, const char *description,
90061da546Spatrick ConstString type_name, ScriptedSyntheticChildren::Flags flags, bool regex) {
91061da546Spatrick TypeFilterImplSP filter_sp(new TypeFilterImpl(flags));
92061da546Spatrick for (auto child : children)
93061da546Spatrick filter_sp->AddExpressionPath(child);
94*f6aab3d8Srobert FormatterMatchType match_type =
95*f6aab3d8Srobert regex ? eFormatterMatchRegex : eFormatterMatchExact;
96*f6aab3d8Srobert category_sp->AddTypeFilter(type_name.GetStringRef(), match_type, filter_sp);
97061da546Spatrick }
98061da546Spatrick
ExtractIndexFromString(const char * item_name)99061da546Spatrick size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name) {
100061da546Spatrick if (!item_name || !*item_name)
101061da546Spatrick return UINT32_MAX;
102061da546Spatrick if (*item_name != '[')
103061da546Spatrick return UINT32_MAX;
104061da546Spatrick item_name++;
105061da546Spatrick char *endptr = nullptr;
106061da546Spatrick unsigned long int idx = ::strtoul(item_name, &endptr, 0);
107061da546Spatrick if (idx == 0 && endptr == item_name)
108061da546Spatrick return UINT32_MAX;
109061da546Spatrick if (idx == ULONG_MAX)
110061da546Spatrick return UINT32_MAX;
111061da546Spatrick return idx;
112061da546Spatrick }
113061da546Spatrick
114*f6aab3d8Srobert Address
GetArrayAddressOrPointerValue(ValueObject & valobj)115061da546Spatrick lldb_private::formatters::GetArrayAddressOrPointerValue(ValueObject &valobj) {
116061da546Spatrick lldb::addr_t data_addr = LLDB_INVALID_ADDRESS;
117*f6aab3d8Srobert AddressType type;
118061da546Spatrick
119061da546Spatrick if (valobj.IsPointerType())
120*f6aab3d8Srobert data_addr = valobj.GetPointerValue(&type);
121061da546Spatrick else if (valobj.IsArrayType())
122*f6aab3d8Srobert data_addr = valobj.GetAddressOf(/*scalar_is_load_address=*/true, &type);
123*f6aab3d8Srobert if (data_addr != LLDB_INVALID_ADDRESS && type == eAddressTypeFile)
124*f6aab3d8Srobert return Address(data_addr, valobj.GetModule()->GetSectionList());
125061da546Spatrick
126061da546Spatrick return data_addr;
127061da546Spatrick }
128dda28197Spatrick
129dda28197Spatrick lldb::ValueObjectSP
GetValueOfLibCXXCompressedPair(ValueObject & pair)130dda28197Spatrick lldb_private::formatters::GetValueOfLibCXXCompressedPair(ValueObject &pair) {
131dda28197Spatrick ValueObjectSP value =
132dda28197Spatrick pair.GetChildMemberWithName(ConstString("__value_"), true);
133dda28197Spatrick if (!value) {
134dda28197Spatrick // pre-r300140 member name
135dda28197Spatrick value = pair.GetChildMemberWithName(ConstString("__first_"), true);
136dda28197Spatrick }
137dda28197Spatrick return value;
138dda28197Spatrick }
139