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(name: 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(name: 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(name: 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(name: 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(name: 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(name: 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(path: child); |
95 | FormatterMatchType match_type = |
96 | regex ? eFormatterMatchRegex : eFormatterMatchExact; |
97 | category_sp->AddTypeFilter(name: type_name, match_type, filter_sp); |
98 | } |
99 | |
100 | size_t lldb_private::formatters::(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(nptr: item_name, endptr: &endptr, base: 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(address_type: &type); |
122 | else if (valobj.IsArrayType()) |
123 | data_addr = valobj.GetAddressOf(/*scalar_is_load_address=*/true, address_type: &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 | |