]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/DataFormatters/FormattersHelpers.cpp
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / source / DataFormatters / FormattersHelpers.cpp
1 //===-- FormattersHelpers.cpp -------------------------------------*- C++
2 //-*-===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 // C Includes
12
13 // C++ Includes
14
15 // Other libraries and framework includes
16
17 // Project includes
18 #include "lldb/DataFormatters/FormattersHelpers.h"
19
20 #include "lldb/Core/ConstString.h"
21 #include "lldb/Core/RegularExpression.h"
22 #include "lldb/Target/StackFrame.h"
23 #include "lldb/Target/Target.h"
24 #include "lldb/Target/Thread.h"
25
26 using namespace lldb;
27 using namespace lldb_private;
28 using namespace lldb_private::formatters;
29
30 void lldb_private::formatters::AddFormat(
31     TypeCategoryImpl::SharedPointer category_sp, lldb::Format format,
32     ConstString type_name, TypeFormatImpl::Flags flags, bool regex) {
33   lldb::TypeFormatImplSP format_sp(new TypeFormatImpl_Format(format, flags));
34
35   if (regex)
36     category_sp->GetRegexTypeFormatsContainer()->Add(
37         RegularExpressionSP(new RegularExpression(type_name.GetStringRef())),
38         format_sp);
39   else
40     category_sp->GetTypeFormatsContainer()->Add(type_name, format_sp);
41 }
42
43 void lldb_private::formatters::AddSummary(
44     TypeCategoryImpl::SharedPointer category_sp, TypeSummaryImplSP summary_sp,
45     ConstString type_name, bool regex) {
46   if (regex)
47     category_sp->GetRegexTypeSummariesContainer()->Add(
48         RegularExpressionSP(new RegularExpression(type_name.GetStringRef())),
49         summary_sp);
50   else
51     category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp);
52 }
53
54 void lldb_private::formatters::AddStringSummary(
55     TypeCategoryImpl::SharedPointer category_sp, const char *string,
56     ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) {
57   lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, string));
58
59   if (regex)
60     category_sp->GetRegexTypeSummariesContainer()->Add(
61         RegularExpressionSP(new RegularExpression(type_name.GetStringRef())),
62         summary_sp);
63   else
64     category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp);
65 }
66
67 void lldb_private::formatters::AddOneLineSummary(
68     TypeCategoryImpl::SharedPointer category_sp, ConstString type_name,
69     TypeSummaryImpl::Flags flags, bool regex) {
70   flags.SetShowMembersOneLiner(true);
71   lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, ""));
72
73   if (regex)
74     category_sp->GetRegexTypeSummariesContainer()->Add(
75         RegularExpressionSP(new RegularExpression(type_name.GetStringRef())),
76         summary_sp);
77   else
78     category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp);
79 }
80
81 #ifndef LLDB_DISABLE_PYTHON
82 void lldb_private::formatters::AddCXXSummary(
83     TypeCategoryImpl::SharedPointer category_sp,
84     CXXFunctionSummaryFormat::Callback funct, const char *description,
85     ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) {
86   lldb::TypeSummaryImplSP summary_sp(
87       new CXXFunctionSummaryFormat(flags, funct, description));
88   if (regex)
89     category_sp->GetRegexTypeSummariesContainer()->Add(
90         RegularExpressionSP(new RegularExpression(type_name.GetStringRef())),
91         summary_sp);
92   else
93     category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp);
94 }
95
96 void lldb_private::formatters::AddCXXSynthetic(
97     TypeCategoryImpl::SharedPointer category_sp,
98     CXXSyntheticChildren::CreateFrontEndCallback generator,
99     const char *description, ConstString type_name,
100     ScriptedSyntheticChildren::Flags flags, bool regex) {
101   lldb::SyntheticChildrenSP synth_sp(
102       new CXXSyntheticChildren(flags, description, generator));
103   if (regex)
104     category_sp->GetRegexTypeSyntheticsContainer()->Add(
105         RegularExpressionSP(new RegularExpression(type_name.GetStringRef())),
106         synth_sp);
107   else
108     category_sp->GetTypeSyntheticsContainer()->Add(type_name, synth_sp);
109 }
110
111 void lldb_private::formatters::AddFilter(
112     TypeCategoryImpl::SharedPointer category_sp,
113     std::vector<std::string> children, const char *description,
114     ConstString type_name, ScriptedSyntheticChildren::Flags flags, bool regex) {
115   TypeFilterImplSP filter_sp(new TypeFilterImpl(flags));
116   for (auto child : children)
117     filter_sp->AddExpressionPath(child);
118   if (regex)
119     category_sp->GetRegexTypeFiltersContainer()->Add(
120         RegularExpressionSP(new RegularExpression(type_name.GetStringRef())),
121         filter_sp);
122   else
123     category_sp->GetTypeFiltersContainer()->Add(type_name, filter_sp);
124 }
125 #endif
126
127 size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name) {
128   if (!item_name || !*item_name)
129     return UINT32_MAX;
130   if (*item_name != '[')
131     return UINT32_MAX;
132   item_name++;
133   char *endptr = NULL;
134   unsigned long int idx = ::strtoul(item_name, &endptr, 0);
135   if (idx == 0 && endptr == item_name)
136     return UINT32_MAX;
137   if (idx == ULONG_MAX)
138     return UINT32_MAX;
139   return idx;
140 }
141
142 lldb::addr_t
143 lldb_private::formatters::GetArrayAddressOrPointerValue(ValueObject &valobj) {
144   lldb::addr_t data_addr = LLDB_INVALID_ADDRESS;
145
146   if (valobj.IsPointerType())
147     data_addr = valobj.GetValueAsUnsigned(0);
148   else if (valobj.IsArrayType())
149     data_addr = valobj.GetAddressOf();
150
151   return data_addr;
152 }