1 //===-- FormattersHelpers.cpp ---------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
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"
21 using namespace lldb_private
;
22 using namespace lldb_private::formatters
;
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
));
29 FormatterMatchType match_type
=
30 regex
? eFormatterMatchRegex
: eFormatterMatchExact
;
31 category_sp
->AddTypeFormat(type_name
, match_type
, format_sp
);
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
);
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
));
47 FormatterMatchType match_type
=
48 regex
? eFormatterMatchRegex
: eFormatterMatchExact
;
49 category_sp
->AddTypeSummary(type_name
, match_type
, summary_sp
);
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
, ""));
58 FormatterMatchType match_type
=
59 regex
? eFormatterMatchRegex
: eFormatterMatchExact
;
60 category_sp
->AddTypeSummary(type_name
, match_type
, summary_sp
);
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
));
70 FormatterMatchType match_type
=
71 regex
? eFormatterMatchRegex
: eFormatterMatchExact
;
72 category_sp
->AddTypeSummary(type_name
, match_type
, summary_sp
);
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
);
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
,
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
);
100 size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name
) {
101 if (!item_name
|| !*item_name
)
103 if (*item_name
!= '[')
106 char *endptr
= nullptr;
107 unsigned long int idx
= ::strtoul(item_name
, &endptr
, 0);
108 if (idx
== 0 && endptr
== item_name
)
110 if (idx
== ULONG_MAX
)
116 lldb_private::formatters::GetArrayAddressOrPointerValue(ValueObject
&valobj
) {
117 lldb::addr_t data_addr
= LLDB_INVALID_ADDRESS
;
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());