1*dda28197Spatrick //===-- 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" 13061da546Spatrick 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 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 29061da546Spatrick if (regex) 30061da546Spatrick category_sp->GetRegexTypeFormatsContainer()->Add( 31061da546Spatrick RegularExpression(type_name.GetStringRef()), format_sp); 32061da546Spatrick else 33061da546Spatrick category_sp->GetTypeFormatsContainer()->Add(std::move(type_name), 34061da546Spatrick format_sp); 35061da546Spatrick } 36061da546Spatrick 37061da546Spatrick void lldb_private::formatters::AddSummary( 38061da546Spatrick TypeCategoryImpl::SharedPointer category_sp, TypeSummaryImplSP summary_sp, 39061da546Spatrick ConstString type_name, bool regex) { 40061da546Spatrick if (regex) 41061da546Spatrick category_sp->GetRegexTypeSummariesContainer()->Add( 42061da546Spatrick RegularExpression(type_name.GetStringRef()), summary_sp); 43061da546Spatrick else 44061da546Spatrick category_sp->GetTypeSummariesContainer()->Add(std::move(type_name), 45061da546Spatrick summary_sp); 46061da546Spatrick } 47061da546Spatrick 48061da546Spatrick void lldb_private::formatters::AddStringSummary( 49061da546Spatrick TypeCategoryImpl::SharedPointer category_sp, const char *string, 50061da546Spatrick ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) { 51061da546Spatrick lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, string)); 52061da546Spatrick 53061da546Spatrick if (regex) 54061da546Spatrick category_sp->GetRegexTypeSummariesContainer()->Add( 55061da546Spatrick RegularExpression(type_name.GetStringRef()), summary_sp); 56061da546Spatrick else 57061da546Spatrick category_sp->GetTypeSummariesContainer()->Add(std::move(type_name), 58061da546Spatrick summary_sp); 59061da546Spatrick } 60061da546Spatrick 61061da546Spatrick void lldb_private::formatters::AddOneLineSummary( 62061da546Spatrick TypeCategoryImpl::SharedPointer category_sp, ConstString type_name, 63061da546Spatrick TypeSummaryImpl::Flags flags, bool regex) { 64061da546Spatrick flags.SetShowMembersOneLiner(true); 65061da546Spatrick lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, "")); 66061da546Spatrick 67061da546Spatrick if (regex) 68061da546Spatrick category_sp->GetRegexTypeSummariesContainer()->Add( 69061da546Spatrick RegularExpression(type_name.GetStringRef()), summary_sp); 70061da546Spatrick else 71061da546Spatrick category_sp->GetTypeSummariesContainer()->Add(std::move(type_name), 72061da546Spatrick summary_sp); 73061da546Spatrick } 74061da546Spatrick 75061da546Spatrick void lldb_private::formatters::AddCXXSummary( 76061da546Spatrick TypeCategoryImpl::SharedPointer category_sp, 77061da546Spatrick CXXFunctionSummaryFormat::Callback funct, const char *description, 78061da546Spatrick ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) { 79061da546Spatrick lldb::TypeSummaryImplSP summary_sp( 80061da546Spatrick new CXXFunctionSummaryFormat(flags, funct, description)); 81061da546Spatrick if (regex) 82061da546Spatrick category_sp->GetRegexTypeSummariesContainer()->Add( 83061da546Spatrick RegularExpression(type_name.GetStringRef()), summary_sp); 84061da546Spatrick else 85061da546Spatrick category_sp->GetTypeSummariesContainer()->Add(std::move(type_name), 86061da546Spatrick summary_sp); 87061da546Spatrick } 88061da546Spatrick 89061da546Spatrick void lldb_private::formatters::AddCXXSynthetic( 90061da546Spatrick TypeCategoryImpl::SharedPointer category_sp, 91061da546Spatrick CXXSyntheticChildren::CreateFrontEndCallback generator, 92061da546Spatrick const char *description, ConstString type_name, 93061da546Spatrick ScriptedSyntheticChildren::Flags flags, bool regex) { 94061da546Spatrick lldb::SyntheticChildrenSP synth_sp( 95061da546Spatrick new CXXSyntheticChildren(flags, description, generator)); 96061da546Spatrick if (regex) 97061da546Spatrick category_sp->GetRegexTypeSyntheticsContainer()->Add( 98061da546Spatrick RegularExpression(type_name.GetStringRef()), synth_sp); 99061da546Spatrick else 100061da546Spatrick category_sp->GetTypeSyntheticsContainer()->Add(std::move(type_name), 101061da546Spatrick synth_sp); 102061da546Spatrick } 103061da546Spatrick 104061da546Spatrick void lldb_private::formatters::AddFilter( 105061da546Spatrick TypeCategoryImpl::SharedPointer category_sp, 106061da546Spatrick std::vector<std::string> children, const char *description, 107061da546Spatrick ConstString type_name, ScriptedSyntheticChildren::Flags flags, bool regex) { 108061da546Spatrick TypeFilterImplSP filter_sp(new TypeFilterImpl(flags)); 109061da546Spatrick for (auto child : children) 110061da546Spatrick filter_sp->AddExpressionPath(child); 111061da546Spatrick if (regex) 112061da546Spatrick category_sp->GetRegexTypeFiltersContainer()->Add( 113061da546Spatrick RegularExpression(type_name.GetStringRef()), filter_sp); 114061da546Spatrick else 115061da546Spatrick category_sp->GetTypeFiltersContainer()->Add(std::move(type_name), 116061da546Spatrick filter_sp); 117061da546Spatrick } 118061da546Spatrick 119061da546Spatrick size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name) { 120061da546Spatrick if (!item_name || !*item_name) 121061da546Spatrick return UINT32_MAX; 122061da546Spatrick if (*item_name != '[') 123061da546Spatrick return UINT32_MAX; 124061da546Spatrick item_name++; 125061da546Spatrick char *endptr = nullptr; 126061da546Spatrick unsigned long int idx = ::strtoul(item_name, &endptr, 0); 127061da546Spatrick if (idx == 0 && endptr == item_name) 128061da546Spatrick return UINT32_MAX; 129061da546Spatrick if (idx == ULONG_MAX) 130061da546Spatrick return UINT32_MAX; 131061da546Spatrick return idx; 132061da546Spatrick } 133061da546Spatrick 134061da546Spatrick lldb::addr_t 135061da546Spatrick lldb_private::formatters::GetArrayAddressOrPointerValue(ValueObject &valobj) { 136061da546Spatrick lldb::addr_t data_addr = LLDB_INVALID_ADDRESS; 137061da546Spatrick 138061da546Spatrick if (valobj.IsPointerType()) 139061da546Spatrick data_addr = valobj.GetValueAsUnsigned(0); 140061da546Spatrick else if (valobj.IsArrayType()) 141061da546Spatrick data_addr = valobj.GetAddressOf(); 142061da546Spatrick 143061da546Spatrick return data_addr; 144061da546Spatrick } 145*dda28197Spatrick 146*dda28197Spatrick lldb::ValueObjectSP 147*dda28197Spatrick lldb_private::formatters::GetValueOfLibCXXCompressedPair(ValueObject &pair) { 148*dda28197Spatrick ValueObjectSP value = 149*dda28197Spatrick pair.GetChildMemberWithName(ConstString("__value_"), true); 150*dda28197Spatrick if (!value) { 151*dda28197Spatrick // pre-r300140 member name 152*dda28197Spatrick value = pair.GetChildMemberWithName(ConstString("__first_"), true); 153*dda28197Spatrick } 154*dda28197Spatrick return value; 155*dda28197Spatrick } 156