Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
39642 views
//===-- CPlusPlusLanguage.cpp ---------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "CPlusPlusLanguage.h"910#include <cctype>11#include <cstring>1213#include <functional>14#include <memory>15#include <mutex>16#include <set>1718#include "llvm/ADT/StringRef.h"19#include "llvm/Demangle/ItaniumDemangle.h"2021#include "lldb/Core/Mangled.h"22#include "lldb/Core/Module.h"23#include "lldb/Core/PluginManager.h"24#include "lldb/Core/UniqueCStringMap.h"25#include "lldb/Core/ValueObjectVariable.h"26#include "lldb/DataFormatters/CXXFunctionPointer.h"27#include "lldb/DataFormatters/DataVisualization.h"28#include "lldb/DataFormatters/FormattersHelpers.h"29#include "lldb/DataFormatters/VectorType.h"30#include "lldb/Symbol/SymbolFile.h"31#include "lldb/Symbol/VariableList.h"32#include "lldb/Utility/ConstString.h"33#include "lldb/Utility/LLDBLog.h"34#include "lldb/Utility/Log.h"35#include "lldb/Utility/RegularExpression.h"3637#include "BlockPointer.h"38#include "CPlusPlusNameParser.h"39#include "Coroutines.h"40#include "CxxStringTypes.h"41#include "Generic.h"42#include "LibCxx.h"43#include "LibCxxAtomic.h"44#include "LibCxxVariant.h"45#include "LibStdcpp.h"46#include "MSVCUndecoratedNameParser.h"47#include "lldb/lldb-enumerations.h"4849using namespace lldb;50using namespace lldb_private;51using namespace lldb_private::formatters;5253LLDB_PLUGIN_DEFINE(CPlusPlusLanguage)5455void CPlusPlusLanguage::Initialize() {56PluginManager::RegisterPlugin(GetPluginNameStatic(), "C++ Language",57CreateInstance);58}5960void CPlusPlusLanguage::Terminate() {61PluginManager::UnregisterPlugin(CreateInstance);62}6364bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {65const char *mangled_name = mangled.GetMangledName().GetCString();66return mangled_name && CPlusPlusLanguage::IsCPPMangledName(mangled_name);67}6869ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments(70Mangled mangled) const {71const char *mangled_name_cstr = mangled.GetMangledName().GetCString();72ConstString demangled_name = mangled.GetDemangledName();73if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {74if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' &&75(mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure,76// typeinfo structure, and typeinfo77// mangled_name78mangled_name_cstr[2] != 'G' && // avoid guard variables79mangled_name_cstr[2] != 'Z')) // named local entities (if we80// eventually handle eSymbolTypeData,81// we will want this back)82{83CPlusPlusLanguage::MethodName cxx_method(demangled_name);84if (!cxx_method.GetBasename().empty()) {85std::string shortname;86if (!cxx_method.GetContext().empty())87shortname = cxx_method.GetContext().str() + "::";88shortname += cxx_method.GetBasename().str();89return ConstString(shortname);90}91}92}93if (demangled_name)94return demangled_name;95return mangled.GetMangledName();96}9798// Static Functions99100Language *CPlusPlusLanguage::CreateInstance(lldb::LanguageType language) {101// Use plugin for C++ but not for Objective-C++ (which has its own plugin).102if (Language::LanguageIsCPlusPlus(language) &&103language != eLanguageTypeObjC_plus_plus)104return new CPlusPlusLanguage();105return nullptr;106}107108void CPlusPlusLanguage::MethodName::Clear() {109m_full.Clear();110m_basename = llvm::StringRef();111m_context = llvm::StringRef();112m_arguments = llvm::StringRef();113m_qualifiers = llvm::StringRef();114m_return_type = llvm::StringRef();115m_parsed = false;116m_parse_error = false;117}118119static bool ReverseFindMatchingChars(const llvm::StringRef &s,120const llvm::StringRef &left_right_chars,121size_t &left_pos, size_t &right_pos,122size_t pos = llvm::StringRef::npos) {123assert(left_right_chars.size() == 2);124left_pos = llvm::StringRef::npos;125const char left_char = left_right_chars[0];126const char right_char = left_right_chars[1];127pos = s.find_last_of(left_right_chars, pos);128if (pos == llvm::StringRef::npos || s[pos] == left_char)129return false;130right_pos = pos;131uint32_t depth = 1;132while (pos > 0 && depth > 0) {133pos = s.find_last_of(left_right_chars, pos);134if (pos == llvm::StringRef::npos)135return false;136if (s[pos] == left_char) {137if (--depth == 0) {138left_pos = pos;139return left_pos < right_pos;140}141} else if (s[pos] == right_char) {142++depth;143}144}145return false;146}147148static bool IsTrivialBasename(const llvm::StringRef &basename) {149// Check that the basename matches with the following regular expression150// "^~?([A-Za-z_][A-Za-z_0-9]*)$" We are using a hand written implementation151// because it is significantly more efficient then using the general purpose152// regular expression library.153size_t idx = 0;154if (basename.starts_with('~'))155idx = 1;156157if (basename.size() <= idx)158return false; // Empty string or "~"159160if (!std::isalpha(basename[idx]) && basename[idx] != '_')161return false; // First character (after removing the possible '~'') isn't in162// [A-Za-z_]163164// Read all characters matching [A-Za-z_0-9]165++idx;166while (idx < basename.size()) {167if (!std::isalnum(basename[idx]) && basename[idx] != '_')168break;169++idx;170}171172// We processed all characters. It is a vaild basename.173return idx == basename.size();174}175176/// Writes out the function name in 'full_name' to 'out_stream'177/// but replaces each argument type with the variable name178/// and the corresponding pretty-printed value179static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream,180char const *full_name,181ExecutionContextScope *exe_scope,182VariableList const &args) {183CPlusPlusLanguage::MethodName cpp_method{ConstString(full_name)};184185if (!cpp_method.IsValid())186return false;187188llvm::StringRef return_type = cpp_method.GetReturnType();189if (!return_type.empty()) {190out_stream.PutCString(return_type);191out_stream.PutChar(' ');192}193194out_stream.PutCString(cpp_method.GetScopeQualifiedName());195out_stream.PutChar('(');196197FormatEntity::PrettyPrintFunctionArguments(out_stream, args, exe_scope);198199out_stream.PutChar(')');200201llvm::StringRef qualifiers = cpp_method.GetQualifiers();202if (!qualifiers.empty()) {203out_stream.PutChar(' ');204out_stream.PutCString(qualifiers);205}206207return true;208}209210bool CPlusPlusLanguage::MethodName::TrySimplifiedParse() {211// This method tries to parse simple method definitions which are presumably212// most comman in user programs. Definitions that can be parsed by this213// function don't have return types and templates in the name.214// A::B::C::fun(std::vector<T> &) const215size_t arg_start, arg_end;216llvm::StringRef full(m_full.GetCString());217llvm::StringRef parens("()", 2);218if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) {219m_arguments = full.substr(arg_start, arg_end - arg_start + 1);220if (arg_end + 1 < full.size())221m_qualifiers = full.substr(arg_end + 1).ltrim();222223if (arg_start == 0)224return false;225size_t basename_end = arg_start;226size_t context_start = 0;227size_t context_end = full.rfind(':', basename_end);228if (context_end == llvm::StringRef::npos)229m_basename = full.substr(0, basename_end);230else {231if (context_start < context_end)232m_context = full.substr(context_start, context_end - 1 - context_start);233const size_t basename_begin = context_end + 1;234m_basename = full.substr(basename_begin, basename_end - basename_begin);235}236237if (IsTrivialBasename(m_basename)) {238return true;239} else {240// The C++ basename doesn't match our regular expressions so this can't241// be a valid C++ method, clear everything out and indicate an error242m_context = llvm::StringRef();243m_basename = llvm::StringRef();244m_arguments = llvm::StringRef();245m_qualifiers = llvm::StringRef();246m_return_type = llvm::StringRef();247return false;248}249}250return false;251}252253void CPlusPlusLanguage::MethodName::Parse() {254if (!m_parsed && m_full) {255if (TrySimplifiedParse()) {256m_parse_error = false;257} else {258CPlusPlusNameParser parser(m_full.GetStringRef());259if (auto function = parser.ParseAsFunctionDefinition()) {260m_basename = function->name.basename;261m_context = function->name.context;262m_arguments = function->arguments;263m_qualifiers = function->qualifiers;264m_return_type = function->return_type;265m_parse_error = false;266} else {267m_parse_error = true;268}269}270m_parsed = true;271}272}273274llvm::StringRef CPlusPlusLanguage::MethodName::GetBasename() {275if (!m_parsed)276Parse();277return m_basename;278}279280llvm::StringRef CPlusPlusLanguage::MethodName::GetContext() {281if (!m_parsed)282Parse();283return m_context;284}285286llvm::StringRef CPlusPlusLanguage::MethodName::GetArguments() {287if (!m_parsed)288Parse();289return m_arguments;290}291292llvm::StringRef CPlusPlusLanguage::MethodName::GetQualifiers() {293if (!m_parsed)294Parse();295return m_qualifiers;296}297298llvm::StringRef CPlusPlusLanguage::MethodName::GetReturnType() {299if (!m_parsed)300Parse();301return m_return_type;302}303304std::string CPlusPlusLanguage::MethodName::GetScopeQualifiedName() {305if (!m_parsed)306Parse();307if (m_context.empty())308return std::string(m_basename);309310std::string res;311res += m_context;312res += "::";313res += m_basename;314return res;315}316317llvm::StringRef318CPlusPlusLanguage::MethodName::GetBasenameNoTemplateParameters() {319llvm::StringRef basename = GetBasename();320size_t arg_start, arg_end;321llvm::StringRef parens("<>", 2);322if (ReverseFindMatchingChars(basename, parens, arg_start, arg_end))323return basename.substr(0, arg_start);324325return basename;326}327328bool CPlusPlusLanguage::MethodName::ContainsPath(llvm::StringRef path) {329if (!m_parsed)330Parse();331332// If we can't parse the incoming name, then just check that it contains path.333if (m_parse_error)334return m_full.GetStringRef().contains(path);335336llvm::StringRef identifier;337llvm::StringRef context;338std::string path_str = path.str();339bool success = CPlusPlusLanguage::ExtractContextAndIdentifier(340path_str.c_str(), context, identifier);341if (!success)342return m_full.GetStringRef().contains(path);343344// Basename may include template arguments.345// E.g.,346// GetBaseName(): func<int>347// identifier : func348//349// ...but we still want to account for identifiers with template parameter350// lists, e.g., when users set breakpoints on template specializations.351//352// E.g.,353// GetBaseName(): func<uint32_t>354// identifier : func<int32_t*>355//356// Try to match the basename with or without template parameters.357if (GetBasename() != identifier &&358GetBasenameNoTemplateParameters() != identifier)359return false;360361// Incoming path only had an identifier, so we match.362if (context.empty())363return true;364// Incoming path has context but this method does not, no match.365if (m_context.empty())366return false;367368llvm::StringRef haystack = m_context;369if (!haystack.consume_back(context))370return false;371if (haystack.empty() || !isalnum(haystack.back()))372return true;373374return false;375}376377bool CPlusPlusLanguage::IsCPPMangledName(llvm::StringRef name) {378// FIXME!! we should really run through all the known C++ Language plugins379// and ask each one if this is a C++ mangled name380381Mangled::ManglingScheme scheme = Mangled::GetManglingScheme(name);382383if (scheme == Mangled::eManglingSchemeNone)384return false;385386return true;387}388389bool CPlusPlusLanguage::DemangledNameContainsPath(llvm::StringRef path,390ConstString demangled) const {391MethodName demangled_name(demangled);392return demangled_name.ContainsPath(path);393}394395bool CPlusPlusLanguage::ExtractContextAndIdentifier(396const char *name, llvm::StringRef &context, llvm::StringRef &identifier) {397if (MSVCUndecoratedNameParser::IsMSVCUndecoratedName(name))398return MSVCUndecoratedNameParser::ExtractContextAndIdentifier(name, context,399identifier);400401CPlusPlusNameParser parser(name);402if (auto full_name = parser.ParseAsFullName()) {403identifier = full_name->basename;404context = full_name->context;405return true;406}407return false;408}409410namespace {411class NodeAllocator {412llvm::BumpPtrAllocator Alloc;413414public:415void reset() { Alloc.Reset(); }416417template <typename T, typename... Args> T *makeNode(Args &&... args) {418return new (Alloc.Allocate(sizeof(T), alignof(T)))419T(std::forward<Args>(args)...);420}421422void *allocateNodeArray(size_t sz) {423return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz,424alignof(llvm::itanium_demangle::Node *));425}426};427428template <typename Derived>429class ManglingSubstitutor430: public llvm::itanium_demangle::AbstractManglingParser<Derived,431NodeAllocator> {432using Base =433llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;434435public:436ManglingSubstitutor() : Base(nullptr, nullptr) {}437438template <typename... Ts>439ConstString substitute(llvm::StringRef Mangled, Ts &&... Vals) {440this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);441return substituteImpl(Mangled);442}443444protected:445void reset(llvm::StringRef Mangled) {446Base::reset(Mangled.begin(), Mangled.end());447Written = Mangled.begin();448Result.clear();449Substituted = false;450}451452ConstString substituteImpl(llvm::StringRef Mangled) {453Log *log = GetLog(LLDBLog::Language);454if (this->parse() == nullptr) {455LLDB_LOG(log, "Failed to substitute mangling in {0}", Mangled);456return ConstString();457}458if (!Substituted)459return ConstString();460461// Append any trailing unmodified input.462appendUnchangedInput();463LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);464return ConstString(Result);465}466467void trySubstitute(llvm::StringRef From, llvm::StringRef To) {468if (!llvm::StringRef(currentParserPos(), this->numLeft()).starts_with(From))469return;470471// We found a match. Append unmodified input up to this point.472appendUnchangedInput();473474// And then perform the replacement.475Result += To;476Written += From.size();477Substituted = true;478}479480private:481/// Input character until which we have constructed the respective output482/// already.483const char *Written = "";484485llvm::SmallString<128> Result;486487/// Whether we have performed any substitutions.488bool Substituted = false;489490const char *currentParserPos() const { return this->First; }491492void appendUnchangedInput() {493Result +=494llvm::StringRef(Written, std::distance(Written, currentParserPos()));495Written = currentParserPos();496}497};498499/// Given a mangled function `Mangled`, replace all the primitive function type500/// arguments of `Search` with type `Replace`.501class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> {502llvm::StringRef Search;503llvm::StringRef Replace;504505public:506void reset(llvm::StringRef Mangled, llvm::StringRef Search,507llvm::StringRef Replace) {508ManglingSubstitutor::reset(Mangled);509this->Search = Search;510this->Replace = Replace;511}512513llvm::itanium_demangle::Node *parseType() {514trySubstitute(Search, Replace);515return ManglingSubstitutor::parseType();516}517};518519class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> {520public:521llvm::itanium_demangle::Node *522parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) {523trySubstitute("C1", "C2");524trySubstitute("D1", "D2");525return ManglingSubstitutor::parseCtorDtorName(SoFar, State);526}527};528} // namespace529530std::vector<ConstString> CPlusPlusLanguage::GenerateAlternateFunctionManglings(531const ConstString mangled_name) const {532std::vector<ConstString> alternates;533534/// Get a basic set of alternative manglings for the given symbol `name`, by535/// making a few basic possible substitutions on basic types, storage duration536/// and `const`ness for the given symbol. The output parameter `alternates`537/// is filled with a best-guess, non-exhaustive set of different manglings538/// for the given name.539540// Maybe we're looking for a const symbol but the debug info told us it was541// non-const...542if (!strncmp(mangled_name.GetCString(), "_ZN", 3) &&543strncmp(mangled_name.GetCString(), "_ZNK", 4)) {544std::string fixed_scratch("_ZNK");545fixed_scratch.append(mangled_name.GetCString() + 3);546alternates.push_back(ConstString(fixed_scratch));547}548549// Maybe we're looking for a static symbol but we thought it was global...550if (!strncmp(mangled_name.GetCString(), "_Z", 2) &&551strncmp(mangled_name.GetCString(), "_ZL", 3)) {552std::string fixed_scratch("_ZL");553fixed_scratch.append(mangled_name.GetCString() + 2);554alternates.push_back(ConstString(fixed_scratch));555}556557TypeSubstitutor TS;558// `char` is implementation defined as either `signed` or `unsigned`. As a559// result a char parameter has 3 possible manglings: 'c'-char, 'a'-signed560// char, 'h'-unsigned char. If we're looking for symbols with a signed char561// parameter, try finding matches which have the general case 'c'.562if (ConstString char_fixup =563TS.substitute(mangled_name.GetStringRef(), "a", "c"))564alternates.push_back(char_fixup);565566// long long parameter mangling 'x', may actually just be a long 'l' argument567if (ConstString long_fixup =568TS.substitute(mangled_name.GetStringRef(), "x", "l"))569alternates.push_back(long_fixup);570571// unsigned long long parameter mangling 'y', may actually just be unsigned572// long 'm' argument573if (ConstString ulong_fixup =574TS.substitute(mangled_name.GetStringRef(), "y", "m"))575alternates.push_back(ulong_fixup);576577if (ConstString ctor_fixup =578CtorDtorSubstitutor().substitute(mangled_name.GetStringRef()))579alternates.push_back(ctor_fixup);580581return alternates;582}583584ConstString CPlusPlusLanguage::FindBestAlternateFunctionMangledName(585const Mangled mangled, const SymbolContext &sym_ctx) const {586ConstString demangled = mangled.GetDemangledName();587if (!demangled)588return ConstString();589590CPlusPlusLanguage::MethodName cpp_name(demangled);591std::string scope_qualified_name = cpp_name.GetScopeQualifiedName();592593if (!scope_qualified_name.size())594return ConstString();595596if (!sym_ctx.module_sp)597return ConstString();598599lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile();600if (!sym_file)601return ConstString();602603std::vector<ConstString> alternates;604sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates);605606std::vector<ConstString> param_and_qual_matches;607std::vector<ConstString> param_matches;608for (size_t i = 0; i < alternates.size(); i++) {609ConstString alternate_mangled_name = alternates[i];610Mangled mangled(alternate_mangled_name);611ConstString demangled = mangled.GetDemangledName();612613CPlusPlusLanguage::MethodName alternate_cpp_name(demangled);614if (!cpp_name.IsValid())615continue;616617if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) {618if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers())619param_and_qual_matches.push_back(alternate_mangled_name);620else621param_matches.push_back(alternate_mangled_name);622}623}624625if (param_and_qual_matches.size())626return param_and_qual_matches[0]; // It is assumed that there will be only627// one!628else if (param_matches.size())629return param_matches[0]; // Return one of them as a best match630else631return ConstString();632}633634static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {635if (!cpp_category_sp)636return;637638TypeSummaryImpl::Flags stl_summary_flags;639stl_summary_flags.SetCascades(true)640.SetSkipPointers(false)641.SetSkipReferences(false)642.SetDontShowChildren(true)643.SetDontShowValue(true)644.SetShowMembersOneLiner(false)645.SetHideItemNames(false);646647AddCXXSummary(cpp_category_sp,648lldb_private::formatters::LibcxxStringSummaryProviderASCII,649"std::string summary provider", "^std::__[[:alnum:]]+::string$",650stl_summary_flags, true);651AddCXXSummary(cpp_category_sp,652lldb_private::formatters::LibcxxStringSummaryProviderASCII,653"std::string summary provider",654"^std::__[[:alnum:]]+::basic_string<char, "655"std::__[[:alnum:]]+::char_traits<char>, "656"std::__[[:alnum:]]+::allocator<char> >$",657stl_summary_flags, true);658AddCXXSummary(cpp_category_sp,659lldb_private::formatters::LibcxxStringSummaryProviderASCII,660"std::string summary provider",661"^std::__[[:alnum:]]+::basic_string<unsigned char, "662"std::__[[:alnum:]]+::char_traits<unsigned char>, "663"std::__[[:alnum:]]+::allocator<unsigned char> >$",664stl_summary_flags, true);665666AddCXXSummary(cpp_category_sp,667lldb_private::formatters::LibcxxStringSummaryProviderUTF16,668"std::u16string summary provider",669"^std::__[[:alnum:]]+::basic_string<char16_t, "670"std::__[[:alnum:]]+::char_traits<char16_t>, "671"std::__[[:alnum:]]+::allocator<char16_t> >$",672stl_summary_flags, true);673674AddCXXSummary(cpp_category_sp,675lldb_private::formatters::LibcxxStringSummaryProviderUTF32,676"std::u32string summary provider",677"^std::__[[:alnum:]]+::basic_string<char32_t, "678"std::__[[:alnum:]]+::char_traits<char32_t>, "679"std::__[[:alnum:]]+::allocator<char32_t> >$",680stl_summary_flags, true);681682AddCXXSummary(cpp_category_sp,683lldb_private::formatters::LibcxxWStringSummaryProvider,684"std::wstring summary provider",685"^std::__[[:alnum:]]+::wstring$", stl_summary_flags, true);686AddCXXSummary(cpp_category_sp,687lldb_private::formatters::LibcxxWStringSummaryProvider,688"std::wstring summary provider",689"^std::__[[:alnum:]]+::basic_string<wchar_t, "690"std::__[[:alnum:]]+::char_traits<wchar_t>, "691"std::__[[:alnum:]]+::allocator<wchar_t> >$",692stl_summary_flags, true);693694AddCXXSummary(cpp_category_sp,695lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,696"std::string_view summary provider",697"^std::__[[:alnum:]]+::string_view$", stl_summary_flags, true);698AddCXXSummary(cpp_category_sp,699lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,700"std::string_view summary provider",701"^std::__[[:alnum:]]+::basic_string_view<char, "702"std::__[[:alnum:]]+::char_traits<char> >$",703stl_summary_flags, true);704AddCXXSummary(cpp_category_sp,705lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,706"std::string_view summary provider",707"^std::__[[:alnum:]]+::basic_string_view<unsigned char, "708"std::__[[:alnum:]]+::char_traits<unsigned char> >$",709stl_summary_flags, true);710711AddCXXSummary(cpp_category_sp,712lldb_private::formatters::LibcxxStringViewSummaryProviderUTF16,713"std::u16string_view summary provider",714"^std::__[[:alnum:]]+::basic_string_view<char16_t, "715"std::__[[:alnum:]]+::char_traits<char16_t> >$",716stl_summary_flags, true);717718AddCXXSummary(cpp_category_sp,719lldb_private::formatters::LibcxxStringViewSummaryProviderUTF32,720"std::u32string_view summary provider",721"^std::__[[:alnum:]]+::basic_string_view<char32_t, "722"std::__[[:alnum:]]+::char_traits<char32_t> >$",723stl_summary_flags, true);724725AddCXXSummary(cpp_category_sp,726lldb_private::formatters::LibcxxWStringViewSummaryProvider,727"std::wstring_view summary provider",728"^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags, true);729AddCXXSummary(cpp_category_sp,730lldb_private::formatters::LibcxxWStringViewSummaryProvider,731"std::wstring_view summary provider",732"^std::__[[:alnum:]]+::basic_string_view<wchar_t, "733"std::__[[:alnum:]]+::char_traits<wchar_t> >$",734stl_summary_flags, true);735736SyntheticChildren::Flags stl_synth_flags;737stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(738false);739SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;740stl_deref_flags.SetFrontEndWantsDereference();741742AddCXXSynthetic(743cpp_category_sp,744lldb_private::formatters::LibcxxBitsetSyntheticFrontEndCreator,745"libc++ std::bitset synthetic children",746"^std::__[[:alnum:]]+::bitset<.+>$", stl_deref_flags, true);747AddCXXSynthetic(748cpp_category_sp,749lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator,750"libc++ std::vector synthetic children",751"^std::__[[:alnum:]]+::vector<.+>$", stl_deref_flags, true);752AddCXXSynthetic(753cpp_category_sp,754lldb_private::formatters::LibcxxStdValarraySyntheticFrontEndCreator,755"libc++ std::valarray synthetic children",756"^std::__[[:alnum:]]+::valarray<.+>$", stl_deref_flags, true);757AddCXXSynthetic(758cpp_category_sp,759lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEndCreator,760"libc++ std::slice_array synthetic children",761"^std::__[[:alnum:]]+::slice_array<.+>$", stl_deref_flags, true);762AddCXXSynthetic(763cpp_category_sp,764lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEndCreator,765"libc++ synthetic children for the valarray proxy arrays",766"^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",767stl_deref_flags, true);768AddCXXSynthetic(769cpp_category_sp,770lldb_private::formatters::LibcxxStdForwardListSyntheticFrontEndCreator,771"libc++ std::forward_list synthetic children",772"^std::__[[:alnum:]]+::forward_list<.+>$", stl_synth_flags, true);773AddCXXSynthetic(774cpp_category_sp,775lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator,776"libc++ std::list synthetic children",777// A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>$"778// so that it does not clash with: "^std::(__cxx11::)?list<.+>$"779"^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"780"cxx11[[:alnum:]])[[:alnum:]]*::list<.+>$",781stl_deref_flags, true);782AddCXXSynthetic(783cpp_category_sp,784lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,785"libc++ std::map synthetic children", "^std::__[[:alnum:]]+::map<.+> >$",786stl_synth_flags, true);787AddCXXSynthetic(788cpp_category_sp,789lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,790"libc++ std::set synthetic children", "^std::__[[:alnum:]]+::set<.+> >$",791stl_deref_flags, true);792AddCXXSynthetic(793cpp_category_sp,794lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,795"libc++ std::multiset synthetic children",796"^std::__[[:alnum:]]+::multiset<.+> >$", stl_deref_flags, true);797AddCXXSynthetic(798cpp_category_sp,799lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,800"libc++ std::multimap synthetic children",801"^std::__[[:alnum:]]+::multimap<.+> >$", stl_synth_flags, true);802AddCXXSynthetic(803cpp_category_sp,804lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator,805"libc++ std::unordered containers synthetic children",806"^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",807stl_synth_flags, true);808AddCXXSynthetic(809cpp_category_sp,810lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator,811"libc++ std::initializer_list synthetic children",812"^std::initializer_list<.+>$", stl_synth_flags, true);813AddCXXSynthetic(cpp_category_sp, LibcxxQueueFrontEndCreator,814"libc++ std::queue synthetic children",815"^std::__[[:alnum:]]+::queue<.+>$", stl_synth_flags, true);816AddCXXSynthetic(cpp_category_sp, LibcxxTupleFrontEndCreator,817"libc++ std::tuple synthetic children",818"^std::__[[:alnum:]]+::tuple<.*>$", stl_synth_flags, true);819AddCXXSynthetic(cpp_category_sp, LibcxxOptionalSyntheticFrontEndCreator,820"libc++ std::optional synthetic children",821"^std::__[[:alnum:]]+::optional<.+>$", stl_synth_flags, true);822AddCXXSynthetic(cpp_category_sp, LibcxxVariantFrontEndCreator,823"libc++ std::variant synthetic children",824"^std::__[[:alnum:]]+::variant<.+>$", stl_synth_flags, true);825AddCXXSynthetic(826cpp_category_sp,827lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator,828"libc++ std::atomic synthetic children",829"^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags, true);830AddCXXSynthetic(831cpp_category_sp,832lldb_private::formatters::LibcxxStdSpanSyntheticFrontEndCreator,833"libc++ std::span synthetic children", "^std::__[[:alnum:]]+::span<.+>$",834stl_deref_flags, true);835AddCXXSynthetic(836cpp_category_sp,837lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEndCreator,838"libc++ std::ranges::ref_view synthetic children",839"^std::__[[:alnum:]]+::ranges::ref_view<.+>$", stl_deref_flags, true);840841cpp_category_sp->AddTypeSynthetic(842"^std::__[[:alnum:]]+::deque<.+>$", eFormatterMatchRegex,843SyntheticChildrenSP(new ScriptedSyntheticChildren(844stl_synth_flags,845"lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));846847AddCXXSynthetic(848cpp_category_sp,849lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator,850"shared_ptr synthetic children", "^std::__[[:alnum:]]+::shared_ptr<.+>$",851stl_synth_flags, true);852853static constexpr const char *const libcxx_std_unique_ptr_regex =854"^std::__[[:alnum:]]+::unique_ptr<.+>$";855AddCXXSynthetic(856cpp_category_sp,857lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEndCreator,858"unique_ptr synthetic children", libcxx_std_unique_ptr_regex,859stl_synth_flags, true);860861AddCXXSynthetic(862cpp_category_sp,863lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator,864"weak_ptr synthetic children", "^std::__[[:alnum:]]+::weak_ptr<.+>$",865stl_synth_flags, true);866AddCXXSummary(cpp_category_sp,867lldb_private::formatters::LibcxxFunctionSummaryProvider,868"libc++ std::function summary provider",869"^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags, true);870871static constexpr const char *const libcxx_std_coroutine_handle_regex =872"^std::__[[:alnum:]]+::coroutine_handle<.+>$";873AddCXXSynthetic(874cpp_category_sp,875lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEndCreator,876"coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,877stl_deref_flags, true);878879stl_summary_flags.SetDontShowChildren(false);880stl_summary_flags.SetSkipPointers(false);881AddCXXSummary(cpp_category_sp,882lldb_private::formatters::LibcxxContainerSummaryProvider,883"libc++ std::bitset summary provider",884"^std::__[[:alnum:]]+::bitset<.+>$", stl_summary_flags, true);885AddCXXSummary(cpp_category_sp,886lldb_private::formatters::LibcxxContainerSummaryProvider,887"libc++ std::vector summary provider",888"^std::__[[:alnum:]]+::vector<.+>$", stl_summary_flags, true);889AddCXXSummary(cpp_category_sp,890lldb_private::formatters::LibcxxContainerSummaryProvider,891"libc++ std::valarray summary provider",892"^std::__[[:alnum:]]+::valarray<.+>$", stl_summary_flags, true);893AddCXXSummary(cpp_category_sp,894lldb_private::formatters::LibcxxStdSliceArraySummaryProvider,895"libc++ std::slice_array summary provider",896"^std::__[[:alnum:]]+::slice_array<.+>$", stl_summary_flags,897true);898AddCXXSummary(cpp_category_sp,899lldb_private::formatters::LibcxxContainerSummaryProvider,900"libc++ summary provider for the valarray proxy arrays",901"^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",902stl_summary_flags, true);903AddCXXSummary(904cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,905"libc++ std::list summary provider",906"^std::__[[:alnum:]]+::forward_list<.+>$", stl_summary_flags, true);907AddCXXSummary(908cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,909"libc++ std::list summary provider",910// A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>$"911// so that it does not clash with: "^std::(__cxx11::)?list<.+>$"912"^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"913"cxx11[[:alnum:]])[[:alnum:]]*::list<.+>$",914stl_summary_flags, true);915AddCXXSummary(cpp_category_sp,916lldb_private::formatters::LibcxxContainerSummaryProvider,917"libc++ std::map summary provider",918"^std::__[[:alnum:]]+::map<.+>$", stl_summary_flags, true);919AddCXXSummary(cpp_category_sp,920lldb_private::formatters::LibcxxContainerSummaryProvider,921"libc++ std::deque summary provider",922"^std::__[[:alnum:]]+::deque<.+>$", stl_summary_flags, true);923AddCXXSummary(cpp_category_sp,924lldb_private::formatters::LibcxxContainerSummaryProvider,925"libc++ std::queue summary provider",926"^std::__[[:alnum:]]+::queue<.+>$", stl_summary_flags, true);927AddCXXSummary(cpp_category_sp,928lldb_private::formatters::LibcxxContainerSummaryProvider,929"libc++ std::set summary provider",930"^std::__[[:alnum:]]+::set<.+>$", stl_summary_flags, true);931AddCXXSummary(cpp_category_sp,932lldb_private::formatters::LibcxxContainerSummaryProvider,933"libc++ std::multiset summary provider",934"^std::__[[:alnum:]]+::multiset<.+>$", stl_summary_flags, true);935AddCXXSummary(cpp_category_sp,936lldb_private::formatters::LibcxxContainerSummaryProvider,937"libc++ std::multimap summary provider",938"^std::__[[:alnum:]]+::multimap<.+>$", stl_summary_flags, true);939AddCXXSummary(cpp_category_sp,940lldb_private::formatters::LibcxxContainerSummaryProvider,941"libc++ std::unordered containers summary provider",942"^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",943stl_summary_flags, true);944AddCXXSummary(cpp_category_sp, LibcxxContainerSummaryProvider,945"libc++ std::tuple summary provider",946"^std::__[[:alnum:]]+::tuple<.*>$", stl_summary_flags, true);947AddCXXSummary(cpp_category_sp,948lldb_private::formatters::LibCxxAtomicSummaryProvider,949"libc++ std::atomic summary provider",950"^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags, true);951AddCXXSummary(cpp_category_sp,952lldb_private::formatters::GenericOptionalSummaryProvider,953"libc++ std::optional summary provider",954"^std::__[[:alnum:]]+::optional<.+>$", stl_summary_flags, true);955AddCXXSummary(cpp_category_sp,956lldb_private::formatters::LibcxxVariantSummaryProvider,957"libc++ std::variant summary provider",958"^std::__[[:alnum:]]+::variant<.+>$", stl_summary_flags, true);959AddCXXSummary(cpp_category_sp,960lldb_private::formatters::LibcxxContainerSummaryProvider,961"libc++ std::span summary provider",962"^std::__[[:alnum:]]+::span<.+>$", stl_summary_flags, true);963964stl_summary_flags.SetSkipPointers(true);965966AddCXXSummary(cpp_category_sp,967lldb_private::formatters::LibcxxSmartPointerSummaryProvider,968"libc++ std::shared_ptr summary provider",969"^std::__[[:alnum:]]+::shared_ptr<.+>$", stl_summary_flags,970true);971AddCXXSummary(cpp_category_sp,972lldb_private::formatters::LibcxxSmartPointerSummaryProvider,973"libc++ std::weak_ptr summary provider",974"^std::__[[:alnum:]]+::weak_ptr<.+>$", stl_summary_flags, true);975AddCXXSummary(cpp_category_sp,976lldb_private::formatters::LibcxxUniquePointerSummaryProvider,977"libc++ std::unique_ptr summary provider",978libcxx_std_unique_ptr_regex, stl_summary_flags, true);979980AddCXXSummary(cpp_category_sp,981lldb_private::formatters::StdlibCoroutineHandleSummaryProvider,982"libc++ std::coroutine_handle summary provider",983libcxx_std_coroutine_handle_regex, stl_summary_flags, true);984985AddCXXSynthetic(986cpp_category_sp,987lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator,988"std::vector iterator synthetic children",989"^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags, true);990991AddCXXSynthetic(992cpp_category_sp,993lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator,994"std::map iterator synthetic children",995"^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,996true);997998AddCXXSynthetic(cpp_category_sp,999lldb_private::formatters::1000LibCxxUnorderedMapIteratorSyntheticFrontEndCreator,1001"std::unordered_map iterator synthetic children",1002"^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",1003stl_synth_flags, true);1004// Chrono duration typedefs1005cpp_category_sp->AddTypeSummary(1006"^std::__[[:alnum:]]+::chrono::nanoseconds", eFormatterMatchRegex,1007TypeSummaryImplSP(new StringSummaryFormat(1008eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ns")));1009cpp_category_sp->AddTypeSummary(1010"^std::__[[:alnum:]]+::chrono::microseconds", eFormatterMatchRegex,1011TypeSummaryImplSP(new StringSummaryFormat(1012eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} µs")));1013cpp_category_sp->AddTypeSummary(1014"^std::__[[:alnum:]]+::chrono::milliseconds", eFormatterMatchRegex,1015TypeSummaryImplSP(new StringSummaryFormat(1016eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ms")));1017cpp_category_sp->AddTypeSummary(1018"^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,1019TypeSummaryImplSP(new StringSummaryFormat(1020eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));1021cpp_category_sp->AddTypeSummary(1022"^std::__[[:alnum:]]+::chrono::minutes", eFormatterMatchRegex,1023TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1024eTypeOptionHideValue,1025"${var.__rep_} min")));1026cpp_category_sp->AddTypeSummary(1027"^std::__[[:alnum:]]+::chrono::hours", eFormatterMatchRegex,1028TypeSummaryImplSP(new StringSummaryFormat(1029eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} h")));10301031cpp_category_sp->AddTypeSummary(1032"^std::__[[:alnum:]]+::chrono::days", eFormatterMatchRegex,1033TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1034eTypeOptionHideValue,1035"${var.__rep_} days")));1036cpp_category_sp->AddTypeSummary(1037"^std::__[[:alnum:]]+::chrono::weeks", eFormatterMatchRegex,1038TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1039eTypeOptionHideValue,1040"${var.__rep_} weeks")));1041cpp_category_sp->AddTypeSummary(1042"^std::__[[:alnum:]]+::chrono::months", eFormatterMatchRegex,1043TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1044eTypeOptionHideValue,1045"${var.__rep_} months")));1046cpp_category_sp->AddTypeSummary(1047"^std::__[[:alnum:]]+::chrono::years", eFormatterMatchRegex,1048TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1049eTypeOptionHideValue,1050"${var.__rep_} years")));1051cpp_category_sp->AddTypeSummary(1052"^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,1053TypeSummaryImplSP(new StringSummaryFormat(1054eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));10551056// Chrono time point types10571058AddCXXSummary(cpp_category_sp,1059lldb_private::formatters::LibcxxChronoSysSecondsSummaryProvider,1060"libc++ std::chrono::sys_seconds summary provider",1061"^std::__[[:alnum:]]+::chrono::time_point<"1062"std::__[[:alnum:]]+::chrono::system_clock, "1063"std::__[[:alnum:]]+::chrono::duration<.*, "1064"std::__[[:alnum:]]+::ratio<1, 1> "1065"> >$",1066eTypeOptionHideChildren | eTypeOptionHideValue |1067eTypeOptionCascade,1068true);1069AddCXXSummary(cpp_category_sp,1070lldb_private::formatters::LibcxxChronoSysDaysSummaryProvider,1071"libc++ std::chrono::sys_seconds summary provider",1072"^std::__[[:alnum:]]+::chrono::time_point<"1073"std::__[[:alnum:]]+::chrono::system_clock, "1074"std::__[[:alnum:]]+::chrono::duration<int, "1075"std::__[[:alnum:]]+::ratio<86400, 1> "1076"> >$",1077eTypeOptionHideChildren | eTypeOptionHideValue |1078eTypeOptionCascade,1079true);10801081AddCXXSummary(1082cpp_category_sp,1083lldb_private::formatters::LibcxxChronoLocalSecondsSummaryProvider,1084"libc++ std::chrono::local_seconds summary provider",1085"^std::__[[:alnum:]]+::chrono::time_point<"1086"std::__[[:alnum:]]+::chrono::local_t, "1087"std::__[[:alnum:]]+::chrono::duration<.*, "1088"std::__[[:alnum:]]+::ratio<1, 1> "1089"> >$",1090eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,1091true);1092AddCXXSummary(cpp_category_sp,1093lldb_private::formatters::LibcxxChronoLocalDaysSummaryProvider,1094"libc++ std::chrono::local_seconds summary provider",1095"^std::__[[:alnum:]]+::chrono::time_point<"1096"std::__[[:alnum:]]+::chrono::local_t, "1097"std::__[[:alnum:]]+::chrono::duration<int, "1098"std::__[[:alnum:]]+::ratio<86400, 1> "1099"> >$",1100eTypeOptionHideChildren | eTypeOptionHideValue |1101eTypeOptionCascade,1102true);11031104// Chrono calendar types11051106cpp_category_sp->AddTypeSummary(1107"^std::__[[:alnum:]]+::chrono::day$", eFormatterMatchRegex,1108TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1109eTypeOptionHideValue,1110"day=${var.__d_%u}")));11111112AddCXXSummary(cpp_category_sp,1113lldb_private::formatters::LibcxxChronoMonthSummaryProvider,1114"libc++ std::chrono::month summary provider",1115"^std::__[[:alnum:]]+::chrono::month$",1116eTypeOptionHideChildren | eTypeOptionHideValue, true);11171118cpp_category_sp->AddTypeSummary(1119"^std::__[[:alnum:]]+::chrono::year$", eFormatterMatchRegex,1120TypeSummaryImplSP(new StringSummaryFormat(1121eTypeOptionHideChildren | eTypeOptionHideValue, "year=${var.__y_}")));11221123AddCXXSummary(cpp_category_sp,1124lldb_private::formatters::LibcxxChronoWeekdaySummaryProvider,1125"libc++ std::chrono::weekday summary provider",1126"^std::__[[:alnum:]]+::chrono::weekday$",1127eTypeOptionHideChildren | eTypeOptionHideValue, true);11281129cpp_category_sp->AddTypeSummary(1130"^std::__[[:alnum:]]+::chrono::weekday_indexed$", eFormatterMatchRegex,1131TypeSummaryImplSP(new StringSummaryFormat(1132eTypeOptionHideChildren | eTypeOptionHideValue,1133"${var.__wd_} index=${var.__idx_%u}")));11341135cpp_category_sp->AddTypeSummary(1136"^std::__[[:alnum:]]+::chrono::weekday_last$", eFormatterMatchRegex,1137TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1138eTypeOptionHideValue,1139"${var.__wd_} index=last")));1140cpp_category_sp->AddTypeSummary(1141"^std::__[[:alnum:]]+::chrono::month_day$", eFormatterMatchRegex,1142TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1143eTypeOptionHideValue,1144"${var.__m_} ${var.__d_}")));1145cpp_category_sp->AddTypeSummary(1146"^std::__[[:alnum:]]+::chrono::month_day_last$", eFormatterMatchRegex,1147TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1148eTypeOptionHideValue,1149"${var.__m_} day=last")));11501151cpp_category_sp->AddTypeSummary(1152"^std::__[[:alnum:]]+::chrono::month_weekday$", eFormatterMatchRegex,1153TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1154eTypeOptionHideValue,1155"${var.__m_} ${var.__wdi_}")));11561157cpp_category_sp->AddTypeSummary(1158"^std::__[[:alnum:]]+::chrono::month_weekday_last$", eFormatterMatchRegex,1159TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1160eTypeOptionHideValue,1161"${var.__m_} ${var.__wdl_}")));11621163cpp_category_sp->AddTypeSummary(1164"^std::__[[:alnum:]]+::chrono::year_month$", eFormatterMatchRegex,1165TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1166eTypeOptionHideValue,1167"${var.__y_} ${var.__m_}")));11681169AddCXXSummary(1170cpp_category_sp,1171lldb_private::formatters::LibcxxChronoYearMonthDaySummaryProvider,1172"libc++ std::chrono::year_month_day summary provider",1173"^std::__[[:alnum:]]+::chrono::year_month_day$",1174eTypeOptionHideChildren | eTypeOptionHideValue, true);11751176cpp_category_sp->AddTypeSummary(1177"^std::__[[:alnum:]]+::chrono::year_month_day_last$",1178eFormatterMatchRegex,1179TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |1180eTypeOptionHideValue,1181"${var.__y_} ${var.__mdl_}")));11821183cpp_category_sp->AddTypeSummary(1184"^std::__[[:alnum:]]+::chrono::year_month_weekday$", eFormatterMatchRegex,1185TypeSummaryImplSP(new StringSummaryFormat(1186eTypeOptionHideChildren | eTypeOptionHideValue,1187"${var.__y_} ${var.__m_} ${var.__wdi_}")));11881189cpp_category_sp->AddTypeSummary(1190"^std::__[[:alnum:]]+::chrono::year_month_weekday_last$",1191eFormatterMatchRegex,1192TypeSummaryImplSP(new StringSummaryFormat(1193eTypeOptionHideChildren | eTypeOptionHideValue,1194"${var.__y_} ${var.__m_} ${var.__wdl_}")));1195}11961197static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {1198if (!cpp_category_sp)1199return;12001201TypeSummaryImpl::Flags stl_summary_flags;1202stl_summary_flags.SetCascades(true)1203.SetSkipPointers(false)1204.SetSkipReferences(false)1205.SetDontShowChildren(true)1206.SetDontShowValue(true)1207.SetShowMembersOneLiner(false)1208.SetHideItemNames(false);12091210lldb::TypeSummaryImplSP std_string_summary_sp(1211new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p}"));12121213lldb::TypeSummaryImplSP cxx11_string_summary_sp(new CXXFunctionSummaryFormat(1214stl_summary_flags, LibStdcppStringSummaryProvider,1215"libstdc++ c++11 std::string summary provider"));1216lldb::TypeSummaryImplSP cxx11_wstring_summary_sp(new CXXFunctionSummaryFormat(1217stl_summary_flags, LibStdcppWStringSummaryProvider,1218"libstdc++ c++11 std::wstring summary provider"));12191220cpp_category_sp->AddTypeSummary("std::string", eFormatterMatchExact,1221std_string_summary_sp);1222cpp_category_sp->AddTypeSummary("std::basic_string<char>",1223eFormatterMatchExact, std_string_summary_sp);1224cpp_category_sp->AddTypeSummary(1225"std::basic_string<char,std::char_traits<char>,std::allocator<char> >",1226eFormatterMatchExact, std_string_summary_sp);1227cpp_category_sp->AddTypeSummary(1228"std::basic_string<char, std::char_traits<char>, std::allocator<char> >",1229eFormatterMatchExact, std_string_summary_sp);12301231cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact,1232cxx11_string_summary_sp);1233cpp_category_sp->AddTypeSummary(1234"std::__cxx11::basic_string<char, std::char_traits<char>, "1235"std::allocator<char> >",1236eFormatterMatchExact, cxx11_string_summary_sp);1237cpp_category_sp->AddTypeSummary("std::__cxx11::basic_string<unsigned char, "1238"std::char_traits<unsigned char>, "1239"std::allocator<unsigned char> >",1240eFormatterMatchExact,1241cxx11_string_summary_sp);12421243// making sure we force-pick the summary for printing wstring (_M_p is a1244// wchar_t*)1245lldb::TypeSummaryImplSP std_wstring_summary_sp(1246new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p%S}"));12471248cpp_category_sp->AddTypeSummary("std::wstring", eFormatterMatchExact,1249std_wstring_summary_sp);1250cpp_category_sp->AddTypeSummary("std::basic_string<wchar_t>",1251eFormatterMatchExact, std_wstring_summary_sp);1252cpp_category_sp->AddTypeSummary("std::basic_string<wchar_t,std::char_traits<"1253"wchar_t>,std::allocator<wchar_t> >",1254eFormatterMatchExact, std_wstring_summary_sp);1255cpp_category_sp->AddTypeSummary(1256"std::basic_string<wchar_t, std::char_traits<wchar_t>, "1257"std::allocator<wchar_t> >",1258eFormatterMatchExact, std_wstring_summary_sp);12591260cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact,1261cxx11_wstring_summary_sp);1262cpp_category_sp->AddTypeSummary(1263"std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, "1264"std::allocator<wchar_t> >",1265eFormatterMatchExact, cxx11_wstring_summary_sp);12661267SyntheticChildren::Flags stl_synth_flags;1268stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(1269false);1270SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;1271stl_deref_flags.SetFrontEndWantsDereference();12721273cpp_category_sp->AddTypeSynthetic(1274"^std::vector<.+>(( )?&)?$", eFormatterMatchRegex,1275SyntheticChildrenSP(new ScriptedSyntheticChildren(1276stl_synth_flags,1277"lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));1278cpp_category_sp->AddTypeSynthetic(1279"^std::map<.+> >(( )?&)?$", eFormatterMatchRegex,1280SyntheticChildrenSP(new ScriptedSyntheticChildren(1281stl_synth_flags,1282"lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));1283cpp_category_sp->AddTypeSynthetic(1284"^std::deque<.+>(( )?&)?$", eFormatterMatchRegex,1285SyntheticChildrenSP(new ScriptedSyntheticChildren(1286stl_deref_flags,1287"lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));1288cpp_category_sp->AddTypeSynthetic(1289"^std::set<.+> >(( )?&)?$", eFormatterMatchRegex,1290SyntheticChildrenSP(new ScriptedSyntheticChildren(1291stl_deref_flags,1292"lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));1293cpp_category_sp->AddTypeSynthetic(1294"^std::multimap<.+> >(( )?&)?$", eFormatterMatchRegex,1295SyntheticChildrenSP(new ScriptedSyntheticChildren(1296stl_deref_flags,1297"lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));1298cpp_category_sp->AddTypeSynthetic(1299"^std::multiset<.+> >(( )?&)?$", eFormatterMatchRegex,1300SyntheticChildrenSP(new ScriptedSyntheticChildren(1301stl_deref_flags,1302"lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));1303cpp_category_sp->AddTypeSynthetic(1304"^std::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex,1305SyntheticChildrenSP(new ScriptedSyntheticChildren(1306stl_deref_flags,1307"lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));1308cpp_category_sp->AddTypeSynthetic(1309"^std::(__cxx11::)?list<.+>(( )?&)?$", eFormatterMatchRegex,1310SyntheticChildrenSP(new ScriptedSyntheticChildren(1311stl_deref_flags,1312"lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));1313cpp_category_sp->AddTypeSynthetic(1314"^std::(__cxx11::)?forward_list<.+>(( )?&)?$", eFormatterMatchRegex,1315SyntheticChildrenSP(new ScriptedSyntheticChildren(1316stl_synth_flags,1317"lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));1318cpp_category_sp->AddTypeSynthetic(1319"^std::variant<.+>$", eFormatterMatchRegex,1320SyntheticChildrenSP(new ScriptedSyntheticChildren(1321stl_synth_flags,1322"lldb.formatters.cpp.gnu_libstdcpp.VariantSynthProvider")));13231324stl_summary_flags.SetDontShowChildren(false);1325stl_summary_flags.SetSkipPointers(false);1326cpp_category_sp->AddTypeSummary("^std::bitset<.+>(( )?&)?$",1327eFormatterMatchRegex,1328TypeSummaryImplSP(new StringSummaryFormat(1329stl_summary_flags, "size=${svar%#}")));1330cpp_category_sp->AddTypeSummary("^std::vector<.+>(( )?&)?$",1331eFormatterMatchRegex,1332TypeSummaryImplSP(new StringSummaryFormat(1333stl_summary_flags, "size=${svar%#}")));1334cpp_category_sp->AddTypeSummary("^std::map<.+> >(( )?&)?$",1335eFormatterMatchRegex,1336TypeSummaryImplSP(new StringSummaryFormat(1337stl_summary_flags, "size=${svar%#}")));1338cpp_category_sp->AddTypeSummary("^std::set<.+> >(( )?&)?$",1339eFormatterMatchRegex,1340TypeSummaryImplSP(new StringSummaryFormat(1341stl_summary_flags, "size=${svar%#}")));1342cpp_category_sp->AddTypeSummary("^std::deque<.+>(( )?&)?$",1343eFormatterMatchRegex,1344TypeSummaryImplSP(new StringSummaryFormat(1345stl_summary_flags, "size=${svar%#}")));1346cpp_category_sp->AddTypeSummary("^std::multimap<.+> >(( )?&)?$",1347eFormatterMatchRegex,1348TypeSummaryImplSP(new StringSummaryFormat(1349stl_summary_flags, "size=${svar%#}")));1350cpp_category_sp->AddTypeSummary("^std::multiset<.+> >(( )?&)?$",1351eFormatterMatchRegex,1352TypeSummaryImplSP(new StringSummaryFormat(1353stl_summary_flags, "size=${svar%#}")));1354cpp_category_sp->AddTypeSummary("^std::unordered_(multi)?(map|set)<.+> >$",1355eFormatterMatchRegex,1356TypeSummaryImplSP(new StringSummaryFormat(1357stl_summary_flags, "size=${svar%#}")));1358cpp_category_sp->AddTypeSummary("^std::(__cxx11::)?list<.+>(( )?&)?$",1359eFormatterMatchRegex,1360TypeSummaryImplSP(new StringSummaryFormat(1361stl_summary_flags, "size=${svar%#}")));1362cpp_category_sp->AddTypeSummary(1363"^std::(__cxx11::)?forward_list<.+>(( )?&)?$", eFormatterMatchRegex,1364TypeSummaryImplSP(new ScriptSummaryFormat(1365stl_summary_flags,1366"lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));1367cpp_category_sp->AddTypeSummary(1368"^std::variant<.+>$", eFormatterMatchRegex,1369TypeSummaryImplSP(new ScriptSummaryFormat(1370stl_summary_flags,1371"lldb.formatters.cpp.gnu_libstdcpp.VariantSummaryProvider")));13721373AddCXXSynthetic(1374cpp_category_sp,1375lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator,1376"std::vector iterator synthetic children",1377"^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags, true);13781379AddCXXSynthetic(1380cpp_category_sp,1381lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator,1382"std::map iterator synthetic children", "^std::_Rb_tree_iterator<.+>$",1383stl_synth_flags, true);13841385AddCXXSynthetic(1386cpp_category_sp,1387lldb_private::formatters::LibStdcppUniquePtrSyntheticFrontEndCreator,1388"std::unique_ptr synthetic children", "^std::unique_ptr<.+>(( )?&)?$",1389stl_synth_flags, true);1390AddCXXSynthetic(1391cpp_category_sp,1392lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator,1393"std::shared_ptr synthetic children", "^std::shared_ptr<.+>(( )?&)?$",1394stl_synth_flags, true);1395AddCXXSynthetic(1396cpp_category_sp,1397lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator,1398"std::weak_ptr synthetic children", "^std::weak_ptr<.+>(( )?&)?$",1399stl_synth_flags, true);1400AddCXXSynthetic(1401cpp_category_sp,1402lldb_private::formatters::LibStdcppTupleSyntheticFrontEndCreator,1403"std::tuple synthetic children", "^std::tuple<.+>(( )?&)?$",1404stl_synth_flags, true);14051406static constexpr const char *const libstdcpp_std_coroutine_handle_regex =1407"^std::coroutine_handle<.+>(( )?&)?$";1408AddCXXSynthetic(1409cpp_category_sp,1410lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEndCreator,1411"std::coroutine_handle synthetic children",1412libstdcpp_std_coroutine_handle_regex, stl_deref_flags, true);14131414AddCXXSynthetic(1415cpp_category_sp,1416lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator,1417"std::bitset synthetic child", "^std::bitset<.+>(( )?&)?$",1418stl_deref_flags, true);14191420AddCXXSynthetic(1421cpp_category_sp,1422lldb_private::formatters::LibStdcppOptionalSyntheticFrontEndCreator,1423"std::optional synthetic child", "^std::optional<.+>(( )?&)?$",1424stl_deref_flags, true);14251426AddCXXSummary(cpp_category_sp,1427lldb_private::formatters::LibStdcppUniquePointerSummaryProvider,1428"libstdc++ std::unique_ptr summary provider",1429"^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags, true);1430AddCXXSummary(cpp_category_sp,1431lldb_private::formatters::LibStdcppSmartPointerSummaryProvider,1432"libstdc++ std::shared_ptr summary provider",1433"^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags, true);1434AddCXXSummary(cpp_category_sp,1435lldb_private::formatters::LibStdcppSmartPointerSummaryProvider,1436"libstdc++ std::weak_ptr summary provider",1437"^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags, true);1438AddCXXSummary(cpp_category_sp,1439lldb_private::formatters::StdlibCoroutineHandleSummaryProvider,1440"libstdc++ std::coroutine_handle summary provider",1441libstdcpp_std_coroutine_handle_regex, stl_summary_flags, true);1442AddCXXSummary(cpp_category_sp,1443lldb_private::formatters::GenericOptionalSummaryProvider,1444"libstd++ std::optional summary provider",1445"^std::optional<.+>(( )?&)?$", stl_summary_flags, true);1446}14471448static void LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {1449if (!cpp_category_sp)1450return;14511452TypeSummaryImpl::Flags string_flags;1453string_flags.SetCascades(true)1454.SetSkipPointers(true)1455.SetSkipReferences(false)1456.SetDontShowChildren(true)1457.SetDontShowValue(false)1458.SetShowMembersOneLiner(false)1459.SetHideItemNames(false);14601461TypeSummaryImpl::Flags string_array_flags;1462string_array_flags.SetCascades(true)1463.SetSkipPointers(true)1464.SetSkipReferences(false)1465.SetDontShowChildren(true)1466.SetDontShowValue(true)1467.SetShowMembersOneLiner(false)1468.SetHideItemNames(false);14691470AddCXXSummary(cpp_category_sp,1471lldb_private::formatters::Char8StringSummaryProvider,1472"char8_t * summary provider", "char8_t *", string_flags);1473AddCXXSummary(cpp_category_sp,1474lldb_private::formatters::Char8StringSummaryProvider,1475"char8_t [] summary provider", "char8_t ?\\[[0-9]+\\]",1476string_array_flags, true);14771478AddCXXSummary(cpp_category_sp,1479lldb_private::formatters::Char16StringSummaryProvider,1480"char16_t * summary provider", "char16_t *", string_flags);1481AddCXXSummary(cpp_category_sp,1482lldb_private::formatters::Char16StringSummaryProvider,1483"char16_t [] summary provider", "char16_t ?\\[[0-9]+\\]",1484string_array_flags, true);14851486AddCXXSummary(cpp_category_sp,1487lldb_private::formatters::Char32StringSummaryProvider,1488"char32_t * summary provider", "char32_t *", string_flags);1489AddCXXSummary(cpp_category_sp,1490lldb_private::formatters::Char32StringSummaryProvider,1491"char32_t [] summary provider", "char32_t ?\\[[0-9]+\\]",1492string_array_flags, true);14931494AddCXXSummary(cpp_category_sp,1495lldb_private::formatters::WCharStringSummaryProvider,1496"wchar_t * summary provider", "wchar_t *", string_flags);1497AddCXXSummary(cpp_category_sp,1498lldb_private::formatters::WCharStringSummaryProvider,1499"wchar_t * summary provider", "wchar_t ?\\[[0-9]+\\]",1500string_array_flags, true);15011502AddCXXSummary(cpp_category_sp,1503lldb_private::formatters::Char16StringSummaryProvider,1504"unichar * summary provider", "unichar *", string_flags);15051506TypeSummaryImpl::Flags widechar_flags;1507widechar_flags.SetDontShowValue(true)1508.SetSkipPointers(true)1509.SetSkipReferences(false)1510.SetCascades(true)1511.SetDontShowChildren(true)1512.SetHideItemNames(true)1513.SetShowMembersOneLiner(false);15141515AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char8SummaryProvider,1516"char8_t summary provider", "char8_t", widechar_flags);1517AddCXXSummary(cpp_category_sp,1518lldb_private::formatters::Char16SummaryProvider,1519"char16_t summary provider", "char16_t", widechar_flags);1520AddCXXSummary(cpp_category_sp,1521lldb_private::formatters::Char32SummaryProvider,1522"char32_t summary provider", "char32_t", widechar_flags);1523AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharSummaryProvider,1524"wchar_t summary provider", "wchar_t", widechar_flags);15251526AddCXXSummary(cpp_category_sp,1527lldb_private::formatters::Char16SummaryProvider,1528"unichar summary provider", "unichar", widechar_flags);1529}15301531std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() {1532class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger {1533public:1534CompilerType AdjustForInclusion(CompilerType &candidate) override {1535LanguageType lang_type(candidate.GetMinimumLanguage());1536if (!Language::LanguageIsC(lang_type) &&1537!Language::LanguageIsCPlusPlus(lang_type))1538return CompilerType();1539if (candidate.IsTypedefType())1540return candidate.GetTypedefedType();1541return candidate;1542}1543};15441545return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger());1546}15471548lldb::TypeCategoryImplSP CPlusPlusLanguage::GetFormatters() {1549static llvm::once_flag g_initialize;1550static TypeCategoryImplSP g_category;15511552llvm::call_once(g_initialize, [this]() -> void {1553DataVisualization::Categories::GetCategory(ConstString(GetPluginName()),1554g_category);1555if (g_category) {1556LoadLibStdcppFormatters(g_category);1557LoadLibCxxFormatters(g_category);1558LoadSystemFormatters(g_category);1559}1560});1561return g_category;1562}15631564HardcodedFormatters::HardcodedSummaryFinder1565CPlusPlusLanguage::GetHardcodedSummaries() {1566static llvm::once_flag g_initialize;1567static ConstString g_vectortypes("VectorTypes");1568static HardcodedFormatters::HardcodedSummaryFinder g_formatters;15691570llvm::call_once(g_initialize, []() -> void {1571g_formatters.push_back(1572[](lldb_private::ValueObject &valobj, lldb::DynamicValueType,1573FormatManager &) -> TypeSummaryImpl::SharedPointer {1574static CXXFunctionSummaryFormat::SharedPointer formatter_sp(1575new CXXFunctionSummaryFormat(1576TypeSummaryImpl::Flags(),1577lldb_private::formatters::CXXFunctionPointerSummaryProvider,1578"Function pointer summary provider"));1579if (CompilerType CT = valobj.GetCompilerType();1580CT.IsFunctionPointerType() || CT.IsMemberFunctionPointerType() ||1581valobj.GetValueType() == lldb::eValueTypeVTableEntry) {1582return formatter_sp;1583}1584return nullptr;1585});1586g_formatters.push_back(1587[](lldb_private::ValueObject &valobj, lldb::DynamicValueType,1588FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer {1589static CXXFunctionSummaryFormat::SharedPointer formatter_sp(1590new CXXFunctionSummaryFormat(1591TypeSummaryImpl::Flags()1592.SetCascades(true)1593.SetDontShowChildren(true)1594.SetHideItemNames(true)1595.SetShowMembersOneLiner(true)1596.SetSkipPointers(true)1597.SetSkipReferences(false),1598lldb_private::formatters::VectorTypeSummaryProvider,1599"vector_type pointer summary provider"));1600if (valobj.GetCompilerType().IsVectorType()) {1601if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())1602return formatter_sp;1603}1604return nullptr;1605});1606g_formatters.push_back(1607[](lldb_private::ValueObject &valobj, lldb::DynamicValueType,1608FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer {1609static CXXFunctionSummaryFormat::SharedPointer formatter_sp(1610new CXXFunctionSummaryFormat(1611TypeSummaryImpl::Flags()1612.SetCascades(true)1613.SetDontShowChildren(true)1614.SetHideItemNames(true)1615.SetShowMembersOneLiner(true)1616.SetSkipPointers(true)1617.SetSkipReferences(false),1618lldb_private::formatters::BlockPointerSummaryProvider,1619"block pointer summary provider"));1620if (valobj.GetCompilerType().IsBlockPointerType()) {1621return formatter_sp;1622}1623return nullptr;1624});1625});16261627return g_formatters;1628}16291630HardcodedFormatters::HardcodedSyntheticFinder1631CPlusPlusLanguage::GetHardcodedSynthetics() {1632static llvm::once_flag g_initialize;1633static ConstString g_vectortypes("VectorTypes");1634static HardcodedFormatters::HardcodedSyntheticFinder g_formatters;16351636llvm::call_once(g_initialize, []() -> void {1637g_formatters.push_back([](lldb_private::ValueObject &valobj,1638lldb::DynamicValueType, FormatManager &fmt_mgr)1639-> SyntheticChildren::SharedPointer {1640static CXXSyntheticChildren::SharedPointer formatter_sp(1641new CXXSyntheticChildren(1642SyntheticChildren::Flags()1643.SetCascades(true)1644.SetSkipPointers(true)1645.SetSkipReferences(true)1646.SetNonCacheable(true),1647"vector_type synthetic children",1648lldb_private::formatters::VectorTypeSyntheticFrontEndCreator));1649if (valobj.GetCompilerType().IsVectorType()) {1650if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())1651return formatter_sp;1652}1653return nullptr;1654});1655g_formatters.push_back([](lldb_private::ValueObject &valobj,1656lldb::DynamicValueType, FormatManager &fmt_mgr)1657-> SyntheticChildren::SharedPointer {1658static CXXSyntheticChildren::SharedPointer formatter_sp(1659new CXXSyntheticChildren(1660SyntheticChildren::Flags()1661.SetCascades(true)1662.SetSkipPointers(true)1663.SetSkipReferences(true)1664.SetNonCacheable(true),1665"block pointer synthetic children",1666lldb_private::formatters::BlockPointerSyntheticFrontEndCreator));1667if (valobj.GetCompilerType().IsBlockPointerType()) {1668return formatter_sp;1669}1670return nullptr;1671});1672});16731674return g_formatters;1675}16761677bool CPlusPlusLanguage::IsNilReference(ValueObject &valobj) {1678if (!Language::LanguageIsCPlusPlus(valobj.GetObjectRuntimeLanguage()) ||1679!valobj.IsPointerType())1680return false;1681bool canReadValue = true;1682bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;1683return canReadValue && isZero;1684}16851686bool CPlusPlusLanguage::IsSourceFile(llvm::StringRef file_path) const {1687const auto suffixes = {".cpp", ".cxx", ".c++", ".cc", ".c",1688".h", ".hh", ".hpp", ".hxx", ".h++"};1689for (auto suffix : suffixes) {1690if (file_path.ends_with_insensitive(suffix))1691return true;1692}16931694// Check if we're in a STL path (where the files usually have no extension1695// that we could check for.1696return file_path.contains("/usr/include/c++/");1697}16981699bool CPlusPlusLanguage::GetFunctionDisplayName(1700const SymbolContext *sc, const ExecutionContext *exe_ctx,1701FunctionNameRepresentation representation, Stream &s) {1702switch (representation) {1703case FunctionNameRepresentation::eNameWithArgs: {1704// Print the function name with arguments in it1705if (sc->function) {1706ExecutionContextScope *exe_scope =1707exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;1708const char *cstr = sc->function->GetName().AsCString(nullptr);1709if (cstr) {1710const InlineFunctionInfo *inline_info = nullptr;1711VariableListSP variable_list_sp;1712bool get_function_vars = true;1713if (sc->block) {1714Block *inline_block = sc->block->GetContainingInlinedBlock();17151716if (inline_block) {1717get_function_vars = false;1718inline_info = inline_block->GetInlinedFunctionInfo();1719if (inline_info)1720variable_list_sp = inline_block->GetBlockVariableList(true);1721}1722}17231724if (get_function_vars) {1725variable_list_sp =1726sc->function->GetBlock(true).GetBlockVariableList(true);1727}17281729if (inline_info) {1730s.PutCString(cstr);1731s.PutCString(" [inlined] ");1732cstr = inline_info->GetName().GetCString();1733}17341735VariableList args;1736if (variable_list_sp)1737variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument,1738args);1739if (args.GetSize() > 0) {1740if (!PrettyPrintFunctionNameWithArgs(s, cstr, exe_scope, args))1741return false;1742} else {1743s.PutCString(cstr);1744}1745return true;1746}1747} else if (sc->symbol) {1748const char *cstr = sc->symbol->GetName().AsCString(nullptr);1749if (cstr) {1750s.PutCString(cstr);1751return true;1752}1753}1754} break;1755default:1756return false;1757}17581759return false;1760}176117621763