xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15ffd83dbSDimitry Andric //===-- CPlusPlusLanguage.cpp ---------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "CPlusPlusLanguage.h"
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric #include <cctype>
120b57cec5SDimitry Andric #include <cstring>
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #include <functional>
150b57cec5SDimitry Andric #include <memory>
160b57cec5SDimitry Andric #include <mutex>
170b57cec5SDimitry Andric #include <set>
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
200b57cec5SDimitry Andric #include "llvm/Demangle/ItaniumDemangle.h"
210b57cec5SDimitry Andric 
22480093f4SDimitry Andric #include "lldb/Core/Mangled.h"
23349cc55cSDimitry Andric #include "lldb/Core/Module.h"
240b57cec5SDimitry Andric #include "lldb/Core/PluginManager.h"
250b57cec5SDimitry Andric #include "lldb/Core/UniqueCStringMap.h"
26bdd1243dSDimitry Andric #include "lldb/Core/ValueObjectVariable.h"
270b57cec5SDimitry Andric #include "lldb/DataFormatters/CXXFunctionPointer.h"
280b57cec5SDimitry Andric #include "lldb/DataFormatters/DataVisualization.h"
290b57cec5SDimitry Andric #include "lldb/DataFormatters/FormattersHelpers.h"
300b57cec5SDimitry Andric #include "lldb/DataFormatters/VectorType.h"
31349cc55cSDimitry Andric #include "lldb/Symbol/SymbolFile.h"
32bdd1243dSDimitry Andric #include "lldb/Symbol/VariableList.h"
330b57cec5SDimitry Andric #include "lldb/Utility/ConstString.h"
3481ad6265SDimitry Andric #include "lldb/Utility/LLDBLog.h"
350b57cec5SDimitry Andric #include "lldb/Utility/Log.h"
360b57cec5SDimitry Andric #include "lldb/Utility/RegularExpression.h"
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric #include "BlockPointer.h"
390b57cec5SDimitry Andric #include "CPlusPlusNameParser.h"
40bdd1243dSDimitry Andric #include "Coroutines.h"
410b57cec5SDimitry Andric #include "CxxStringTypes.h"
420eae32dcSDimitry Andric #include "Generic.h"
430b57cec5SDimitry Andric #include "LibCxx.h"
440b57cec5SDimitry Andric #include "LibCxxAtomic.h"
450b57cec5SDimitry Andric #include "LibCxxVariant.h"
460b57cec5SDimitry Andric #include "LibStdcpp.h"
470b57cec5SDimitry Andric #include "MSVCUndecoratedNameParser.h"
485f757f3fSDimitry Andric #include "lldb/lldb-enumerations.h"
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric using namespace lldb;
510b57cec5SDimitry Andric using namespace lldb_private;
520b57cec5SDimitry Andric using namespace lldb_private::formatters;
530b57cec5SDimitry Andric 
545ffd83dbSDimitry Andric LLDB_PLUGIN_DEFINE(CPlusPlusLanguage)
555ffd83dbSDimitry Andric 
560b57cec5SDimitry Andric void CPlusPlusLanguage::Initialize() {
570b57cec5SDimitry Andric   PluginManager::RegisterPlugin(GetPluginNameStatic(), "C++ Language",
580b57cec5SDimitry Andric                                 CreateInstance);
590b57cec5SDimitry Andric }
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric void CPlusPlusLanguage::Terminate() {
620b57cec5SDimitry Andric   PluginManager::UnregisterPlugin(CreateInstance);
630b57cec5SDimitry Andric }
640b57cec5SDimitry Andric 
65fe6060f1SDimitry Andric bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
66fe6060f1SDimitry Andric   const char *mangled_name = mangled.GetMangledName().GetCString();
67fe6060f1SDimitry Andric   return mangled_name && CPlusPlusLanguage::IsCPPMangledName(mangled_name);
68fe6060f1SDimitry Andric }
69fe6060f1SDimitry Andric 
70349cc55cSDimitry Andric ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments(
71349cc55cSDimitry Andric     Mangled mangled) const {
72349cc55cSDimitry Andric   const char *mangled_name_cstr = mangled.GetMangledName().GetCString();
73349cc55cSDimitry Andric   ConstString demangled_name = mangled.GetDemangledName();
74349cc55cSDimitry Andric   if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {
75349cc55cSDimitry Andric     if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' &&
76349cc55cSDimitry Andric         (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure,
77349cc55cSDimitry Andric                                         // typeinfo structure, and typeinfo
78349cc55cSDimitry Andric                                         // mangled_name
79349cc55cSDimitry Andric          mangled_name_cstr[2] != 'G' && // avoid guard variables
80349cc55cSDimitry Andric          mangled_name_cstr[2] != 'Z'))  // named local entities (if we
81349cc55cSDimitry Andric                                         // eventually handle eSymbolTypeData,
82349cc55cSDimitry Andric                                         // we will want this back)
83349cc55cSDimitry Andric     {
84349cc55cSDimitry Andric       CPlusPlusLanguage::MethodName cxx_method(demangled_name);
85349cc55cSDimitry Andric       if (!cxx_method.GetBasename().empty()) {
86349cc55cSDimitry Andric         std::string shortname;
87349cc55cSDimitry Andric         if (!cxx_method.GetContext().empty())
88349cc55cSDimitry Andric           shortname = cxx_method.GetContext().str() + "::";
89349cc55cSDimitry Andric         shortname += cxx_method.GetBasename().str();
90349cc55cSDimitry Andric         return ConstString(shortname);
910b57cec5SDimitry Andric       }
92349cc55cSDimitry Andric     }
93349cc55cSDimitry Andric   }
94349cc55cSDimitry Andric   if (demangled_name)
95349cc55cSDimitry Andric     return demangled_name;
96349cc55cSDimitry Andric   return mangled.GetMangledName();
97349cc55cSDimitry Andric }
980b57cec5SDimitry Andric 
990b57cec5SDimitry Andric // Static Functions
1000b57cec5SDimitry Andric 
1010b57cec5SDimitry Andric Language *CPlusPlusLanguage::CreateInstance(lldb::LanguageType language) {
1025ffd83dbSDimitry Andric   // Use plugin for C++ but not for Objective-C++ (which has its own plugin).
1035ffd83dbSDimitry Andric   if (Language::LanguageIsCPlusPlus(language) &&
1045ffd83dbSDimitry Andric       language != eLanguageTypeObjC_plus_plus)
1050b57cec5SDimitry Andric     return new CPlusPlusLanguage();
1060b57cec5SDimitry Andric   return nullptr;
1070b57cec5SDimitry Andric }
1080b57cec5SDimitry Andric 
1090b57cec5SDimitry Andric void CPlusPlusLanguage::MethodName::Clear() {
1100b57cec5SDimitry Andric   m_full.Clear();
1110b57cec5SDimitry Andric   m_basename = llvm::StringRef();
1120b57cec5SDimitry Andric   m_context = llvm::StringRef();
1130b57cec5SDimitry Andric   m_arguments = llvm::StringRef();
1140b57cec5SDimitry Andric   m_qualifiers = llvm::StringRef();
115bdd1243dSDimitry Andric   m_return_type = llvm::StringRef();
1160b57cec5SDimitry Andric   m_parsed = false;
1170b57cec5SDimitry Andric   m_parse_error = false;
1180b57cec5SDimitry Andric }
1190b57cec5SDimitry Andric 
1200b57cec5SDimitry Andric static bool ReverseFindMatchingChars(const llvm::StringRef &s,
1210b57cec5SDimitry Andric                                      const llvm::StringRef &left_right_chars,
1220b57cec5SDimitry Andric                                      size_t &left_pos, size_t &right_pos,
1230b57cec5SDimitry Andric                                      size_t pos = llvm::StringRef::npos) {
1240b57cec5SDimitry Andric   assert(left_right_chars.size() == 2);
1250b57cec5SDimitry Andric   left_pos = llvm::StringRef::npos;
1260b57cec5SDimitry Andric   const char left_char = left_right_chars[0];
1270b57cec5SDimitry Andric   const char right_char = left_right_chars[1];
1280b57cec5SDimitry Andric   pos = s.find_last_of(left_right_chars, pos);
1290b57cec5SDimitry Andric   if (pos == llvm::StringRef::npos || s[pos] == left_char)
1300b57cec5SDimitry Andric     return false;
1310b57cec5SDimitry Andric   right_pos = pos;
1320b57cec5SDimitry Andric   uint32_t depth = 1;
1330b57cec5SDimitry Andric   while (pos > 0 && depth > 0) {
1340b57cec5SDimitry Andric     pos = s.find_last_of(left_right_chars, pos);
1350b57cec5SDimitry Andric     if (pos == llvm::StringRef::npos)
1360b57cec5SDimitry Andric       return false;
1370b57cec5SDimitry Andric     if (s[pos] == left_char) {
1380b57cec5SDimitry Andric       if (--depth == 0) {
1390b57cec5SDimitry Andric         left_pos = pos;
1400b57cec5SDimitry Andric         return left_pos < right_pos;
1410b57cec5SDimitry Andric       }
1420b57cec5SDimitry Andric     } else if (s[pos] == right_char) {
1430b57cec5SDimitry Andric       ++depth;
1440b57cec5SDimitry Andric     }
1450b57cec5SDimitry Andric   }
1460b57cec5SDimitry Andric   return false;
1470b57cec5SDimitry Andric }
1480b57cec5SDimitry Andric 
1490b57cec5SDimitry Andric static bool IsTrivialBasename(const llvm::StringRef &basename) {
1500b57cec5SDimitry Andric   // Check that the basename matches with the following regular expression
1510b57cec5SDimitry Andric   // "^~?([A-Za-z_][A-Za-z_0-9]*)$" We are using a hand written implementation
1520b57cec5SDimitry Andric   // because it is significantly more efficient then using the general purpose
1530b57cec5SDimitry Andric   // regular expression library.
1540b57cec5SDimitry Andric   size_t idx = 0;
155*0fca6ea1SDimitry Andric   if (basename.starts_with('~'))
1560b57cec5SDimitry Andric     idx = 1;
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric   if (basename.size() <= idx)
1590b57cec5SDimitry Andric     return false; // Empty string or "~"
1600b57cec5SDimitry Andric 
1610b57cec5SDimitry Andric   if (!std::isalpha(basename[idx]) && basename[idx] != '_')
1625ffd83dbSDimitry Andric     return false; // First character (after removing the possible '~'') isn't in
1630b57cec5SDimitry Andric                   // [A-Za-z_]
1640b57cec5SDimitry Andric 
1650b57cec5SDimitry Andric   // Read all characters matching [A-Za-z_0-9]
1660b57cec5SDimitry Andric   ++idx;
1670b57cec5SDimitry Andric   while (idx < basename.size()) {
1680b57cec5SDimitry Andric     if (!std::isalnum(basename[idx]) && basename[idx] != '_')
1690b57cec5SDimitry Andric       break;
1700b57cec5SDimitry Andric     ++idx;
1710b57cec5SDimitry Andric   }
1720b57cec5SDimitry Andric 
1730b57cec5SDimitry Andric   // We processed all characters. It is a vaild basename.
1740b57cec5SDimitry Andric   return idx == basename.size();
1750b57cec5SDimitry Andric }
1760b57cec5SDimitry Andric 
177bdd1243dSDimitry Andric /// Writes out the function name in 'full_name' to 'out_stream'
178bdd1243dSDimitry Andric /// but replaces each argument type with the variable name
179bdd1243dSDimitry Andric /// and the corresponding pretty-printed value
180bdd1243dSDimitry Andric static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream,
181bdd1243dSDimitry Andric                                             char const *full_name,
182bdd1243dSDimitry Andric                                             ExecutionContextScope *exe_scope,
183bdd1243dSDimitry Andric                                             VariableList const &args) {
184bdd1243dSDimitry Andric   CPlusPlusLanguage::MethodName cpp_method{ConstString(full_name)};
185bdd1243dSDimitry Andric 
186bdd1243dSDimitry Andric   if (!cpp_method.IsValid())
187bdd1243dSDimitry Andric     return false;
188bdd1243dSDimitry Andric 
189bdd1243dSDimitry Andric   llvm::StringRef return_type = cpp_method.GetReturnType();
190bdd1243dSDimitry Andric   if (!return_type.empty()) {
191bdd1243dSDimitry Andric     out_stream.PutCString(return_type);
192bdd1243dSDimitry Andric     out_stream.PutChar(' ');
193bdd1243dSDimitry Andric   }
194bdd1243dSDimitry Andric 
195bdd1243dSDimitry Andric   out_stream.PutCString(cpp_method.GetScopeQualifiedName());
196bdd1243dSDimitry Andric   out_stream.PutChar('(');
197bdd1243dSDimitry Andric 
198bdd1243dSDimitry Andric   FormatEntity::PrettyPrintFunctionArguments(out_stream, args, exe_scope);
199bdd1243dSDimitry Andric 
200bdd1243dSDimitry Andric   out_stream.PutChar(')');
201bdd1243dSDimitry Andric 
202bdd1243dSDimitry Andric   llvm::StringRef qualifiers = cpp_method.GetQualifiers();
203bdd1243dSDimitry Andric   if (!qualifiers.empty()) {
204bdd1243dSDimitry Andric     out_stream.PutChar(' ');
205bdd1243dSDimitry Andric     out_stream.PutCString(qualifiers);
206bdd1243dSDimitry Andric   }
207bdd1243dSDimitry Andric 
208bdd1243dSDimitry Andric   return true;
209bdd1243dSDimitry Andric }
210bdd1243dSDimitry Andric 
2110b57cec5SDimitry Andric bool CPlusPlusLanguage::MethodName::TrySimplifiedParse() {
2120b57cec5SDimitry Andric   // This method tries to parse simple method definitions which are presumably
2130b57cec5SDimitry Andric   // most comman in user programs. Definitions that can be parsed by this
2140b57cec5SDimitry Andric   // function don't have return types and templates in the name.
2150b57cec5SDimitry Andric   // A::B::C::fun(std::vector<T> &) const
2160b57cec5SDimitry Andric   size_t arg_start, arg_end;
2170b57cec5SDimitry Andric   llvm::StringRef full(m_full.GetCString());
2180b57cec5SDimitry Andric   llvm::StringRef parens("()", 2);
2190b57cec5SDimitry Andric   if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) {
2200b57cec5SDimitry Andric     m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
2210b57cec5SDimitry Andric     if (arg_end + 1 < full.size())
2220b57cec5SDimitry Andric       m_qualifiers = full.substr(arg_end + 1).ltrim();
2230b57cec5SDimitry Andric 
2240b57cec5SDimitry Andric     if (arg_start == 0)
2250b57cec5SDimitry Andric       return false;
2260b57cec5SDimitry Andric     size_t basename_end = arg_start;
2270b57cec5SDimitry Andric     size_t context_start = 0;
2280b57cec5SDimitry Andric     size_t context_end = full.rfind(':', basename_end);
2290b57cec5SDimitry Andric     if (context_end == llvm::StringRef::npos)
2300b57cec5SDimitry Andric       m_basename = full.substr(0, basename_end);
2310b57cec5SDimitry Andric     else {
2320b57cec5SDimitry Andric       if (context_start < context_end)
2330b57cec5SDimitry Andric         m_context = full.substr(context_start, context_end - 1 - context_start);
2340b57cec5SDimitry Andric       const size_t basename_begin = context_end + 1;
2350b57cec5SDimitry Andric       m_basename = full.substr(basename_begin, basename_end - basename_begin);
2360b57cec5SDimitry Andric     }
2370b57cec5SDimitry Andric 
2380b57cec5SDimitry Andric     if (IsTrivialBasename(m_basename)) {
2390b57cec5SDimitry Andric       return true;
2400b57cec5SDimitry Andric     } else {
2410b57cec5SDimitry Andric       // The C++ basename doesn't match our regular expressions so this can't
2420b57cec5SDimitry Andric       // be a valid C++ method, clear everything out and indicate an error
2430b57cec5SDimitry Andric       m_context = llvm::StringRef();
2440b57cec5SDimitry Andric       m_basename = llvm::StringRef();
2450b57cec5SDimitry Andric       m_arguments = llvm::StringRef();
2460b57cec5SDimitry Andric       m_qualifiers = llvm::StringRef();
247bdd1243dSDimitry Andric       m_return_type = llvm::StringRef();
2480b57cec5SDimitry Andric       return false;
2490b57cec5SDimitry Andric     }
2500b57cec5SDimitry Andric   }
2510b57cec5SDimitry Andric   return false;
2520b57cec5SDimitry Andric }
2530b57cec5SDimitry Andric 
2540b57cec5SDimitry Andric void CPlusPlusLanguage::MethodName::Parse() {
2550b57cec5SDimitry Andric   if (!m_parsed && m_full) {
2560b57cec5SDimitry Andric     if (TrySimplifiedParse()) {
2570b57cec5SDimitry Andric       m_parse_error = false;
2580b57cec5SDimitry Andric     } else {
2590b57cec5SDimitry Andric       CPlusPlusNameParser parser(m_full.GetStringRef());
2600b57cec5SDimitry Andric       if (auto function = parser.ParseAsFunctionDefinition()) {
261bdd1243dSDimitry Andric         m_basename = function->name.basename;
262bdd1243dSDimitry Andric         m_context = function->name.context;
263bdd1243dSDimitry Andric         m_arguments = function->arguments;
264bdd1243dSDimitry Andric         m_qualifiers = function->qualifiers;
265bdd1243dSDimitry Andric         m_return_type = function->return_type;
2660b57cec5SDimitry Andric         m_parse_error = false;
2670b57cec5SDimitry Andric       } else {
2680b57cec5SDimitry Andric         m_parse_error = true;
2690b57cec5SDimitry Andric       }
2700b57cec5SDimitry Andric     }
2710b57cec5SDimitry Andric     m_parsed = true;
2720b57cec5SDimitry Andric   }
2730b57cec5SDimitry Andric }
2740b57cec5SDimitry Andric 
2750b57cec5SDimitry Andric llvm::StringRef CPlusPlusLanguage::MethodName::GetBasename() {
2760b57cec5SDimitry Andric   if (!m_parsed)
2770b57cec5SDimitry Andric     Parse();
2780b57cec5SDimitry Andric   return m_basename;
2790b57cec5SDimitry Andric }
2800b57cec5SDimitry Andric 
2810b57cec5SDimitry Andric llvm::StringRef CPlusPlusLanguage::MethodName::GetContext() {
2820b57cec5SDimitry Andric   if (!m_parsed)
2830b57cec5SDimitry Andric     Parse();
2840b57cec5SDimitry Andric   return m_context;
2850b57cec5SDimitry Andric }
2860b57cec5SDimitry Andric 
2870b57cec5SDimitry Andric llvm::StringRef CPlusPlusLanguage::MethodName::GetArguments() {
2880b57cec5SDimitry Andric   if (!m_parsed)
2890b57cec5SDimitry Andric     Parse();
2900b57cec5SDimitry Andric   return m_arguments;
2910b57cec5SDimitry Andric }
2920b57cec5SDimitry Andric 
2930b57cec5SDimitry Andric llvm::StringRef CPlusPlusLanguage::MethodName::GetQualifiers() {
2940b57cec5SDimitry Andric   if (!m_parsed)
2950b57cec5SDimitry Andric     Parse();
2960b57cec5SDimitry Andric   return m_qualifiers;
2970b57cec5SDimitry Andric }
2980b57cec5SDimitry Andric 
299bdd1243dSDimitry Andric llvm::StringRef CPlusPlusLanguage::MethodName::GetReturnType() {
300bdd1243dSDimitry Andric   if (!m_parsed)
301bdd1243dSDimitry Andric     Parse();
302bdd1243dSDimitry Andric   return m_return_type;
303bdd1243dSDimitry Andric }
304bdd1243dSDimitry Andric 
3050b57cec5SDimitry Andric std::string CPlusPlusLanguage::MethodName::GetScopeQualifiedName() {
3060b57cec5SDimitry Andric   if (!m_parsed)
3070b57cec5SDimitry Andric     Parse();
3080b57cec5SDimitry Andric   if (m_context.empty())
3095ffd83dbSDimitry Andric     return std::string(m_basename);
3100b57cec5SDimitry Andric 
3110b57cec5SDimitry Andric   std::string res;
3120b57cec5SDimitry Andric   res += m_context;
3130b57cec5SDimitry Andric   res += "::";
3140b57cec5SDimitry Andric   res += m_basename;
3150b57cec5SDimitry Andric   return res;
3160b57cec5SDimitry Andric }
3170b57cec5SDimitry Andric 
318bdd1243dSDimitry Andric llvm::StringRef
319bdd1243dSDimitry Andric CPlusPlusLanguage::MethodName::GetBasenameNoTemplateParameters() {
320bdd1243dSDimitry Andric   llvm::StringRef basename = GetBasename();
321bdd1243dSDimitry Andric   size_t arg_start, arg_end;
322bdd1243dSDimitry Andric   llvm::StringRef parens("<>", 2);
323bdd1243dSDimitry Andric   if (ReverseFindMatchingChars(basename, parens, arg_start, arg_end))
324bdd1243dSDimitry Andric     return basename.substr(0, arg_start);
325bdd1243dSDimitry Andric 
326bdd1243dSDimitry Andric   return basename;
327bdd1243dSDimitry Andric }
328bdd1243dSDimitry Andric 
32981ad6265SDimitry Andric bool CPlusPlusLanguage::MethodName::ContainsPath(llvm::StringRef path) {
33081ad6265SDimitry Andric   if (!m_parsed)
33181ad6265SDimitry Andric     Parse();
332bdd1243dSDimitry Andric 
33381ad6265SDimitry Andric   // If we can't parse the incoming name, then just check that it contains path.
33481ad6265SDimitry Andric   if (m_parse_error)
33581ad6265SDimitry Andric     return m_full.GetStringRef().contains(path);
33681ad6265SDimitry Andric 
33781ad6265SDimitry Andric   llvm::StringRef identifier;
33881ad6265SDimitry Andric   llvm::StringRef context;
33981ad6265SDimitry Andric   std::string path_str = path.str();
3405f757f3fSDimitry Andric   bool success = CPlusPlusLanguage::ExtractContextAndIdentifier(
3415f757f3fSDimitry Andric       path_str.c_str(), context, identifier);
34281ad6265SDimitry Andric   if (!success)
34381ad6265SDimitry Andric     return m_full.GetStringRef().contains(path);
34481ad6265SDimitry Andric 
345bdd1243dSDimitry Andric   // Basename may include template arguments.
346bdd1243dSDimitry Andric   // E.g.,
347bdd1243dSDimitry Andric   // GetBaseName(): func<int>
348bdd1243dSDimitry Andric   // identifier   : func
349bdd1243dSDimitry Andric   //
350bdd1243dSDimitry Andric   // ...but we still want to account for identifiers with template parameter
351bdd1243dSDimitry Andric   // lists, e.g., when users set breakpoints on template specializations.
352bdd1243dSDimitry Andric   //
353bdd1243dSDimitry Andric   // E.g.,
354bdd1243dSDimitry Andric   // GetBaseName(): func<uint32_t>
355bdd1243dSDimitry Andric   // identifier   : func<int32_t*>
356bdd1243dSDimitry Andric   //
357bdd1243dSDimitry Andric   // Try to match the basename with or without template parameters.
358bdd1243dSDimitry Andric   if (GetBasename() != identifier &&
359bdd1243dSDimitry Andric       GetBasenameNoTemplateParameters() != identifier)
36081ad6265SDimitry Andric     return false;
361bdd1243dSDimitry Andric 
36281ad6265SDimitry Andric   // Incoming path only had an identifier, so we match.
36381ad6265SDimitry Andric   if (context.empty())
36481ad6265SDimitry Andric     return true;
36581ad6265SDimitry Andric   // Incoming path has context but this method does not, no match.
36681ad6265SDimitry Andric   if (m_context.empty())
36781ad6265SDimitry Andric     return false;
36881ad6265SDimitry Andric 
36981ad6265SDimitry Andric   llvm::StringRef haystack = m_context;
37081ad6265SDimitry Andric   if (!haystack.consume_back(context))
37181ad6265SDimitry Andric     return false;
37281ad6265SDimitry Andric   if (haystack.empty() || !isalnum(haystack.back()))
37381ad6265SDimitry Andric     return true;
37481ad6265SDimitry Andric 
37581ad6265SDimitry Andric   return false;
37681ad6265SDimitry Andric }
37781ad6265SDimitry Andric 
378480093f4SDimitry Andric bool CPlusPlusLanguage::IsCPPMangledName(llvm::StringRef name) {
3790b57cec5SDimitry Andric   // FIXME!! we should really run through all the known C++ Language plugins
3800b57cec5SDimitry Andric   // and ask each one if this is a C++ mangled name
3810b57cec5SDimitry Andric 
382480093f4SDimitry Andric   Mangled::ManglingScheme scheme = Mangled::GetManglingScheme(name);
383480093f4SDimitry Andric 
384480093f4SDimitry Andric   if (scheme == Mangled::eManglingSchemeNone)
3850b57cec5SDimitry Andric     return false;
3860b57cec5SDimitry Andric 
3870b57cec5SDimitry Andric   return true;
3880b57cec5SDimitry Andric }
3890b57cec5SDimitry Andric 
39081ad6265SDimitry Andric bool CPlusPlusLanguage::DemangledNameContainsPath(llvm::StringRef path,
39181ad6265SDimitry Andric                                                   ConstString demangled) const {
39281ad6265SDimitry Andric   MethodName demangled_name(demangled);
39381ad6265SDimitry Andric   return demangled_name.ContainsPath(path);
39481ad6265SDimitry Andric }
39581ad6265SDimitry Andric 
3960b57cec5SDimitry Andric bool CPlusPlusLanguage::ExtractContextAndIdentifier(
3970b57cec5SDimitry Andric     const char *name, llvm::StringRef &context, llvm::StringRef &identifier) {
3980b57cec5SDimitry Andric   if (MSVCUndecoratedNameParser::IsMSVCUndecoratedName(name))
3990b57cec5SDimitry Andric     return MSVCUndecoratedNameParser::ExtractContextAndIdentifier(name, context,
4000b57cec5SDimitry Andric                                                                   identifier);
4010b57cec5SDimitry Andric 
4020b57cec5SDimitry Andric   CPlusPlusNameParser parser(name);
4030b57cec5SDimitry Andric   if (auto full_name = parser.ParseAsFullName()) {
404bdd1243dSDimitry Andric     identifier = full_name->basename;
405bdd1243dSDimitry Andric     context = full_name->context;
4060b57cec5SDimitry Andric     return true;
4070b57cec5SDimitry Andric   }
4080b57cec5SDimitry Andric   return false;
4090b57cec5SDimitry Andric }
4100b57cec5SDimitry Andric 
4110b57cec5SDimitry Andric namespace {
4120b57cec5SDimitry Andric class NodeAllocator {
4130b57cec5SDimitry Andric   llvm::BumpPtrAllocator Alloc;
4140b57cec5SDimitry Andric 
4150b57cec5SDimitry Andric public:
4160b57cec5SDimitry Andric   void reset() { Alloc.Reset(); }
4170b57cec5SDimitry Andric 
4180b57cec5SDimitry Andric   template <typename T, typename... Args> T *makeNode(Args &&... args) {
4190b57cec5SDimitry Andric     return new (Alloc.Allocate(sizeof(T), alignof(T)))
4200b57cec5SDimitry Andric         T(std::forward<Args>(args)...);
4210b57cec5SDimitry Andric   }
4220b57cec5SDimitry Andric 
4230b57cec5SDimitry Andric   void *allocateNodeArray(size_t sz) {
4240b57cec5SDimitry Andric     return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz,
4250b57cec5SDimitry Andric                           alignof(llvm::itanium_demangle::Node *));
4260b57cec5SDimitry Andric   }
4270b57cec5SDimitry Andric };
4280b57cec5SDimitry Andric 
429480093f4SDimitry Andric template <typename Derived>
430480093f4SDimitry Andric class ManglingSubstitutor
431480093f4SDimitry Andric     : public llvm::itanium_demangle::AbstractManglingParser<Derived,
4320b57cec5SDimitry Andric                                                             NodeAllocator> {
433480093f4SDimitry Andric   using Base =
434480093f4SDimitry Andric       llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
4350b57cec5SDimitry Andric 
436480093f4SDimitry Andric public:
437480093f4SDimitry Andric   ManglingSubstitutor() : Base(nullptr, nullptr) {}
4380b57cec5SDimitry Andric 
439480093f4SDimitry Andric   template <typename... Ts>
440480093f4SDimitry Andric   ConstString substitute(llvm::StringRef Mangled, Ts &&... Vals) {
441480093f4SDimitry Andric     this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
442480093f4SDimitry Andric     return substituteImpl(Mangled);
443480093f4SDimitry Andric   }
4440b57cec5SDimitry Andric 
445480093f4SDimitry Andric protected:
446480093f4SDimitry Andric   void reset(llvm::StringRef Mangled) {
447480093f4SDimitry Andric     Base::reset(Mangled.begin(), Mangled.end());
4480b57cec5SDimitry Andric     Written = Mangled.begin();
4490b57cec5SDimitry Andric     Result.clear();
4500b57cec5SDimitry Andric     Substituted = false;
4510b57cec5SDimitry Andric   }
4520b57cec5SDimitry Andric 
453480093f4SDimitry Andric   ConstString substituteImpl(llvm::StringRef Mangled) {
45481ad6265SDimitry Andric     Log *log = GetLog(LLDBLog::Language);
455480093f4SDimitry Andric     if (this->parse() == nullptr) {
4560b57cec5SDimitry Andric       LLDB_LOG(log, "Failed to substitute mangling in {0}", Mangled);
4570b57cec5SDimitry Andric       return ConstString();
4580b57cec5SDimitry Andric     }
4590b57cec5SDimitry Andric     if (!Substituted)
4600b57cec5SDimitry Andric       return ConstString();
4610b57cec5SDimitry Andric 
4620b57cec5SDimitry Andric     // Append any trailing unmodified input.
4630b57cec5SDimitry Andric     appendUnchangedInput();
4640b57cec5SDimitry Andric     LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);
4650b57cec5SDimitry Andric     return ConstString(Result);
4660b57cec5SDimitry Andric   }
4670b57cec5SDimitry Andric 
468480093f4SDimitry Andric   void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
4695f757f3fSDimitry Andric     if (!llvm::StringRef(currentParserPos(), this->numLeft()).starts_with(From))
470480093f4SDimitry Andric       return;
471480093f4SDimitry Andric 
4720b57cec5SDimitry Andric     // We found a match. Append unmodified input up to this point.
4730b57cec5SDimitry Andric     appendUnchangedInput();
4740b57cec5SDimitry Andric 
4750b57cec5SDimitry Andric     // And then perform the replacement.
476480093f4SDimitry Andric     Result += To;
477480093f4SDimitry Andric     Written += From.size();
4780b57cec5SDimitry Andric     Substituted = true;
4790b57cec5SDimitry Andric   }
480480093f4SDimitry Andric 
481480093f4SDimitry Andric private:
482480093f4SDimitry Andric   /// Input character until which we have constructed the respective output
483480093f4SDimitry Andric   /// already.
484fcaf7f86SDimitry Andric   const char *Written = "";
485480093f4SDimitry Andric 
486480093f4SDimitry Andric   llvm::SmallString<128> Result;
487480093f4SDimitry Andric 
488480093f4SDimitry Andric   /// Whether we have performed any substitutions.
489fcaf7f86SDimitry Andric   bool Substituted = false;
490480093f4SDimitry Andric 
491480093f4SDimitry Andric   const char *currentParserPos() const { return this->First; }
492480093f4SDimitry Andric 
493480093f4SDimitry Andric   void appendUnchangedInput() {
494480093f4SDimitry Andric     Result +=
495480093f4SDimitry Andric         llvm::StringRef(Written, std::distance(Written, currentParserPos()));
496480093f4SDimitry Andric     Written = currentParserPos();
497480093f4SDimitry Andric   }
498480093f4SDimitry Andric };
499480093f4SDimitry Andric 
500480093f4SDimitry Andric /// Given a mangled function `Mangled`, replace all the primitive function type
501480093f4SDimitry Andric /// arguments of `Search` with type `Replace`.
502480093f4SDimitry Andric class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> {
503480093f4SDimitry Andric   llvm::StringRef Search;
504480093f4SDimitry Andric   llvm::StringRef Replace;
505480093f4SDimitry Andric 
506480093f4SDimitry Andric public:
507480093f4SDimitry Andric   void reset(llvm::StringRef Mangled, llvm::StringRef Search,
508480093f4SDimitry Andric              llvm::StringRef Replace) {
509480093f4SDimitry Andric     ManglingSubstitutor::reset(Mangled);
510480093f4SDimitry Andric     this->Search = Search;
511480093f4SDimitry Andric     this->Replace = Replace;
512480093f4SDimitry Andric   }
513480093f4SDimitry Andric 
514480093f4SDimitry Andric   llvm::itanium_demangle::Node *parseType() {
515480093f4SDimitry Andric     trySubstitute(Search, Replace);
516480093f4SDimitry Andric     return ManglingSubstitutor::parseType();
5170b57cec5SDimitry Andric   }
5180b57cec5SDimitry Andric };
519480093f4SDimitry Andric 
520480093f4SDimitry Andric class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> {
521480093f4SDimitry Andric public:
522480093f4SDimitry Andric   llvm::itanium_demangle::Node *
523480093f4SDimitry Andric   parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) {
524480093f4SDimitry Andric     trySubstitute("C1", "C2");
525480093f4SDimitry Andric     trySubstitute("D1", "D2");
526480093f4SDimitry Andric     return ManglingSubstitutor::parseCtorDtorName(SoFar, State);
5270b57cec5SDimitry Andric   }
528480093f4SDimitry Andric };
529480093f4SDimitry Andric } // namespace
5300b57cec5SDimitry Andric 
531349cc55cSDimitry Andric std::vector<ConstString> CPlusPlusLanguage::GenerateAlternateFunctionManglings(
532349cc55cSDimitry Andric     const ConstString mangled_name) const {
533349cc55cSDimitry Andric   std::vector<ConstString> alternates;
534349cc55cSDimitry Andric 
5350b57cec5SDimitry Andric   /// Get a basic set of alternative manglings for the given symbol `name`, by
5360b57cec5SDimitry Andric   /// making a few basic possible substitutions on basic types, storage duration
5370b57cec5SDimitry Andric   /// and `const`ness for the given symbol. The output parameter `alternates`
5380b57cec5SDimitry Andric   /// is filled with a best-guess, non-exhaustive set of different manglings
5390b57cec5SDimitry Andric   /// for the given name.
5400b57cec5SDimitry Andric 
5410b57cec5SDimitry Andric   // Maybe we're looking for a const symbol but the debug info told us it was
5420b57cec5SDimitry Andric   // non-const...
5430b57cec5SDimitry Andric   if (!strncmp(mangled_name.GetCString(), "_ZN", 3) &&
5440b57cec5SDimitry Andric       strncmp(mangled_name.GetCString(), "_ZNK", 4)) {
5450b57cec5SDimitry Andric     std::string fixed_scratch("_ZNK");
5460b57cec5SDimitry Andric     fixed_scratch.append(mangled_name.GetCString() + 3);
547349cc55cSDimitry Andric     alternates.push_back(ConstString(fixed_scratch));
5480b57cec5SDimitry Andric   }
5490b57cec5SDimitry Andric 
5500b57cec5SDimitry Andric   // Maybe we're looking for a static symbol but we thought it was global...
5510b57cec5SDimitry Andric   if (!strncmp(mangled_name.GetCString(), "_Z", 2) &&
5520b57cec5SDimitry Andric       strncmp(mangled_name.GetCString(), "_ZL", 3)) {
5530b57cec5SDimitry Andric     std::string fixed_scratch("_ZL");
5540b57cec5SDimitry Andric     fixed_scratch.append(mangled_name.GetCString() + 2);
555349cc55cSDimitry Andric     alternates.push_back(ConstString(fixed_scratch));
5560b57cec5SDimitry Andric   }
5570b57cec5SDimitry Andric 
5580b57cec5SDimitry Andric   TypeSubstitutor TS;
5590b57cec5SDimitry Andric   // `char` is implementation defined as either `signed` or `unsigned`.  As a
5600b57cec5SDimitry Andric   // result a char parameter has 3 possible manglings: 'c'-char, 'a'-signed
5610b57cec5SDimitry Andric   // char, 'h'-unsigned char.  If we're looking for symbols with a signed char
5620b57cec5SDimitry Andric   // parameter, try finding matches which have the general case 'c'.
5630b57cec5SDimitry Andric   if (ConstString char_fixup =
5640b57cec5SDimitry Andric           TS.substitute(mangled_name.GetStringRef(), "a", "c"))
565349cc55cSDimitry Andric     alternates.push_back(char_fixup);
5660b57cec5SDimitry Andric 
5670b57cec5SDimitry Andric   // long long parameter mangling 'x', may actually just be a long 'l' argument
5680b57cec5SDimitry Andric   if (ConstString long_fixup =
5690b57cec5SDimitry Andric           TS.substitute(mangled_name.GetStringRef(), "x", "l"))
570349cc55cSDimitry Andric     alternates.push_back(long_fixup);
5710b57cec5SDimitry Andric 
5720b57cec5SDimitry Andric   // unsigned long long parameter mangling 'y', may actually just be unsigned
5730b57cec5SDimitry Andric   // long 'm' argument
5740b57cec5SDimitry Andric   if (ConstString ulong_fixup =
5750b57cec5SDimitry Andric           TS.substitute(mangled_name.GetStringRef(), "y", "m"))
576349cc55cSDimitry Andric     alternates.push_back(ulong_fixup);
5770b57cec5SDimitry Andric 
578480093f4SDimitry Andric   if (ConstString ctor_fixup =
579480093f4SDimitry Andric           CtorDtorSubstitutor().substitute(mangled_name.GetStringRef()))
580349cc55cSDimitry Andric     alternates.push_back(ctor_fixup);
581480093f4SDimitry Andric 
582349cc55cSDimitry Andric   return alternates;
583349cc55cSDimitry Andric }
584349cc55cSDimitry Andric 
585349cc55cSDimitry Andric ConstString CPlusPlusLanguage::FindBestAlternateFunctionMangledName(
586349cc55cSDimitry Andric     const Mangled mangled, const SymbolContext &sym_ctx) const {
587349cc55cSDimitry Andric   ConstString demangled = mangled.GetDemangledName();
588349cc55cSDimitry Andric   if (!demangled)
589349cc55cSDimitry Andric     return ConstString();
590349cc55cSDimitry Andric 
591349cc55cSDimitry Andric   CPlusPlusLanguage::MethodName cpp_name(demangled);
592349cc55cSDimitry Andric   std::string scope_qualified_name = cpp_name.GetScopeQualifiedName();
593349cc55cSDimitry Andric 
594349cc55cSDimitry Andric   if (!scope_qualified_name.size())
595349cc55cSDimitry Andric     return ConstString();
596349cc55cSDimitry Andric 
597349cc55cSDimitry Andric   if (!sym_ctx.module_sp)
598349cc55cSDimitry Andric     return ConstString();
599349cc55cSDimitry Andric 
600349cc55cSDimitry Andric   lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile();
601349cc55cSDimitry Andric   if (!sym_file)
602349cc55cSDimitry Andric     return ConstString();
603349cc55cSDimitry Andric 
604349cc55cSDimitry Andric   std::vector<ConstString> alternates;
605349cc55cSDimitry Andric   sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates);
606349cc55cSDimitry Andric 
607349cc55cSDimitry Andric   std::vector<ConstString> param_and_qual_matches;
608349cc55cSDimitry Andric   std::vector<ConstString> param_matches;
609349cc55cSDimitry Andric   for (size_t i = 0; i < alternates.size(); i++) {
610349cc55cSDimitry Andric     ConstString alternate_mangled_name = alternates[i];
611349cc55cSDimitry Andric     Mangled mangled(alternate_mangled_name);
612349cc55cSDimitry Andric     ConstString demangled = mangled.GetDemangledName();
613349cc55cSDimitry Andric 
614349cc55cSDimitry Andric     CPlusPlusLanguage::MethodName alternate_cpp_name(demangled);
615349cc55cSDimitry Andric     if (!cpp_name.IsValid())
616349cc55cSDimitry Andric       continue;
617349cc55cSDimitry Andric 
618349cc55cSDimitry Andric     if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) {
619349cc55cSDimitry Andric       if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers())
620349cc55cSDimitry Andric         param_and_qual_matches.push_back(alternate_mangled_name);
621349cc55cSDimitry Andric       else
622349cc55cSDimitry Andric         param_matches.push_back(alternate_mangled_name);
623349cc55cSDimitry Andric     }
624349cc55cSDimitry Andric   }
625349cc55cSDimitry Andric 
626349cc55cSDimitry Andric   if (param_and_qual_matches.size())
627349cc55cSDimitry Andric     return param_and_qual_matches[0]; // It is assumed that there will be only
628349cc55cSDimitry Andric                                       // one!
629349cc55cSDimitry Andric   else if (param_matches.size())
630349cc55cSDimitry Andric     return param_matches[0]; // Return one of them as a best match
631349cc55cSDimitry Andric   else
632349cc55cSDimitry Andric     return ConstString();
6330b57cec5SDimitry Andric }
6340b57cec5SDimitry Andric 
6350b57cec5SDimitry Andric static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
6360b57cec5SDimitry Andric   if (!cpp_category_sp)
6370b57cec5SDimitry Andric     return;
6380b57cec5SDimitry Andric 
6390b57cec5SDimitry Andric   TypeSummaryImpl::Flags stl_summary_flags;
6400b57cec5SDimitry Andric   stl_summary_flags.SetCascades(true)
6410b57cec5SDimitry Andric       .SetSkipPointers(false)
6420b57cec5SDimitry Andric       .SetSkipReferences(false)
6430b57cec5SDimitry Andric       .SetDontShowChildren(true)
6440b57cec5SDimitry Andric       .SetDontShowValue(true)
6450b57cec5SDimitry Andric       .SetShowMembersOneLiner(false)
6460b57cec5SDimitry Andric       .SetHideItemNames(false);
6470b57cec5SDimitry Andric 
6480b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
6490b57cec5SDimitry Andric                 lldb_private::formatters::LibcxxStringSummaryProviderASCII,
65006c3fb27SDimitry Andric                 "std::string summary provider", "^std::__[[:alnum:]]+::string$",
6510b57cec5SDimitry Andric                 stl_summary_flags, true);
652480093f4SDimitry Andric   AddCXXSummary(cpp_category_sp,
653480093f4SDimitry Andric                 lldb_private::formatters::LibcxxStringSummaryProviderASCII,
654480093f4SDimitry Andric                 "std::string summary provider",
65506c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::basic_string<char, "
65606c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::char_traits<char>, "
65706c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::allocator<char> >$",
65806c3fb27SDimitry Andric                 stl_summary_flags, true);
65906c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
66006c3fb27SDimitry Andric                 lldb_private::formatters::LibcxxStringSummaryProviderASCII,
66106c3fb27SDimitry Andric                 "std::string summary provider",
66206c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::basic_string<unsigned char, "
663480093f4SDimitry Andric                 "std::__[[:alnum:]]+::char_traits<unsigned char>, "
66406c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::allocator<unsigned char> >$",
665480093f4SDimitry Andric                 stl_summary_flags, true);
6660b57cec5SDimitry Andric 
6670b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
6680b57cec5SDimitry Andric                 lldb_private::formatters::LibcxxStringSummaryProviderUTF16,
6690b57cec5SDimitry Andric                 "std::u16string summary provider",
67006c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::basic_string<char16_t, "
6710b57cec5SDimitry Andric                 "std::__[[:alnum:]]+::char_traits<char16_t>, "
67206c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::allocator<char16_t> >$",
6730b57cec5SDimitry Andric                 stl_summary_flags, true);
6740b57cec5SDimitry Andric 
6750b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
6760b57cec5SDimitry Andric                 lldb_private::formatters::LibcxxStringSummaryProviderUTF32,
6770b57cec5SDimitry Andric                 "std::u32string summary provider",
67806c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::basic_string<char32_t, "
6790b57cec5SDimitry Andric                 "std::__[[:alnum:]]+::char_traits<char32_t>, "
68006c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::allocator<char32_t> >$",
6810b57cec5SDimitry Andric                 stl_summary_flags, true);
6820b57cec5SDimitry Andric 
6830b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
6840b57cec5SDimitry Andric                 lldb_private::formatters::LibcxxWStringSummaryProvider,
6850b57cec5SDimitry Andric                 "std::wstring summary provider",
68606c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::wstring$", stl_summary_flags, true);
68706c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
68806c3fb27SDimitry Andric                 lldb_private::formatters::LibcxxWStringSummaryProvider,
68906c3fb27SDimitry Andric                 "std::wstring summary provider",
69006c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::basic_string<wchar_t, "
6910b57cec5SDimitry Andric                 "std::__[[:alnum:]]+::char_traits<wchar_t>, "
69206c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::allocator<wchar_t> >$",
6930b57cec5SDimitry Andric                 stl_summary_flags, true);
6940b57cec5SDimitry Andric 
69504eeddc0SDimitry Andric   AddCXXSummary(cpp_category_sp,
69604eeddc0SDimitry Andric                 lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,
69704eeddc0SDimitry Andric                 "std::string_view summary provider",
69806c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::string_view$", stl_summary_flags, true);
69906c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
70006c3fb27SDimitry Andric                 lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,
70106c3fb27SDimitry Andric                 "std::string_view summary provider",
70206c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::basic_string_view<char, "
70306c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::char_traits<char> >$",
70404eeddc0SDimitry Andric                 stl_summary_flags, true);
70504eeddc0SDimitry Andric   AddCXXSummary(cpp_category_sp,
70604eeddc0SDimitry Andric                 lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,
70704eeddc0SDimitry Andric                 "std::string_view summary provider",
70806c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
70906c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::char_traits<unsigned char> >$",
71004eeddc0SDimitry Andric                 stl_summary_flags, true);
71104eeddc0SDimitry Andric 
71204eeddc0SDimitry Andric   AddCXXSummary(cpp_category_sp,
71304eeddc0SDimitry Andric                 lldb_private::formatters::LibcxxStringViewSummaryProviderUTF16,
71404eeddc0SDimitry Andric                 "std::u16string_view summary provider",
71506c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::basic_string_view<char16_t, "
71606c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::char_traits<char16_t> >$",
71704eeddc0SDimitry Andric                 stl_summary_flags, true);
71804eeddc0SDimitry Andric 
71904eeddc0SDimitry Andric   AddCXXSummary(cpp_category_sp,
72004eeddc0SDimitry Andric                 lldb_private::formatters::LibcxxStringViewSummaryProviderUTF32,
72104eeddc0SDimitry Andric                 "std::u32string_view summary provider",
72206c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::basic_string_view<char32_t, "
72306c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::char_traits<char32_t> >$",
72404eeddc0SDimitry Andric                 stl_summary_flags, true);
72504eeddc0SDimitry Andric 
72604eeddc0SDimitry Andric   AddCXXSummary(cpp_category_sp,
72704eeddc0SDimitry Andric                 lldb_private::formatters::LibcxxWStringViewSummaryProvider,
72804eeddc0SDimitry Andric                 "std::wstring_view summary provider",
72906c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags, true);
73004eeddc0SDimitry Andric   AddCXXSummary(cpp_category_sp,
73104eeddc0SDimitry Andric                 lldb_private::formatters::LibcxxWStringViewSummaryProvider,
73204eeddc0SDimitry Andric                 "std::wstring_view summary provider",
73306c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
73406c3fb27SDimitry Andric                 "std::__[[:alnum:]]+::char_traits<wchar_t> >$",
73504eeddc0SDimitry Andric                 stl_summary_flags, true);
73604eeddc0SDimitry Andric 
7370b57cec5SDimitry Andric   SyntheticChildren::Flags stl_synth_flags;
7380b57cec5SDimitry Andric   stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
7390b57cec5SDimitry Andric       false);
7400b57cec5SDimitry Andric   SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
7410b57cec5SDimitry Andric   stl_deref_flags.SetFrontEndWantsDereference();
7420b57cec5SDimitry Andric 
7430b57cec5SDimitry Andric   AddCXXSynthetic(
7440b57cec5SDimitry Andric       cpp_category_sp,
7450b57cec5SDimitry Andric       lldb_private::formatters::LibcxxBitsetSyntheticFrontEndCreator,
7460b57cec5SDimitry Andric       "libc++ std::bitset synthetic children",
747*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::bitset<.+>$", stl_deref_flags, true);
7480b57cec5SDimitry Andric   AddCXXSynthetic(
7490b57cec5SDimitry Andric       cpp_category_sp,
7500b57cec5SDimitry Andric       lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator,
7510b57cec5SDimitry Andric       "libc++ std::vector synthetic children",
752*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::vector<.+>$", stl_deref_flags, true);
753*0fca6ea1SDimitry Andric   AddCXXSynthetic(
754*0fca6ea1SDimitry Andric       cpp_category_sp,
755*0fca6ea1SDimitry Andric       lldb_private::formatters::LibcxxStdValarraySyntheticFrontEndCreator,
756*0fca6ea1SDimitry Andric       "libc++ std::valarray synthetic children",
757*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::valarray<.+>$", stl_deref_flags, true);
758*0fca6ea1SDimitry Andric   AddCXXSynthetic(
759*0fca6ea1SDimitry Andric       cpp_category_sp,
760*0fca6ea1SDimitry Andric       lldb_private::formatters::LibcxxStdSliceArraySyntheticFrontEndCreator,
761*0fca6ea1SDimitry Andric       "libc++ std::slice_array synthetic children",
762*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::slice_array<.+>$", stl_deref_flags, true);
763*0fca6ea1SDimitry Andric   AddCXXSynthetic(
764*0fca6ea1SDimitry Andric       cpp_category_sp,
765*0fca6ea1SDimitry Andric       lldb_private::formatters::LibcxxStdProxyArraySyntheticFrontEndCreator,
766*0fca6ea1SDimitry Andric       "libc++ synthetic children for the valarray proxy arrays",
767*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
768*0fca6ea1SDimitry Andric       stl_deref_flags, true);
7690b57cec5SDimitry Andric   AddCXXSynthetic(
7700b57cec5SDimitry Andric       cpp_category_sp,
7710b57cec5SDimitry Andric       lldb_private::formatters::LibcxxStdForwardListSyntheticFrontEndCreator,
7720b57cec5SDimitry Andric       "libc++ std::forward_list synthetic children",
773*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::forward_list<.+>$", stl_synth_flags, true);
7740b57cec5SDimitry Andric   AddCXXSynthetic(
7750b57cec5SDimitry Andric       cpp_category_sp,
7760b57cec5SDimitry Andric       lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator,
7770b57cec5SDimitry Andric       "libc++ std::list synthetic children",
778*0fca6ea1SDimitry Andric       // A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>$"
779*0fca6ea1SDimitry Andric       // so that it does not clash with: "^std::(__cxx11::)?list<.+>$"
78006c3fb27SDimitry Andric       "^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"
781*0fca6ea1SDimitry Andric       "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>$",
7829dba64beSDimitry Andric       stl_deref_flags, true);
7830b57cec5SDimitry Andric   AddCXXSynthetic(
7840b57cec5SDimitry Andric       cpp_category_sp,
7850b57cec5SDimitry Andric       lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
786*0fca6ea1SDimitry Andric       "libc++ std::map synthetic children", "^std::__[[:alnum:]]+::map<.+> >$",
787*0fca6ea1SDimitry Andric       stl_synth_flags, true);
7880b57cec5SDimitry Andric   AddCXXSynthetic(
7890b57cec5SDimitry Andric       cpp_category_sp,
7900b57cec5SDimitry Andric       lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
791*0fca6ea1SDimitry Andric       "libc++ std::set synthetic children", "^std::__[[:alnum:]]+::set<.+> >$",
792*0fca6ea1SDimitry Andric       stl_deref_flags, true);
7930b57cec5SDimitry Andric   AddCXXSynthetic(
7940b57cec5SDimitry Andric       cpp_category_sp,
7950b57cec5SDimitry Andric       lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
7960b57cec5SDimitry Andric       "libc++ std::multiset synthetic children",
797*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::multiset<.+> >$", stl_deref_flags, true);
7980b57cec5SDimitry Andric   AddCXXSynthetic(
7990b57cec5SDimitry Andric       cpp_category_sp,
8000b57cec5SDimitry Andric       lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
8010b57cec5SDimitry Andric       "libc++ std::multimap synthetic children",
802*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::multimap<.+> >$", stl_synth_flags, true);
8030b57cec5SDimitry Andric   AddCXXSynthetic(
8040b57cec5SDimitry Andric       cpp_category_sp,
8050b57cec5SDimitry Andric       lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator,
8060b57cec5SDimitry Andric       "libc++ std::unordered containers synthetic children",
807*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
8080b57cec5SDimitry Andric       stl_synth_flags, true);
8090b57cec5SDimitry Andric   AddCXXSynthetic(
8100b57cec5SDimitry Andric       cpp_category_sp,
8110b57cec5SDimitry Andric       lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator,
8120b57cec5SDimitry Andric       "libc++ std::initializer_list synthetic children",
813*0fca6ea1SDimitry Andric       "^std::initializer_list<.+>$", stl_synth_flags, true);
8140b57cec5SDimitry Andric   AddCXXSynthetic(cpp_category_sp, LibcxxQueueFrontEndCreator,
8150b57cec5SDimitry Andric                   "libc++ std::queue synthetic children",
816*0fca6ea1SDimitry Andric                   "^std::__[[:alnum:]]+::queue<.+>$", stl_synth_flags, true);
8170b57cec5SDimitry Andric   AddCXXSynthetic(cpp_category_sp, LibcxxTupleFrontEndCreator,
8180b57cec5SDimitry Andric                   "libc++ std::tuple synthetic children",
819*0fca6ea1SDimitry Andric                   "^std::__[[:alnum:]]+::tuple<.*>$", stl_synth_flags, true);
8200eae32dcSDimitry Andric   AddCXXSynthetic(cpp_category_sp, LibcxxOptionalSyntheticFrontEndCreator,
8210b57cec5SDimitry Andric                   "libc++ std::optional synthetic children",
822*0fca6ea1SDimitry Andric                   "^std::__[[:alnum:]]+::optional<.+>$", stl_synth_flags, true);
8230b57cec5SDimitry Andric   AddCXXSynthetic(cpp_category_sp, LibcxxVariantFrontEndCreator,
8240b57cec5SDimitry Andric                   "libc++ std::variant synthetic children",
825*0fca6ea1SDimitry Andric                   "^std::__[[:alnum:]]+::variant<.+>$", stl_synth_flags, true);
8260b57cec5SDimitry Andric   AddCXXSynthetic(
8270b57cec5SDimitry Andric       cpp_category_sp,
8280b57cec5SDimitry Andric       lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator,
8290b57cec5SDimitry Andric       "libc++ std::atomic synthetic children",
83006c3fb27SDimitry Andric       "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags, true);
83181ad6265SDimitry Andric   AddCXXSynthetic(
83281ad6265SDimitry Andric       cpp_category_sp,
83381ad6265SDimitry Andric       lldb_private::formatters::LibcxxStdSpanSyntheticFrontEndCreator,
834*0fca6ea1SDimitry Andric       "libc++ std::span synthetic children", "^std::__[[:alnum:]]+::span<.+>$",
835*0fca6ea1SDimitry Andric       stl_deref_flags, true);
836bdd1243dSDimitry Andric   AddCXXSynthetic(
837bdd1243dSDimitry Andric       cpp_category_sp,
838bdd1243dSDimitry Andric       lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEndCreator,
839bdd1243dSDimitry Andric       "libc++ std::ranges::ref_view synthetic children",
840*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::ranges::ref_view<.+>$", stl_deref_flags, true);
8410b57cec5SDimitry Andric 
842bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
843*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::deque<.+>$", eFormatterMatchRegex,
8440b57cec5SDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
8450b57cec5SDimitry Andric           stl_synth_flags,
8460b57cec5SDimitry Andric           "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
8470b57cec5SDimitry Andric 
8480b57cec5SDimitry Andric   AddCXXSynthetic(
8490b57cec5SDimitry Andric       cpp_category_sp,
8500b57cec5SDimitry Andric       lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator,
851*0fca6ea1SDimitry Andric       "shared_ptr synthetic children", "^std::__[[:alnum:]]+::shared_ptr<.+>$",
852*0fca6ea1SDimitry Andric       stl_synth_flags, true);
8535ffd83dbSDimitry Andric 
85406c3fb27SDimitry Andric   static constexpr const char *const libcxx_std_unique_ptr_regex =
855*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::unique_ptr<.+>$";
8565ffd83dbSDimitry Andric   AddCXXSynthetic(
8575ffd83dbSDimitry Andric       cpp_category_sp,
8585ffd83dbSDimitry Andric       lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEndCreator,
8595ffd83dbSDimitry Andric       "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
8605ffd83dbSDimitry Andric       stl_synth_flags, true);
8615ffd83dbSDimitry Andric 
8620b57cec5SDimitry Andric   AddCXXSynthetic(
8630b57cec5SDimitry Andric       cpp_category_sp,
8640b57cec5SDimitry Andric       lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator,
865*0fca6ea1SDimitry Andric       "weak_ptr synthetic children", "^std::__[[:alnum:]]+::weak_ptr<.+>$",
866*0fca6ea1SDimitry Andric       stl_synth_flags, true);
867480093f4SDimitry Andric   AddCXXSummary(cpp_category_sp,
868480093f4SDimitry Andric                 lldb_private::formatters::LibcxxFunctionSummaryProvider,
869480093f4SDimitry Andric                 "libc++ std::function summary provider",
87006c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags, true);
8710b57cec5SDimitry Andric 
87206c3fb27SDimitry Andric   static constexpr const char *const libcxx_std_coroutine_handle_regex =
873*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::coroutine_handle<.+>$";
874bdd1243dSDimitry Andric   AddCXXSynthetic(
875bdd1243dSDimitry Andric       cpp_category_sp,
876bdd1243dSDimitry Andric       lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEndCreator,
877bdd1243dSDimitry Andric       "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,
878bdd1243dSDimitry Andric       stl_deref_flags, true);
879bdd1243dSDimitry Andric 
8800b57cec5SDimitry Andric   stl_summary_flags.SetDontShowChildren(false);
8810b57cec5SDimitry Andric   stl_summary_flags.SetSkipPointers(false);
8820b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
8830b57cec5SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
884*0fca6ea1SDimitry Andric                 "libc++ std::bitset summary provider",
885*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::bitset<.+>$", stl_summary_flags, true);
886*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
887*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
888*0fca6ea1SDimitry Andric                 "libc++ std::vector summary provider",
889*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::vector<.+>$", stl_summary_flags, true);
890*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
891*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
892*0fca6ea1SDimitry Andric                 "libc++ std::valarray summary provider",
893*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::valarray<.+>$", stl_summary_flags, true);
894*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
895*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxStdSliceArraySummaryProvider,
896*0fca6ea1SDimitry Andric                 "libc++ std::slice_array summary provider",
897*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::slice_array<.+>$", stl_summary_flags,
898*0fca6ea1SDimitry Andric                 true);
899*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
900*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
901*0fca6ea1SDimitry Andric                 "libc++ summary provider for the valarray proxy arrays",
902*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::(gslice|mask|indirect)_array<.+>$",
9030b57cec5SDimitry Andric                 stl_summary_flags, true);
9049dba64beSDimitry Andric   AddCXXSummary(
9059dba64beSDimitry Andric       cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
9060b57cec5SDimitry Andric       "libc++ std::list summary provider",
907*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::forward_list<.+>$", stl_summary_flags, true);
908*0fca6ea1SDimitry Andric   AddCXXSummary(
909*0fca6ea1SDimitry Andric       cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
910*0fca6ea1SDimitry Andric       "libc++ std::list summary provider",
911*0fca6ea1SDimitry Andric       // A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>$"
912*0fca6ea1SDimitry Andric       // so that it does not clash with: "^std::(__cxx11::)?list<.+>$"
91306c3fb27SDimitry Andric       "^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"
914*0fca6ea1SDimitry Andric       "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>$",
9150b57cec5SDimitry Andric       stl_summary_flags, true);
916*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
917*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
91806c3fb27SDimitry Andric                 "libc++ std::map summary provider",
919*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::map<.+>$", stl_summary_flags, true);
920*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
921*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
92206c3fb27SDimitry Andric                 "libc++ std::deque summary provider",
923*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::deque<.+>$", stl_summary_flags, true);
924*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
925*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
92606c3fb27SDimitry Andric                 "libc++ std::queue summary provider",
927*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::queue<.+>$", stl_summary_flags, true);
928*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
929*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
93006c3fb27SDimitry Andric                 "libc++ std::set summary provider",
931*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::set<.+>$", stl_summary_flags, true);
932*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
933*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
93406c3fb27SDimitry Andric                 "libc++ std::multiset summary provider",
935*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::multiset<.+>$", stl_summary_flags, true);
936*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
937*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
93806c3fb27SDimitry Andric                 "libc++ std::multimap summary provider",
939*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::multimap<.+>$", stl_summary_flags, true);
94006c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
94106c3fb27SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
9420b57cec5SDimitry Andric                 "libc++ std::unordered containers summary provider",
943*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::unordered_(multi)?(map|set)<.+> >$",
9440b57cec5SDimitry Andric                 stl_summary_flags, true);
9450b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp, LibcxxContainerSummaryProvider,
9460b57cec5SDimitry Andric                 "libc++ std::tuple summary provider",
947*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::tuple<.*>$", stl_summary_flags, true);
948349cc55cSDimitry Andric   AddCXXSummary(cpp_category_sp,
949349cc55cSDimitry Andric                 lldb_private::formatters::LibCxxAtomicSummaryProvider,
9500b57cec5SDimitry Andric                 "libc++ std::atomic summary provider",
95106c3fb27SDimitry Andric                 "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags, true);
952*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
953*0fca6ea1SDimitry Andric                 lldb_private::formatters::GenericOptionalSummaryProvider,
9540b57cec5SDimitry Andric                 "libc++ std::optional summary provider",
955*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::optional<.+>$", stl_summary_flags, true);
956*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
957*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxVariantSummaryProvider,
9580b57cec5SDimitry Andric                 "libc++ std::variant summary provider",
959*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::variant<.+>$", stl_summary_flags, true);
960*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
961*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxContainerSummaryProvider,
96281ad6265SDimitry Andric                 "libc++ std::span summary provider",
963*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::span<.+>$", stl_summary_flags, true);
9640b57cec5SDimitry Andric 
9650b57cec5SDimitry Andric   stl_summary_flags.SetSkipPointers(true);
9660b57cec5SDimitry Andric 
9670b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
9680b57cec5SDimitry Andric                 lldb_private::formatters::LibcxxSmartPointerSummaryProvider,
9690b57cec5SDimitry Andric                 "libc++ std::shared_ptr summary provider",
970*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::shared_ptr<.+>$", stl_summary_flags,
971*0fca6ea1SDimitry Andric                 true);
9720b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
9730b57cec5SDimitry Andric                 lldb_private::formatters::LibcxxSmartPointerSummaryProvider,
9740b57cec5SDimitry Andric                 "libc++ std::weak_ptr summary provider",
975*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::weak_ptr<.+>$", stl_summary_flags, true);
9765ffd83dbSDimitry Andric   AddCXXSummary(cpp_category_sp,
9775ffd83dbSDimitry Andric                 lldb_private::formatters::LibcxxUniquePointerSummaryProvider,
9785ffd83dbSDimitry Andric                 "libc++ std::unique_ptr summary provider",
9795ffd83dbSDimitry Andric                 libcxx_std_unique_ptr_regex, stl_summary_flags, true);
9800b57cec5SDimitry Andric 
981bdd1243dSDimitry Andric   AddCXXSummary(cpp_category_sp,
982bdd1243dSDimitry Andric                 lldb_private::formatters::StdlibCoroutineHandleSummaryProvider,
983bdd1243dSDimitry Andric                 "libc++ std::coroutine_handle summary provider",
984bdd1243dSDimitry Andric                 libcxx_std_coroutine_handle_regex, stl_summary_flags, true);
985bdd1243dSDimitry Andric 
9860b57cec5SDimitry Andric   AddCXXSynthetic(
9870b57cec5SDimitry Andric       cpp_category_sp,
9880b57cec5SDimitry Andric       lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator,
9890b57cec5SDimitry Andric       "std::vector iterator synthetic children",
99006c3fb27SDimitry Andric       "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags, true);
9910b57cec5SDimitry Andric 
9920b57cec5SDimitry Andric   AddCXXSynthetic(
9930b57cec5SDimitry Andric       cpp_category_sp,
9940b57cec5SDimitry Andric       lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator,
9950b57cec5SDimitry Andric       "std::map iterator synthetic children",
99606c3fb27SDimitry Andric       "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,
9970b57cec5SDimitry Andric       true);
998753f127fSDimitry Andric 
99906c3fb27SDimitry Andric   AddCXXSynthetic(cpp_category_sp,
1000753f127fSDimitry Andric                   lldb_private::formatters::
1001753f127fSDimitry Andric                       LibCxxUnorderedMapIteratorSyntheticFrontEndCreator,
1002753f127fSDimitry Andric                   "std::unordered_map iterator synthetic children",
100306c3fb27SDimitry Andric                   "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",
1004753f127fSDimitry Andric                   stl_synth_flags, true);
10055f757f3fSDimitry Andric   // Chrono duration typedefs
10065f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10075f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::nanoseconds", eFormatterMatchRegex,
10085f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(
10095f757f3fSDimitry Andric           eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ns")));
10105f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10115f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::microseconds", eFormatterMatchRegex,
10125f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(
10135f757f3fSDimitry Andric           eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} µs")));
10145f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10155f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::milliseconds", eFormatterMatchRegex,
10165f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(
10175f757f3fSDimitry Andric           eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} ms")));
10185f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10195f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
10205f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(
10215f757f3fSDimitry Andric           eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
10225f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10235f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::minutes", eFormatterMatchRegex,
10245f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
10255f757f3fSDimitry Andric                                                     eTypeOptionHideValue,
10265f757f3fSDimitry Andric                                                 "${var.__rep_} min")));
10275f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10285f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::hours", eFormatterMatchRegex,
10295f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(
10305f757f3fSDimitry Andric           eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} h")));
10315f757f3fSDimitry Andric 
10325f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10335f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::days", eFormatterMatchRegex,
10345f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
10355f757f3fSDimitry Andric                                                     eTypeOptionHideValue,
10365f757f3fSDimitry Andric                                                 "${var.__rep_} days")));
10375f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10385f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::weeks", eFormatterMatchRegex,
10395f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
10405f757f3fSDimitry Andric                                                     eTypeOptionHideValue,
10415f757f3fSDimitry Andric                                                 "${var.__rep_} weeks")));
10425f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10435f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::months", eFormatterMatchRegex,
10445f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
10455f757f3fSDimitry Andric                                                     eTypeOptionHideValue,
10465f757f3fSDimitry Andric                                                 "${var.__rep_} months")));
10475f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10485f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::years", eFormatterMatchRegex,
10495f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
10505f757f3fSDimitry Andric                                                     eTypeOptionHideValue,
10515f757f3fSDimitry Andric                                                 "${var.__rep_} years")));
10525f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
10535f757f3fSDimitry Andric       "^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
10545f757f3fSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(
10555f757f3fSDimitry Andric           eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1056297eecfbSDimitry Andric 
10577a6dacacSDimitry Andric   // Chrono time point types
10587a6dacacSDimitry Andric 
10597a6dacacSDimitry Andric   AddCXXSummary(cpp_category_sp,
10607a6dacacSDimitry Andric                 lldb_private::formatters::LibcxxChronoSysSecondsSummaryProvider,
10617a6dacacSDimitry Andric                 "libc++ std::chrono::sys_seconds summary provider",
10627a6dacacSDimitry Andric                 "^std::__[[:alnum:]]+::chrono::time_point<"
10637a6dacacSDimitry Andric                 "std::__[[:alnum:]]+::chrono::system_clock, "
1064*0fca6ea1SDimitry Andric                 "std::__[[:alnum:]]+::chrono::duration<.*, "
10657a6dacacSDimitry Andric                 "std::__[[:alnum:]]+::ratio<1, 1> "
10667a6dacacSDimitry Andric                 "> >$",
10677a6dacacSDimitry Andric                 eTypeOptionHideChildren | eTypeOptionHideValue |
10687a6dacacSDimitry Andric                     eTypeOptionCascade,
10697a6dacacSDimitry Andric                 true);
10707a6dacacSDimitry Andric   AddCXXSummary(cpp_category_sp,
10717a6dacacSDimitry Andric                 lldb_private::formatters::LibcxxChronoSysDaysSummaryProvider,
10727a6dacacSDimitry Andric                 "libc++ std::chrono::sys_seconds summary provider",
10737a6dacacSDimitry Andric                 "^std::__[[:alnum:]]+::chrono::time_point<"
10747a6dacacSDimitry Andric                 "std::__[[:alnum:]]+::chrono::system_clock, "
10757a6dacacSDimitry Andric                 "std::__[[:alnum:]]+::chrono::duration<int, "
10767a6dacacSDimitry Andric                 "std::__[[:alnum:]]+::ratio<86400, 1> "
10777a6dacacSDimitry Andric                 "> >$",
10787a6dacacSDimitry Andric                 eTypeOptionHideChildren | eTypeOptionHideValue |
10797a6dacacSDimitry Andric                     eTypeOptionCascade,
10807a6dacacSDimitry Andric                 true);
10817a6dacacSDimitry Andric 
1082*0fca6ea1SDimitry Andric   AddCXXSummary(
1083*0fca6ea1SDimitry Andric       cpp_category_sp,
1084*0fca6ea1SDimitry Andric       lldb_private::formatters::LibcxxChronoLocalSecondsSummaryProvider,
1085*0fca6ea1SDimitry Andric       "libc++ std::chrono::local_seconds summary provider",
1086*0fca6ea1SDimitry Andric       "^std::__[[:alnum:]]+::chrono::time_point<"
1087*0fca6ea1SDimitry Andric       "std::__[[:alnum:]]+::chrono::local_t, "
1088*0fca6ea1SDimitry Andric       "std::__[[:alnum:]]+::chrono::duration<.*, "
1089*0fca6ea1SDimitry Andric       "std::__[[:alnum:]]+::ratio<1, 1> "
1090*0fca6ea1SDimitry Andric       "> >$",
1091*0fca6ea1SDimitry Andric       eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,
1092*0fca6ea1SDimitry Andric       true);
1093*0fca6ea1SDimitry Andric   AddCXXSummary(cpp_category_sp,
1094*0fca6ea1SDimitry Andric                 lldb_private::formatters::LibcxxChronoLocalDaysSummaryProvider,
1095*0fca6ea1SDimitry Andric                 "libc++ std::chrono::local_seconds summary provider",
1096*0fca6ea1SDimitry Andric                 "^std::__[[:alnum:]]+::chrono::time_point<"
1097*0fca6ea1SDimitry Andric                 "std::__[[:alnum:]]+::chrono::local_t, "
1098*0fca6ea1SDimitry Andric                 "std::__[[:alnum:]]+::chrono::duration<int, "
1099*0fca6ea1SDimitry Andric                 "std::__[[:alnum:]]+::ratio<86400, 1> "
1100*0fca6ea1SDimitry Andric                 "> >$",
1101*0fca6ea1SDimitry Andric                 eTypeOptionHideChildren | eTypeOptionHideValue |
1102*0fca6ea1SDimitry Andric                     eTypeOptionCascade,
1103*0fca6ea1SDimitry Andric                 true);
1104*0fca6ea1SDimitry Andric 
1105297eecfbSDimitry Andric   // Chrono calendar types
1106297eecfbSDimitry Andric 
1107297eecfbSDimitry Andric   cpp_category_sp->AddTypeSummary(
1108297eecfbSDimitry Andric       "^std::__[[:alnum:]]+::chrono::day$", eFormatterMatchRegex,
1109297eecfbSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1110297eecfbSDimitry Andric                                                     eTypeOptionHideValue,
1111297eecfbSDimitry Andric                                                 "day=${var.__d_%u}")));
11127a6dacacSDimitry Andric 
1113297eecfbSDimitry Andric   AddCXXSummary(cpp_category_sp,
1114297eecfbSDimitry Andric                 lldb_private::formatters::LibcxxChronoMonthSummaryProvider,
1115297eecfbSDimitry Andric                 "libc++ std::chrono::month summary provider",
1116297eecfbSDimitry Andric                 "^std::__[[:alnum:]]+::chrono::month$",
1117297eecfbSDimitry Andric                 eTypeOptionHideChildren | eTypeOptionHideValue, true);
1118297eecfbSDimitry Andric 
1119297eecfbSDimitry Andric   cpp_category_sp->AddTypeSummary(
1120297eecfbSDimitry Andric       "^std::__[[:alnum:]]+::chrono::year$", eFormatterMatchRegex,
1121297eecfbSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(
1122297eecfbSDimitry Andric           eTypeOptionHideChildren | eTypeOptionHideValue, "year=${var.__y_}")));
1123297eecfbSDimitry Andric 
11247a6dacacSDimitry Andric   AddCXXSummary(cpp_category_sp,
11257a6dacacSDimitry Andric                 lldb_private::formatters::LibcxxChronoWeekdaySummaryProvider,
11267a6dacacSDimitry Andric                 "libc++ std::chrono::weekday summary provider",
11277a6dacacSDimitry Andric                 "^std::__[[:alnum:]]+::chrono::weekday$",
11287a6dacacSDimitry Andric                 eTypeOptionHideChildren | eTypeOptionHideValue, true);
11297a6dacacSDimitry Andric 
11307a6dacacSDimitry Andric   cpp_category_sp->AddTypeSummary(
11317a6dacacSDimitry Andric       "^std::__[[:alnum:]]+::chrono::weekday_indexed$", eFormatterMatchRegex,
11327a6dacacSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(
11337a6dacacSDimitry Andric           eTypeOptionHideChildren | eTypeOptionHideValue,
11347a6dacacSDimitry Andric           "${var.__wd_} index=${var.__idx_%u}")));
11357a6dacacSDimitry Andric 
11367a6dacacSDimitry Andric   cpp_category_sp->AddTypeSummary(
11377a6dacacSDimitry Andric       "^std::__[[:alnum:]]+::chrono::weekday_last$", eFormatterMatchRegex,
11387a6dacacSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
11397a6dacacSDimitry Andric                                                     eTypeOptionHideValue,
11407a6dacacSDimitry Andric                                                 "${var.__wd_} index=last")));
1141297eecfbSDimitry Andric   cpp_category_sp->AddTypeSummary(
1142297eecfbSDimitry Andric       "^std::__[[:alnum:]]+::chrono::month_day$", eFormatterMatchRegex,
1143297eecfbSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1144297eecfbSDimitry Andric                                                     eTypeOptionHideValue,
1145297eecfbSDimitry Andric                                                 "${var.__m_} ${var.__d_}")));
1146297eecfbSDimitry Andric   cpp_category_sp->AddTypeSummary(
1147297eecfbSDimitry Andric       "^std::__[[:alnum:]]+::chrono::month_day_last$", eFormatterMatchRegex,
1148297eecfbSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1149297eecfbSDimitry Andric                                                     eTypeOptionHideValue,
1150297eecfbSDimitry Andric                                                 "${var.__m_} day=last")));
11517a6dacacSDimitry Andric 
11527a6dacacSDimitry Andric   cpp_category_sp->AddTypeSummary(
11537a6dacacSDimitry Andric       "^std::__[[:alnum:]]+::chrono::month_weekday$", eFormatterMatchRegex,
11547a6dacacSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
11557a6dacacSDimitry Andric                                                     eTypeOptionHideValue,
11567a6dacacSDimitry Andric                                                 "${var.__m_} ${var.__wdi_}")));
11577a6dacacSDimitry Andric 
11587a6dacacSDimitry Andric   cpp_category_sp->AddTypeSummary(
11597a6dacacSDimitry Andric       "^std::__[[:alnum:]]+::chrono::month_weekday_last$", eFormatterMatchRegex,
11607a6dacacSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
11617a6dacacSDimitry Andric                                                     eTypeOptionHideValue,
11627a6dacacSDimitry Andric                                                 "${var.__m_} ${var.__wdl_}")));
11637a6dacacSDimitry Andric 
11647a6dacacSDimitry Andric   cpp_category_sp->AddTypeSummary(
11657a6dacacSDimitry Andric       "^std::__[[:alnum:]]+::chrono::year_month$", eFormatterMatchRegex,
11667a6dacacSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
11677a6dacacSDimitry Andric                                                     eTypeOptionHideValue,
11687a6dacacSDimitry Andric                                                 "${var.__y_} ${var.__m_}")));
11697a6dacacSDimitry Andric 
1170297eecfbSDimitry Andric   AddCXXSummary(
1171297eecfbSDimitry Andric       cpp_category_sp,
1172297eecfbSDimitry Andric       lldb_private::formatters::LibcxxChronoYearMonthDaySummaryProvider,
1173297eecfbSDimitry Andric       "libc++ std::chrono::year_month_day summary provider",
1174297eecfbSDimitry Andric       "^std::__[[:alnum:]]+::chrono::year_month_day$",
1175297eecfbSDimitry Andric       eTypeOptionHideChildren | eTypeOptionHideValue, true);
11767a6dacacSDimitry Andric 
11777a6dacacSDimitry Andric   cpp_category_sp->AddTypeSummary(
11787a6dacacSDimitry Andric       "^std::__[[:alnum:]]+::chrono::year_month_day_last$",
11797a6dacacSDimitry Andric       eFormatterMatchRegex,
11807a6dacacSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
11817a6dacacSDimitry Andric                                                     eTypeOptionHideValue,
11827a6dacacSDimitry Andric                                                 "${var.__y_} ${var.__mdl_}")));
11837a6dacacSDimitry Andric 
11847a6dacacSDimitry Andric   cpp_category_sp->AddTypeSummary(
11857a6dacacSDimitry Andric       "^std::__[[:alnum:]]+::chrono::year_month_weekday$", eFormatterMatchRegex,
11867a6dacacSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(
11877a6dacacSDimitry Andric           eTypeOptionHideChildren | eTypeOptionHideValue,
11887a6dacacSDimitry Andric           "${var.__y_} ${var.__m_} ${var.__wdi_}")));
11897a6dacacSDimitry Andric 
11907a6dacacSDimitry Andric   cpp_category_sp->AddTypeSummary(
11917a6dacacSDimitry Andric       "^std::__[[:alnum:]]+::chrono::year_month_weekday_last$",
11927a6dacacSDimitry Andric       eFormatterMatchRegex,
11937a6dacacSDimitry Andric       TypeSummaryImplSP(new StringSummaryFormat(
11947a6dacacSDimitry Andric           eTypeOptionHideChildren | eTypeOptionHideValue,
11957a6dacacSDimitry Andric           "${var.__y_} ${var.__m_} ${var.__wdl_}")));
11960b57cec5SDimitry Andric }
11970b57cec5SDimitry Andric 
11980b57cec5SDimitry Andric static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
11990b57cec5SDimitry Andric   if (!cpp_category_sp)
12000b57cec5SDimitry Andric     return;
12010b57cec5SDimitry Andric 
12020b57cec5SDimitry Andric   TypeSummaryImpl::Flags stl_summary_flags;
12030b57cec5SDimitry Andric   stl_summary_flags.SetCascades(true)
12040b57cec5SDimitry Andric       .SetSkipPointers(false)
12050b57cec5SDimitry Andric       .SetSkipReferences(false)
12060b57cec5SDimitry Andric       .SetDontShowChildren(true)
12070b57cec5SDimitry Andric       .SetDontShowValue(true)
12080b57cec5SDimitry Andric       .SetShowMembersOneLiner(false)
12090b57cec5SDimitry Andric       .SetHideItemNames(false);
12100b57cec5SDimitry Andric 
12110b57cec5SDimitry Andric   lldb::TypeSummaryImplSP std_string_summary_sp(
12120b57cec5SDimitry Andric       new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p}"));
12130b57cec5SDimitry Andric 
12140b57cec5SDimitry Andric   lldb::TypeSummaryImplSP cxx11_string_summary_sp(new CXXFunctionSummaryFormat(
12150b57cec5SDimitry Andric       stl_summary_flags, LibStdcppStringSummaryProvider,
12160b57cec5SDimitry Andric       "libstdc++ c++11 std::string summary provider"));
12170b57cec5SDimitry Andric   lldb::TypeSummaryImplSP cxx11_wstring_summary_sp(new CXXFunctionSummaryFormat(
12180b57cec5SDimitry Andric       stl_summary_flags, LibStdcppWStringSummaryProvider,
12190b57cec5SDimitry Andric       "libstdc++ c++11 std::wstring summary provider"));
12200b57cec5SDimitry Andric 
1221bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("std::string", eFormatterMatchExact,
12220b57cec5SDimitry Andric                                   std_string_summary_sp);
1223bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("std::basic_string<char>",
12245f757f3fSDimitry Andric                                   eFormatterMatchExact, std_string_summary_sp);
1225bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary(
1226bdd1243dSDimitry Andric       "std::basic_string<char,std::char_traits<char>,std::allocator<char> >",
1227bdd1243dSDimitry Andric       eFormatterMatchExact, std_string_summary_sp);
1228bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary(
1229bdd1243dSDimitry Andric       "std::basic_string<char, std::char_traits<char>, std::allocator<char> >",
1230bdd1243dSDimitry Andric       eFormatterMatchExact, std_string_summary_sp);
12310b57cec5SDimitry Andric 
1232bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact,
12330b57cec5SDimitry Andric                                   cxx11_string_summary_sp);
1234bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary(
1235bdd1243dSDimitry Andric       "std::__cxx11::basic_string<char, std::char_traits<char>, "
1236bdd1243dSDimitry Andric       "std::allocator<char> >",
1237bdd1243dSDimitry Andric       eFormatterMatchExact, cxx11_string_summary_sp);
1238bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("std::__cxx11::basic_string<unsigned char, "
1239349cc55cSDimitry Andric                                   "std::char_traits<unsigned char>, "
1240bdd1243dSDimitry Andric                                   "std::allocator<unsigned char> >",
1241bdd1243dSDimitry Andric                                   eFormatterMatchExact,
1242480093f4SDimitry Andric                                   cxx11_string_summary_sp);
12430b57cec5SDimitry Andric 
12440b57cec5SDimitry Andric   // making sure we force-pick the summary for printing wstring (_M_p is a
12450b57cec5SDimitry Andric   // wchar_t*)
12460b57cec5SDimitry Andric   lldb::TypeSummaryImplSP std_wstring_summary_sp(
12470b57cec5SDimitry Andric       new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p%S}"));
12480b57cec5SDimitry Andric 
1249bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("std::wstring", eFormatterMatchExact,
12500b57cec5SDimitry Andric                                   std_wstring_summary_sp);
1251bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("std::basic_string<wchar_t>",
1252bdd1243dSDimitry Andric                                   eFormatterMatchExact, std_wstring_summary_sp);
1253bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("std::basic_string<wchar_t,std::char_traits<"
1254bdd1243dSDimitry Andric                                   "wchar_t>,std::allocator<wchar_t> >",
1255bdd1243dSDimitry Andric                                   eFormatterMatchExact, std_wstring_summary_sp);
1256bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary(
1257bdd1243dSDimitry Andric       "std::basic_string<wchar_t, std::char_traits<wchar_t>, "
1258bdd1243dSDimitry Andric       "std::allocator<wchar_t> >",
1259bdd1243dSDimitry Andric       eFormatterMatchExact, std_wstring_summary_sp);
12600b57cec5SDimitry Andric 
1261bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact,
12620b57cec5SDimitry Andric                                   cxx11_wstring_summary_sp);
1263bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary(
1264bdd1243dSDimitry Andric       "std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, "
1265bdd1243dSDimitry Andric       "std::allocator<wchar_t> >",
1266bdd1243dSDimitry Andric       eFormatterMatchExact, cxx11_wstring_summary_sp);
12670b57cec5SDimitry Andric 
12680b57cec5SDimitry Andric   SyntheticChildren::Flags stl_synth_flags;
12690b57cec5SDimitry Andric   stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
12700b57cec5SDimitry Andric       false);
1271349cc55cSDimitry Andric   SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1272349cc55cSDimitry Andric   stl_deref_flags.SetFrontEndWantsDereference();
12730b57cec5SDimitry Andric 
1274bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
1275bdd1243dSDimitry Andric       "^std::vector<.+>(( )?&)?$", eFormatterMatchRegex,
12760b57cec5SDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
12770b57cec5SDimitry Andric           stl_synth_flags,
12780b57cec5SDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
1279bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
1280bdd1243dSDimitry Andric       "^std::map<.+> >(( )?&)?$", eFormatterMatchRegex,
12810b57cec5SDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
12820b57cec5SDimitry Andric           stl_synth_flags,
1283349cc55cSDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1284bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
1285bdd1243dSDimitry Andric       "^std::deque<.+>(( )?&)?$", eFormatterMatchRegex,
12860eae32dcSDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
12870eae32dcSDimitry Andric           stl_deref_flags,
12880eae32dcSDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
1289bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
1290bdd1243dSDimitry Andric       "^std::set<.+> >(( )?&)?$", eFormatterMatchRegex,
1291349cc55cSDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
1292349cc55cSDimitry Andric           stl_deref_flags,
1293349cc55cSDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1294bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
1295bdd1243dSDimitry Andric       "^std::multimap<.+> >(( )?&)?$", eFormatterMatchRegex,
1296349cc55cSDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
1297349cc55cSDimitry Andric           stl_deref_flags,
1298349cc55cSDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1299bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
1300bdd1243dSDimitry Andric       "^std::multiset<.+> >(( )?&)?$", eFormatterMatchRegex,
1301349cc55cSDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
1302349cc55cSDimitry Andric           stl_deref_flags,
1303349cc55cSDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1304bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
1305bdd1243dSDimitry Andric       "^std::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex,
13064824e7fdSDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
13074824e7fdSDimitry Andric           stl_deref_flags,
13084824e7fdSDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
1309bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
1310bdd1243dSDimitry Andric       "^std::(__cxx11::)?list<.+>(( )?&)?$", eFormatterMatchRegex,
13110b57cec5SDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
13120eae32dcSDimitry Andric           stl_deref_flags,
13130b57cec5SDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
1314bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
1315bdd1243dSDimitry Andric       "^std::(__cxx11::)?forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1316349cc55cSDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
1317349cc55cSDimitry Andric           stl_synth_flags,
1318349cc55cSDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
13195f757f3fSDimitry Andric   cpp_category_sp->AddTypeSynthetic(
13205f757f3fSDimitry Andric       "^std::variant<.+>$", eFormatterMatchRegex,
13215f757f3fSDimitry Andric       SyntheticChildrenSP(new ScriptedSyntheticChildren(
13225f757f3fSDimitry Andric           stl_synth_flags,
13235f757f3fSDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.VariantSynthProvider")));
13244824e7fdSDimitry Andric 
13250b57cec5SDimitry Andric   stl_summary_flags.SetDontShowChildren(false);
1326349cc55cSDimitry Andric   stl_summary_flags.SetSkipPointers(false);
1327bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("^std::bitset<.+>(( )?&)?$",
1328bdd1243dSDimitry Andric                                   eFormatterMatchRegex,
1329bdd1243dSDimitry Andric                                   TypeSummaryImplSP(new StringSummaryFormat(
1330bdd1243dSDimitry Andric                                       stl_summary_flags, "size=${svar%#}")));
1331bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("^std::vector<.+>(( )?&)?$",
1332bdd1243dSDimitry Andric                                   eFormatterMatchRegex,
1333bdd1243dSDimitry Andric                                   TypeSummaryImplSP(new StringSummaryFormat(
1334bdd1243dSDimitry Andric                                       stl_summary_flags, "size=${svar%#}")));
1335bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("^std::map<.+> >(( )?&)?$",
1336bdd1243dSDimitry Andric                                   eFormatterMatchRegex,
1337bdd1243dSDimitry Andric                                   TypeSummaryImplSP(new StringSummaryFormat(
1338bdd1243dSDimitry Andric                                       stl_summary_flags, "size=${svar%#}")));
1339bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("^std::set<.+> >(( )?&)?$",
1340bdd1243dSDimitry Andric                                   eFormatterMatchRegex,
1341bdd1243dSDimitry Andric                                   TypeSummaryImplSP(new StringSummaryFormat(
1342bdd1243dSDimitry Andric                                       stl_summary_flags, "size=${svar%#}")));
1343bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("^std::deque<.+>(( )?&)?$",
1344bdd1243dSDimitry Andric                                   eFormatterMatchRegex,
1345bdd1243dSDimitry Andric                                   TypeSummaryImplSP(new StringSummaryFormat(
1346bdd1243dSDimitry Andric                                       stl_summary_flags, "size=${svar%#}")));
1347bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("^std::multimap<.+> >(( )?&)?$",
1348bdd1243dSDimitry Andric                                   eFormatterMatchRegex,
1349bdd1243dSDimitry Andric                                   TypeSummaryImplSP(new StringSummaryFormat(
1350bdd1243dSDimitry Andric                                       stl_summary_flags, "size=${svar%#}")));
1351bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("^std::multiset<.+> >(( )?&)?$",
1352bdd1243dSDimitry Andric                                   eFormatterMatchRegex,
1353bdd1243dSDimitry Andric                                   TypeSummaryImplSP(new StringSummaryFormat(
1354bdd1243dSDimitry Andric                                       stl_summary_flags, "size=${svar%#}")));
1355bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("^std::unordered_(multi)?(map|set)<.+> >$",
1356bdd1243dSDimitry Andric                                   eFormatterMatchRegex,
1357bdd1243dSDimitry Andric                                   TypeSummaryImplSP(new StringSummaryFormat(
1358bdd1243dSDimitry Andric                                       stl_summary_flags, "size=${svar%#}")));
1359bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary("^std::(__cxx11::)?list<.+>(( )?&)?$",
1360bdd1243dSDimitry Andric                                   eFormatterMatchRegex,
1361bdd1243dSDimitry Andric                                   TypeSummaryImplSP(new StringSummaryFormat(
1362bdd1243dSDimitry Andric                                       stl_summary_flags, "size=${svar%#}")));
1363bdd1243dSDimitry Andric   cpp_category_sp->AddTypeSummary(
1364bdd1243dSDimitry Andric       "^std::(__cxx11::)?forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1365bdd1243dSDimitry Andric       TypeSummaryImplSP(new ScriptSummaryFormat(
1366bdd1243dSDimitry Andric           stl_summary_flags,
1367bdd1243dSDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
13685f757f3fSDimitry Andric   cpp_category_sp->AddTypeSummary(
13695f757f3fSDimitry Andric       "^std::variant<.+>$", eFormatterMatchRegex,
13705f757f3fSDimitry Andric       TypeSummaryImplSP(new ScriptSummaryFormat(
13715f757f3fSDimitry Andric           stl_summary_flags,
13725f757f3fSDimitry Andric           "lldb.formatters.cpp.gnu_libstdcpp.VariantSummaryProvider")));
13730b57cec5SDimitry Andric 
13740b57cec5SDimitry Andric   AddCXXSynthetic(
13750b57cec5SDimitry Andric       cpp_category_sp,
13760b57cec5SDimitry Andric       lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator,
13770b57cec5SDimitry Andric       "std::vector iterator synthetic children",
137806c3fb27SDimitry Andric       "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags, true);
13790b57cec5SDimitry Andric 
13800b57cec5SDimitry Andric   AddCXXSynthetic(
13810b57cec5SDimitry Andric       cpp_category_sp,
13820b57cec5SDimitry Andric       lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator,
138306c3fb27SDimitry Andric       "std::map iterator synthetic children", "^std::_Rb_tree_iterator<.+>$",
138406c3fb27SDimitry Andric       stl_synth_flags, true);
13850b57cec5SDimitry Andric 
13860b57cec5SDimitry Andric   AddCXXSynthetic(
13870b57cec5SDimitry Andric       cpp_category_sp,
13880b57cec5SDimitry Andric       lldb_private::formatters::LibStdcppUniquePtrSyntheticFrontEndCreator,
138906c3fb27SDimitry Andric       "std::unique_ptr synthetic children", "^std::unique_ptr<.+>(( )?&)?$",
139006c3fb27SDimitry Andric       stl_synth_flags, true);
13910b57cec5SDimitry Andric   AddCXXSynthetic(
13920b57cec5SDimitry Andric       cpp_category_sp,
13930b57cec5SDimitry Andric       lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator,
139406c3fb27SDimitry Andric       "std::shared_ptr synthetic children", "^std::shared_ptr<.+>(( )?&)?$",
139506c3fb27SDimitry Andric       stl_synth_flags, true);
13960b57cec5SDimitry Andric   AddCXXSynthetic(
13970b57cec5SDimitry Andric       cpp_category_sp,
13980b57cec5SDimitry Andric       lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator,
139906c3fb27SDimitry Andric       "std::weak_ptr synthetic children", "^std::weak_ptr<.+>(( )?&)?$",
140006c3fb27SDimitry Andric       stl_synth_flags, true);
14010b57cec5SDimitry Andric   AddCXXSynthetic(
14020b57cec5SDimitry Andric       cpp_category_sp,
14030b57cec5SDimitry Andric       lldb_private::formatters::LibStdcppTupleSyntheticFrontEndCreator,
140406c3fb27SDimitry Andric       "std::tuple synthetic children", "^std::tuple<.+>(( )?&)?$",
14050b57cec5SDimitry Andric       stl_synth_flags, true);
14060b57cec5SDimitry Andric 
140706c3fb27SDimitry Andric   static constexpr const char *const libstdcpp_std_coroutine_handle_regex =
140806c3fb27SDimitry Andric       "^std::coroutine_handle<.+>(( )?&)?$";
1409bdd1243dSDimitry Andric   AddCXXSynthetic(
1410bdd1243dSDimitry Andric       cpp_category_sp,
1411bdd1243dSDimitry Andric       lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEndCreator,
1412bdd1243dSDimitry Andric       "std::coroutine_handle synthetic children",
1413bdd1243dSDimitry Andric       libstdcpp_std_coroutine_handle_regex, stl_deref_flags, true);
1414bdd1243dSDimitry Andric 
1415349cc55cSDimitry Andric   AddCXXSynthetic(
1416349cc55cSDimitry Andric       cpp_category_sp,
1417349cc55cSDimitry Andric       lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator,
141806c3fb27SDimitry Andric       "std::bitset synthetic child", "^std::bitset<.+>(( )?&)?$",
1419349cc55cSDimitry Andric       stl_deref_flags, true);
1420349cc55cSDimitry Andric 
14210eae32dcSDimitry Andric   AddCXXSynthetic(
14220eae32dcSDimitry Andric       cpp_category_sp,
14230eae32dcSDimitry Andric       lldb_private::formatters::LibStdcppOptionalSyntheticFrontEndCreator,
142406c3fb27SDimitry Andric       "std::optional synthetic child", "^std::optional<.+>(( )?&)?$",
142506c3fb27SDimitry Andric       stl_deref_flags, true);
14260eae32dcSDimitry Andric 
14270b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
14280b57cec5SDimitry Andric                 lldb_private::formatters::LibStdcppUniquePointerSummaryProvider,
14290b57cec5SDimitry Andric                 "libstdc++ std::unique_ptr summary provider",
143006c3fb27SDimitry Andric                 "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags, true);
14310b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
14320b57cec5SDimitry Andric                 lldb_private::formatters::LibStdcppSmartPointerSummaryProvider,
14330b57cec5SDimitry Andric                 "libstdc++ std::shared_ptr summary provider",
143406c3fb27SDimitry Andric                 "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags, true);
14350b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
14360b57cec5SDimitry Andric                 lldb_private::formatters::LibStdcppSmartPointerSummaryProvider,
14370b57cec5SDimitry Andric                 "libstdc++ std::weak_ptr summary provider",
143806c3fb27SDimitry Andric                 "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1439bdd1243dSDimitry Andric   AddCXXSummary(cpp_category_sp,
1440bdd1243dSDimitry Andric                 lldb_private::formatters::StdlibCoroutineHandleSummaryProvider,
1441bdd1243dSDimitry Andric                 "libstdc++ std::coroutine_handle summary provider",
1442bdd1243dSDimitry Andric                 libstdcpp_std_coroutine_handle_regex, stl_summary_flags, true);
144306c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
144406c3fb27SDimitry Andric                 lldb_private::formatters::GenericOptionalSummaryProvider,
14450eae32dcSDimitry Andric                 "libstd++ std::optional summary provider",
144606c3fb27SDimitry Andric                 "^std::optional<.+>(( )?&)?$", stl_summary_flags, true);
14470b57cec5SDimitry Andric }
14480b57cec5SDimitry Andric 
14490b57cec5SDimitry Andric static void LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
14500b57cec5SDimitry Andric   if (!cpp_category_sp)
14510b57cec5SDimitry Andric     return;
14520b57cec5SDimitry Andric 
14530b57cec5SDimitry Andric   TypeSummaryImpl::Flags string_flags;
14540b57cec5SDimitry Andric   string_flags.SetCascades(true)
14550b57cec5SDimitry Andric       .SetSkipPointers(true)
14560b57cec5SDimitry Andric       .SetSkipReferences(false)
14570b57cec5SDimitry Andric       .SetDontShowChildren(true)
14580b57cec5SDimitry Andric       .SetDontShowValue(false)
14590b57cec5SDimitry Andric       .SetShowMembersOneLiner(false)
14600b57cec5SDimitry Andric       .SetHideItemNames(false);
14610b57cec5SDimitry Andric 
14620b57cec5SDimitry Andric   TypeSummaryImpl::Flags string_array_flags;
14630b57cec5SDimitry Andric   string_array_flags.SetCascades(true)
14640b57cec5SDimitry Andric       .SetSkipPointers(true)
14650b57cec5SDimitry Andric       .SetSkipReferences(false)
14660b57cec5SDimitry Andric       .SetDontShowChildren(true)
14670b57cec5SDimitry Andric       .SetDontShowValue(true)
14680b57cec5SDimitry Andric       .SetShowMembersOneLiner(false)
14690b57cec5SDimitry Andric       .SetHideItemNames(false);
14700b57cec5SDimitry Andric 
14719dba64beSDimitry Andric   AddCXXSummary(cpp_category_sp,
14729dba64beSDimitry Andric                 lldb_private::formatters::Char8StringSummaryProvider,
147306c3fb27SDimitry Andric                 "char8_t * summary provider", "char8_t *", string_flags);
147406c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
147506c3fb27SDimitry Andric                 lldb_private::formatters::Char8StringSummaryProvider,
147606c3fb27SDimitry Andric                 "char8_t [] summary provider", "char8_t ?\\[[0-9]+\\]",
147706c3fb27SDimitry Andric                 string_array_flags, true);
14789dba64beSDimitry Andric 
14790b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
14800b57cec5SDimitry Andric                 lldb_private::formatters::Char16StringSummaryProvider,
148106c3fb27SDimitry Andric                 "char16_t * summary provider", "char16_t *", string_flags);
148206c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
148306c3fb27SDimitry Andric                 lldb_private::formatters::Char16StringSummaryProvider,
148406c3fb27SDimitry Andric                 "char16_t [] summary provider", "char16_t ?\\[[0-9]+\\]",
148506c3fb27SDimitry Andric                 string_array_flags, true);
14860b57cec5SDimitry Andric 
14870b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
14880b57cec5SDimitry Andric                 lldb_private::formatters::Char32StringSummaryProvider,
148906c3fb27SDimitry Andric                 "char32_t * summary provider", "char32_t *", string_flags);
149006c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
149106c3fb27SDimitry Andric                 lldb_private::formatters::Char32StringSummaryProvider,
149206c3fb27SDimitry Andric                 "char32_t [] summary provider", "char32_t ?\\[[0-9]+\\]",
149306c3fb27SDimitry Andric                 string_array_flags, true);
14940b57cec5SDimitry Andric 
14950b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp,
14960b57cec5SDimitry Andric                 lldb_private::formatters::WCharStringSummaryProvider,
149706c3fb27SDimitry Andric                 "wchar_t * summary provider", "wchar_t *", string_flags);
149806c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
149906c3fb27SDimitry Andric                 lldb_private::formatters::WCharStringSummaryProvider,
150006c3fb27SDimitry Andric                 "wchar_t * summary provider", "wchar_t ?\\[[0-9]+\\]",
150106c3fb27SDimitry Andric                 string_array_flags, true);
15020b57cec5SDimitry Andric 
150306c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
150406c3fb27SDimitry Andric                 lldb_private::formatters::Char16StringSummaryProvider,
150506c3fb27SDimitry Andric                 "unichar * summary provider", "unichar *", string_flags);
15060b57cec5SDimitry Andric 
15070b57cec5SDimitry Andric   TypeSummaryImpl::Flags widechar_flags;
15080b57cec5SDimitry Andric   widechar_flags.SetDontShowValue(true)
15090b57cec5SDimitry Andric       .SetSkipPointers(true)
15100b57cec5SDimitry Andric       .SetSkipReferences(false)
15110b57cec5SDimitry Andric       .SetCascades(true)
15120b57cec5SDimitry Andric       .SetDontShowChildren(true)
15130b57cec5SDimitry Andric       .SetHideItemNames(true)
15140b57cec5SDimitry Andric       .SetShowMembersOneLiner(false);
15150b57cec5SDimitry Andric 
15169dba64beSDimitry Andric   AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char8SummaryProvider,
151706c3fb27SDimitry Andric                 "char8_t summary provider", "char8_t", widechar_flags);
151806c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
151906c3fb27SDimitry Andric                 lldb_private::formatters::Char16SummaryProvider,
152006c3fb27SDimitry Andric                 "char16_t summary provider", "char16_t", widechar_flags);
152106c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
152206c3fb27SDimitry Andric                 lldb_private::formatters::Char32SummaryProvider,
152306c3fb27SDimitry Andric                 "char32_t summary provider", "char32_t", widechar_flags);
15240b57cec5SDimitry Andric   AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharSummaryProvider,
152506c3fb27SDimitry Andric                 "wchar_t summary provider", "wchar_t", widechar_flags);
15260b57cec5SDimitry Andric 
152706c3fb27SDimitry Andric   AddCXXSummary(cpp_category_sp,
152806c3fb27SDimitry Andric                 lldb_private::formatters::Char16SummaryProvider,
152906c3fb27SDimitry Andric                 "unichar summary provider", "unichar", widechar_flags);
15300b57cec5SDimitry Andric }
15310b57cec5SDimitry Andric 
15320b57cec5SDimitry Andric std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() {
15330b57cec5SDimitry Andric   class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger {
15340b57cec5SDimitry Andric   public:
15350b57cec5SDimitry Andric     CompilerType AdjustForInclusion(CompilerType &candidate) override {
15360b57cec5SDimitry Andric       LanguageType lang_type(candidate.GetMinimumLanguage());
15370b57cec5SDimitry Andric       if (!Language::LanguageIsC(lang_type) &&
15380b57cec5SDimitry Andric           !Language::LanguageIsCPlusPlus(lang_type))
15390b57cec5SDimitry Andric         return CompilerType();
15400b57cec5SDimitry Andric       if (candidate.IsTypedefType())
15410b57cec5SDimitry Andric         return candidate.GetTypedefedType();
15420b57cec5SDimitry Andric       return candidate;
15430b57cec5SDimitry Andric     }
15440b57cec5SDimitry Andric   };
15450b57cec5SDimitry Andric 
15460b57cec5SDimitry Andric   return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger());
15470b57cec5SDimitry Andric }
15480b57cec5SDimitry Andric 
15490b57cec5SDimitry Andric lldb::TypeCategoryImplSP CPlusPlusLanguage::GetFormatters() {
15500b57cec5SDimitry Andric   static llvm::once_flag g_initialize;
15510b57cec5SDimitry Andric   static TypeCategoryImplSP g_category;
15520b57cec5SDimitry Andric 
15530b57cec5SDimitry Andric   llvm::call_once(g_initialize, [this]() -> void {
1554349cc55cSDimitry Andric     DataVisualization::Categories::GetCategory(ConstString(GetPluginName()),
1555349cc55cSDimitry Andric                                                g_category);
15560b57cec5SDimitry Andric     if (g_category) {
15570b57cec5SDimitry Andric       LoadLibStdcppFormatters(g_category);
15580b57cec5SDimitry Andric       LoadLibCxxFormatters(g_category);
15590b57cec5SDimitry Andric       LoadSystemFormatters(g_category);
15600b57cec5SDimitry Andric     }
15610b57cec5SDimitry Andric   });
15620b57cec5SDimitry Andric   return g_category;
15630b57cec5SDimitry Andric }
15640b57cec5SDimitry Andric 
15650b57cec5SDimitry Andric HardcodedFormatters::HardcodedSummaryFinder
15660b57cec5SDimitry Andric CPlusPlusLanguage::GetHardcodedSummaries() {
15670b57cec5SDimitry Andric   static llvm::once_flag g_initialize;
15680b57cec5SDimitry Andric   static ConstString g_vectortypes("VectorTypes");
15690b57cec5SDimitry Andric   static HardcodedFormatters::HardcodedSummaryFinder g_formatters;
15700b57cec5SDimitry Andric 
15710b57cec5SDimitry Andric   llvm::call_once(g_initialize, []() -> void {
15720b57cec5SDimitry Andric     g_formatters.push_back(
15730b57cec5SDimitry Andric         [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
15740b57cec5SDimitry Andric            FormatManager &) -> TypeSummaryImpl::SharedPointer {
15750b57cec5SDimitry Andric           static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
15760b57cec5SDimitry Andric               new CXXFunctionSummaryFormat(
15770b57cec5SDimitry Andric                   TypeSummaryImpl::Flags(),
15780b57cec5SDimitry Andric                   lldb_private::formatters::CXXFunctionPointerSummaryProvider,
15790b57cec5SDimitry Andric                   "Function pointer summary provider"));
158006c3fb27SDimitry Andric           if (CompilerType CT = valobj.GetCompilerType();
15815f757f3fSDimitry Andric               CT.IsFunctionPointerType() || CT.IsMemberFunctionPointerType() ||
15825f757f3fSDimitry Andric               valobj.GetValueType() == lldb::eValueTypeVTableEntry) {
15830b57cec5SDimitry Andric             return formatter_sp;
15840b57cec5SDimitry Andric           }
15850b57cec5SDimitry Andric           return nullptr;
15860b57cec5SDimitry Andric         });
15870b57cec5SDimitry Andric     g_formatters.push_back(
15880b57cec5SDimitry Andric         [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
15890b57cec5SDimitry Andric            FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer {
15900b57cec5SDimitry Andric           static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
15910b57cec5SDimitry Andric               new CXXFunctionSummaryFormat(
15920b57cec5SDimitry Andric                   TypeSummaryImpl::Flags()
15930b57cec5SDimitry Andric                       .SetCascades(true)
15940b57cec5SDimitry Andric                       .SetDontShowChildren(true)
15950b57cec5SDimitry Andric                       .SetHideItemNames(true)
15960b57cec5SDimitry Andric                       .SetShowMembersOneLiner(true)
15970b57cec5SDimitry Andric                       .SetSkipPointers(true)
15980b57cec5SDimitry Andric                       .SetSkipReferences(false),
15990b57cec5SDimitry Andric                   lldb_private::formatters::VectorTypeSummaryProvider,
16000b57cec5SDimitry Andric                   "vector_type pointer summary provider"));
1601fe6060f1SDimitry Andric           if (valobj.GetCompilerType().IsVectorType()) {
16020b57cec5SDimitry Andric             if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
16030b57cec5SDimitry Andric               return formatter_sp;
16040b57cec5SDimitry Andric           }
16050b57cec5SDimitry Andric           return nullptr;
16060b57cec5SDimitry Andric         });
16070b57cec5SDimitry Andric     g_formatters.push_back(
16080b57cec5SDimitry Andric         [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
16090b57cec5SDimitry Andric            FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer {
16100b57cec5SDimitry Andric           static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
16110b57cec5SDimitry Andric               new CXXFunctionSummaryFormat(
16120b57cec5SDimitry Andric                   TypeSummaryImpl::Flags()
16130b57cec5SDimitry Andric                       .SetCascades(true)
16140b57cec5SDimitry Andric                       .SetDontShowChildren(true)
16150b57cec5SDimitry Andric                       .SetHideItemNames(true)
16160b57cec5SDimitry Andric                       .SetShowMembersOneLiner(true)
16170b57cec5SDimitry Andric                       .SetSkipPointers(true)
16180b57cec5SDimitry Andric                       .SetSkipReferences(false),
16190b57cec5SDimitry Andric                   lldb_private::formatters::BlockPointerSummaryProvider,
16200b57cec5SDimitry Andric                   "block pointer summary provider"));
1621fe6060f1SDimitry Andric           if (valobj.GetCompilerType().IsBlockPointerType()) {
16220b57cec5SDimitry Andric             return formatter_sp;
16230b57cec5SDimitry Andric           }
16240b57cec5SDimitry Andric           return nullptr;
16250b57cec5SDimitry Andric         });
16260b57cec5SDimitry Andric   });
16270b57cec5SDimitry Andric 
16280b57cec5SDimitry Andric   return g_formatters;
16290b57cec5SDimitry Andric }
16300b57cec5SDimitry Andric 
16310b57cec5SDimitry Andric HardcodedFormatters::HardcodedSyntheticFinder
16320b57cec5SDimitry Andric CPlusPlusLanguage::GetHardcodedSynthetics() {
16330b57cec5SDimitry Andric   static llvm::once_flag g_initialize;
16340b57cec5SDimitry Andric   static ConstString g_vectortypes("VectorTypes");
16350b57cec5SDimitry Andric   static HardcodedFormatters::HardcodedSyntheticFinder g_formatters;
16360b57cec5SDimitry Andric 
16370b57cec5SDimitry Andric   llvm::call_once(g_initialize, []() -> void {
16380b57cec5SDimitry Andric     g_formatters.push_back([](lldb_private::ValueObject &valobj,
1639349cc55cSDimitry Andric                               lldb::DynamicValueType, FormatManager &fmt_mgr)
1640349cc55cSDimitry Andric                                -> SyntheticChildren::SharedPointer {
16410b57cec5SDimitry Andric       static CXXSyntheticChildren::SharedPointer formatter_sp(
16420b57cec5SDimitry Andric           new CXXSyntheticChildren(
16430b57cec5SDimitry Andric               SyntheticChildren::Flags()
16440b57cec5SDimitry Andric                   .SetCascades(true)
16450b57cec5SDimitry Andric                   .SetSkipPointers(true)
16460b57cec5SDimitry Andric                   .SetSkipReferences(true)
16470b57cec5SDimitry Andric                   .SetNonCacheable(true),
16480b57cec5SDimitry Andric               "vector_type synthetic children",
16490b57cec5SDimitry Andric               lldb_private::formatters::VectorTypeSyntheticFrontEndCreator));
1650fe6060f1SDimitry Andric       if (valobj.GetCompilerType().IsVectorType()) {
16510b57cec5SDimitry Andric         if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
16520b57cec5SDimitry Andric           return formatter_sp;
16530b57cec5SDimitry Andric       }
16540b57cec5SDimitry Andric       return nullptr;
16550b57cec5SDimitry Andric     });
16560b57cec5SDimitry Andric     g_formatters.push_back([](lldb_private::ValueObject &valobj,
1657349cc55cSDimitry Andric                               lldb::DynamicValueType, FormatManager &fmt_mgr)
1658349cc55cSDimitry Andric                                -> SyntheticChildren::SharedPointer {
16590b57cec5SDimitry Andric       static CXXSyntheticChildren::SharedPointer formatter_sp(
16600b57cec5SDimitry Andric           new CXXSyntheticChildren(
16610b57cec5SDimitry Andric               SyntheticChildren::Flags()
16620b57cec5SDimitry Andric                   .SetCascades(true)
16630b57cec5SDimitry Andric                   .SetSkipPointers(true)
16640b57cec5SDimitry Andric                   .SetSkipReferences(true)
16650b57cec5SDimitry Andric                   .SetNonCacheable(true),
16660b57cec5SDimitry Andric               "block pointer synthetic children",
16670b57cec5SDimitry Andric               lldb_private::formatters::BlockPointerSyntheticFrontEndCreator));
1668fe6060f1SDimitry Andric       if (valobj.GetCompilerType().IsBlockPointerType()) {
16690b57cec5SDimitry Andric         return formatter_sp;
16700b57cec5SDimitry Andric       }
16710b57cec5SDimitry Andric       return nullptr;
16720b57cec5SDimitry Andric     });
16730b57cec5SDimitry Andric   });
16740b57cec5SDimitry Andric 
16750b57cec5SDimitry Andric   return g_formatters;
16760b57cec5SDimitry Andric }
16770b57cec5SDimitry Andric 
1678e8d8bef9SDimitry Andric bool CPlusPlusLanguage::IsNilReference(ValueObject &valobj) {
1679e8d8bef9SDimitry Andric   if (!Language::LanguageIsCPlusPlus(valobj.GetObjectRuntimeLanguage()) ||
1680e8d8bef9SDimitry Andric       !valobj.IsPointerType())
1681e8d8bef9SDimitry Andric     return false;
1682e8d8bef9SDimitry Andric   bool canReadValue = true;
1683e8d8bef9SDimitry Andric   bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;
1684e8d8bef9SDimitry Andric   return canReadValue && isZero;
1685e8d8bef9SDimitry Andric }
1686e8d8bef9SDimitry Andric 
16870b57cec5SDimitry Andric bool CPlusPlusLanguage::IsSourceFile(llvm::StringRef file_path) const {
16880b57cec5SDimitry Andric   const auto suffixes = {".cpp", ".cxx", ".c++", ".cc",  ".c",
16890b57cec5SDimitry Andric                          ".h",   ".hh",  ".hpp", ".hxx", ".h++"};
16900b57cec5SDimitry Andric   for (auto suffix : suffixes) {
169106c3fb27SDimitry Andric     if (file_path.ends_with_insensitive(suffix))
16920b57cec5SDimitry Andric       return true;
16930b57cec5SDimitry Andric   }
16940b57cec5SDimitry Andric 
16950b57cec5SDimitry Andric   // Check if we're in a STL path (where the files usually have no extension
16960b57cec5SDimitry Andric   // that we could check for.
16970b57cec5SDimitry Andric   return file_path.contains("/usr/include/c++/");
16980b57cec5SDimitry Andric }
1699bdd1243dSDimitry Andric 
1700bdd1243dSDimitry Andric bool CPlusPlusLanguage::GetFunctionDisplayName(
1701bdd1243dSDimitry Andric     const SymbolContext *sc, const ExecutionContext *exe_ctx,
1702bdd1243dSDimitry Andric     FunctionNameRepresentation representation, Stream &s) {
1703bdd1243dSDimitry Andric   switch (representation) {
1704bdd1243dSDimitry Andric   case FunctionNameRepresentation::eNameWithArgs: {
1705bdd1243dSDimitry Andric     // Print the function name with arguments in it
1706bdd1243dSDimitry Andric     if (sc->function) {
1707bdd1243dSDimitry Andric       ExecutionContextScope *exe_scope =
1708bdd1243dSDimitry Andric           exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
1709bdd1243dSDimitry Andric       const char *cstr = sc->function->GetName().AsCString(nullptr);
1710bdd1243dSDimitry Andric       if (cstr) {
1711bdd1243dSDimitry Andric         const InlineFunctionInfo *inline_info = nullptr;
1712bdd1243dSDimitry Andric         VariableListSP variable_list_sp;
1713bdd1243dSDimitry Andric         bool get_function_vars = true;
1714bdd1243dSDimitry Andric         if (sc->block) {
1715bdd1243dSDimitry Andric           Block *inline_block = sc->block->GetContainingInlinedBlock();
1716bdd1243dSDimitry Andric 
1717bdd1243dSDimitry Andric           if (inline_block) {
1718bdd1243dSDimitry Andric             get_function_vars = false;
17197a6dacacSDimitry Andric             inline_info = inline_block->GetInlinedFunctionInfo();
1720bdd1243dSDimitry Andric             if (inline_info)
1721bdd1243dSDimitry Andric               variable_list_sp = inline_block->GetBlockVariableList(true);
1722bdd1243dSDimitry Andric           }
1723bdd1243dSDimitry Andric         }
1724bdd1243dSDimitry Andric 
1725bdd1243dSDimitry Andric         if (get_function_vars) {
1726bdd1243dSDimitry Andric           variable_list_sp =
1727bdd1243dSDimitry Andric               sc->function->GetBlock(true).GetBlockVariableList(true);
1728bdd1243dSDimitry Andric         }
1729bdd1243dSDimitry Andric 
1730bdd1243dSDimitry Andric         if (inline_info) {
1731bdd1243dSDimitry Andric           s.PutCString(cstr);
1732bdd1243dSDimitry Andric           s.PutCString(" [inlined] ");
1733bdd1243dSDimitry Andric           cstr = inline_info->GetName().GetCString();
1734bdd1243dSDimitry Andric         }
1735bdd1243dSDimitry Andric 
1736bdd1243dSDimitry Andric         VariableList args;
1737bdd1243dSDimitry Andric         if (variable_list_sp)
1738bdd1243dSDimitry Andric           variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument,
1739bdd1243dSDimitry Andric                                                      args);
1740bdd1243dSDimitry Andric         if (args.GetSize() > 0) {
1741bdd1243dSDimitry Andric           if (!PrettyPrintFunctionNameWithArgs(s, cstr, exe_scope, args))
1742bdd1243dSDimitry Andric             return false;
1743bdd1243dSDimitry Andric         } else {
1744bdd1243dSDimitry Andric           s.PutCString(cstr);
1745bdd1243dSDimitry Andric         }
1746bdd1243dSDimitry Andric         return true;
1747bdd1243dSDimitry Andric       }
1748bdd1243dSDimitry Andric     } else if (sc->symbol) {
1749bdd1243dSDimitry Andric       const char *cstr = sc->symbol->GetName().AsCString(nullptr);
1750bdd1243dSDimitry Andric       if (cstr) {
1751bdd1243dSDimitry Andric         s.PutCString(cstr);
1752bdd1243dSDimitry Andric         return true;
1753bdd1243dSDimitry Andric       }
1754bdd1243dSDimitry Andric     }
1755bdd1243dSDimitry Andric   } break;
1756bdd1243dSDimitry Andric   default:
1757bdd1243dSDimitry Andric     return false;
1758bdd1243dSDimitry Andric   }
1759bdd1243dSDimitry Andric 
1760bdd1243dSDimitry Andric   return false;
1761bdd1243dSDimitry Andric }
1762