180814287SRaphael Isemann //===-- CPlusPlusLanguage.cpp ---------------------------------------------===//
25f9d3106SEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f9d3106SEnrico Granata //
75f9d3106SEnrico Granata //===----------------------------------------------------------------------===//
85f9d3106SEnrico Granata 
95f9d3106SEnrico Granata #include "CPlusPlusLanguage.h"
105f9d3106SEnrico Granata 
11bbd16815SEugene Zelenko #include <cctype>
12b9c1b51eSKate Stone #include <cstring>
13f5bb1d6cSLuke Drummond 
14bbd16815SEugene Zelenko #include <functional>
15f5bb1d6cSLuke Drummond #include <memory>
16bbd16815SEugene Zelenko #include <mutex>
17f5bb1d6cSLuke Drummond #include <set>
18aa816b8fSJim Ingham 
19aa816b8fSJim Ingham #include "llvm/ADT/StringRef.h"
20e0d2733bSPavel Labath #include "llvm/Demangle/ItaniumDemangle.h"
21aa816b8fSJim Ingham 
2283393d27Sshafik #include "lldb/Core/Mangled.h"
23385b2189SAlex Langford #include "lldb/Core/Module.h"
245f9d3106SEnrico Granata #include "lldb/Core/PluginManager.h"
25aa816b8fSJim Ingham #include "lldb/Core/UniqueCStringMap.h"
267cb59e1aSEnrico Granata #include "lldb/DataFormatters/CXXFunctionPointer.h"
2733e97e63SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
2833e97e63SEnrico Granata #include "lldb/DataFormatters/FormattersHelpers.h"
297cb59e1aSEnrico Granata #include "lldb/DataFormatters/VectorType.h"
30385b2189SAlex Langford #include "lldb/Symbol/SymbolFile.h"
31bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
326f9e6901SZachary Turner #include "lldb/Utility/Log.h"
33bf9a7730SZachary Turner #include "lldb/Utility/RegularExpression.h"
3433e97e63SEnrico Granata 
35c530ba98SSean Callanan #include "BlockPointer.h"
36a633ee6eSEugene Zemtsov #include "CPlusPlusNameParser.h"
3733e97e63SEnrico Granata #include "CxxStringTypes.h"
3833e97e63SEnrico Granata #include "LibCxx.h"
3975995b5eSEnrico Granata #include "LibCxxAtomic.h"
408306f76eSShafik Yaghmour #include "LibCxxVariant.h"
4133e97e63SEnrico Granata #include "LibStdcpp.h"
42c1e530eeSAleksandr Urakov #include "MSVCUndecoratedNameParser.h"
4333e97e63SEnrico Granata 
445f9d3106SEnrico Granata using namespace lldb;
455f9d3106SEnrico Granata using namespace lldb_private;
4633e97e63SEnrico Granata using namespace lldb_private::formatters;
475f9d3106SEnrico Granata 
48bba9ba8dSJonas Devlieghere LLDB_PLUGIN_DEFINE(CPlusPlusLanguage)
49fbb4d1e4SJonas Devlieghere 
50b9c1b51eSKate Stone void CPlusPlusLanguage::Initialize() {
51b9c1b51eSKate Stone   PluginManager::RegisterPlugin(GetPluginNameStatic(), "C++ Language",
525f9d3106SEnrico Granata                                 CreateInstance);
535f9d3106SEnrico Granata }
545f9d3106SEnrico Granata 
55b9c1b51eSKate Stone void CPlusPlusLanguage::Terminate() {
565f9d3106SEnrico Granata   PluginManager::UnregisterPlugin(CreateInstance);
575f9d3106SEnrico Granata }
585f9d3106SEnrico Granata 
59ecfca427SRaphael Isemann bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
60ecfca427SRaphael Isemann   const char *mangled_name = mangled.GetMangledName().GetCString();
61ecfca427SRaphael Isemann   return mangled_name && CPlusPlusLanguage::IsCPPMangledName(mangled_name);
62ecfca427SRaphael Isemann }
63ecfca427SRaphael Isemann 
64993220a9SAlex Langford ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments(
65993220a9SAlex Langford     Mangled mangled) const {
66993220a9SAlex Langford   const char *mangled_name_cstr = mangled.GetMangledName().GetCString();
67993220a9SAlex Langford   ConstString demangled_name = mangled.GetDemangledName();
68993220a9SAlex Langford   if (demangled_name && mangled_name_cstr && mangled_name_cstr[0]) {
69993220a9SAlex Langford     if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' &&
70993220a9SAlex Langford         (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure,
71993220a9SAlex Langford                                         // typeinfo structure, and typeinfo
72993220a9SAlex Langford                                         // mangled_name
73993220a9SAlex Langford          mangled_name_cstr[2] != 'G' && // avoid guard variables
74993220a9SAlex Langford          mangled_name_cstr[2] != 'Z'))  // named local entities (if we
75993220a9SAlex Langford                                         // eventually handle eSymbolTypeData,
76993220a9SAlex Langford                                         // we will want this back)
77993220a9SAlex Langford     {
78993220a9SAlex Langford       CPlusPlusLanguage::MethodName cxx_method(demangled_name);
79993220a9SAlex Langford       if (!cxx_method.GetBasename().empty()) {
80993220a9SAlex Langford         std::string shortname;
81993220a9SAlex Langford         if (!cxx_method.GetContext().empty())
82993220a9SAlex Langford           shortname = cxx_method.GetContext().str() + "::";
83993220a9SAlex Langford         shortname += cxx_method.GetBasename().str();
84993220a9SAlex Langford         return ConstString(shortname);
85993220a9SAlex Langford       }
86993220a9SAlex Langford     }
87993220a9SAlex Langford   }
88993220a9SAlex Langford   if (demangled_name)
89993220a9SAlex Langford     return demangled_name;
90993220a9SAlex Langford   return mangled.GetMangledName();
91993220a9SAlex Langford }
92993220a9SAlex Langford 
935f9d3106SEnrico Granata // Static Functions
94bbd16815SEugene Zelenko 
95b9c1b51eSKate Stone Language *CPlusPlusLanguage::CreateInstance(lldb::LanguageType language) {
968340fbb9SRaphael Isemann   // Use plugin for C++ but not for Objective-C++ (which has its own plugin).
978340fbb9SRaphael Isemann   if (Language::LanguageIsCPlusPlus(language) &&
988340fbb9SRaphael Isemann       language != eLanguageTypeObjC_plus_plus)
995f9d3106SEnrico Granata     return new CPlusPlusLanguage();
1005f9d3106SEnrico Granata   return nullptr;
1015f9d3106SEnrico Granata }
102aa816b8fSJim Ingham 
103b9c1b51eSKate Stone void CPlusPlusLanguage::MethodName::Clear() {
104aa816b8fSJim Ingham   m_full.Clear();
105aa816b8fSJim Ingham   m_basename = llvm::StringRef();
106aa816b8fSJim Ingham   m_context = llvm::StringRef();
107aa816b8fSJim Ingham   m_arguments = llvm::StringRef();
108aa816b8fSJim Ingham   m_qualifiers = llvm::StringRef();
109aa816b8fSJim Ingham   m_parsed = false;
110aa816b8fSJim Ingham   m_parse_error = false;
111aa816b8fSJim Ingham }
112aa816b8fSJim Ingham 
113a633ee6eSEugene Zemtsov static bool ReverseFindMatchingChars(const llvm::StringRef &s,
114aa816b8fSJim Ingham                                      const llvm::StringRef &left_right_chars,
115b9c1b51eSKate Stone                                      size_t &left_pos, size_t &right_pos,
116b9c1b51eSKate Stone                                      size_t pos = llvm::StringRef::npos) {
117aa816b8fSJim Ingham   assert(left_right_chars.size() == 2);
118aa816b8fSJim Ingham   left_pos = llvm::StringRef::npos;
119aa816b8fSJim Ingham   const char left_char = left_right_chars[0];
120aa816b8fSJim Ingham   const char right_char = left_right_chars[1];
121aa816b8fSJim Ingham   pos = s.find_last_of(left_right_chars, pos);
122aa816b8fSJim Ingham   if (pos == llvm::StringRef::npos || s[pos] == left_char)
123aa816b8fSJim Ingham     return false;
124aa816b8fSJim Ingham   right_pos = pos;
125aa816b8fSJim Ingham   uint32_t depth = 1;
126b9c1b51eSKate Stone   while (pos > 0 && depth > 0) {
127aa816b8fSJim Ingham     pos = s.find_last_of(left_right_chars, pos);
128aa816b8fSJim Ingham     if (pos == llvm::StringRef::npos)
129aa816b8fSJim Ingham       return false;
130b9c1b51eSKate Stone     if (s[pos] == left_char) {
131b9c1b51eSKate Stone       if (--depth == 0) {
132aa816b8fSJim Ingham         left_pos = pos;
133aa816b8fSJim Ingham         return left_pos < right_pos;
134aa816b8fSJim Ingham       }
135b9c1b51eSKate Stone     } else if (s[pos] == right_char) {
136aa816b8fSJim Ingham       ++depth;
137aa816b8fSJim Ingham     }
138aa816b8fSJim Ingham   }
139aa816b8fSJim Ingham   return false;
140aa816b8fSJim Ingham }
141aa816b8fSJim Ingham 
142a633ee6eSEugene Zemtsov static bool IsTrivialBasename(const llvm::StringRef &basename) {
143a633ee6eSEugene Zemtsov   // Check that the basename matches with the following regular expression
14405097246SAdrian Prantl   // "^~?([A-Za-z_][A-Za-z_0-9]*)$" We are using a hand written implementation
14505097246SAdrian Prantl   // because it is significantly more efficient then using the general purpose
14605097246SAdrian Prantl   // regular expression library.
1479fa11470STamas Berghammer   size_t idx = 0;
1489fa11470STamas Berghammer   if (basename.size() > 0 && basename[0] == '~')
1499fa11470STamas Berghammer     idx = 1;
1509fa11470STamas Berghammer 
1519fa11470STamas Berghammer   if (basename.size() <= idx)
1529fa11470STamas Berghammer     return false; // Empty string or "~"
1539fa11470STamas Berghammer 
1549fa11470STamas Berghammer   if (!std::isalpha(basename[idx]) && basename[idx] != '_')
155e9264b74SKazuaki Ishizaki     return false; // First character (after removing the possible '~'') isn't in
156b9c1b51eSKate Stone                   // [A-Za-z_]
1579fa11470STamas Berghammer 
1589fa11470STamas Berghammer   // Read all characters matching [A-Za-z_0-9]
1599fa11470STamas Berghammer   ++idx;
160b9c1b51eSKate Stone   while (idx < basename.size()) {
1619fa11470STamas Berghammer     if (!std::isalnum(basename[idx]) && basename[idx] != '_')
1629fa11470STamas Berghammer       break;
1639fa11470STamas Berghammer     ++idx;
1649fa11470STamas Berghammer   }
1659fa11470STamas Berghammer 
1669fa11470STamas Berghammer   // We processed all characters. It is a vaild basename.
167a6682a41SJonas Devlieghere   return idx == basename.size();
1689fa11470STamas Berghammer }
169aa816b8fSJim Ingham 
170a633ee6eSEugene Zemtsov bool CPlusPlusLanguage::MethodName::TrySimplifiedParse() {
17105097246SAdrian Prantl   // This method tries to parse simple method definitions which are presumably
17205097246SAdrian Prantl   // most comman in user programs. Definitions that can be parsed by this
17305097246SAdrian Prantl   // function don't have return types and templates in the name.
174a633ee6eSEugene Zemtsov   // A::B::C::fun(std::vector<T> &) const
1759645a629SJim Ingham   size_t arg_start, arg_end;
176a633ee6eSEugene Zemtsov   llvm::StringRef full(m_full.GetCString());
177aa816b8fSJim Ingham   llvm::StringRef parens("()", 2);
178b9c1b51eSKate Stone   if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) {
179aa816b8fSJim Ingham     m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
180aa816b8fSJim Ingham     if (arg_end + 1 < full.size())
181a633ee6eSEugene Zemtsov       m_qualifiers = full.substr(arg_end + 1).ltrim();
182a633ee6eSEugene Zemtsov 
183a633ee6eSEugene Zemtsov     if (arg_start == 0)
184a633ee6eSEugene Zemtsov       return false;
185aa816b8fSJim Ingham     size_t basename_end = arg_start;
186aa816b8fSJim Ingham     size_t context_start = 0;
187a633ee6eSEugene Zemtsov     size_t context_end = full.rfind(':', basename_end);
188aa816b8fSJim Ingham     if (context_end == llvm::StringRef::npos)
189aa816b8fSJim Ingham       m_basename = full.substr(0, basename_end);
190b9c1b51eSKate Stone     else {
191aa816b8fSJim Ingham       if (context_start < context_end)
192a633ee6eSEugene Zemtsov         m_context = full.substr(context_start, context_end - 1 - context_start);
193aa816b8fSJim Ingham       const size_t basename_begin = context_end + 1;
194a633ee6eSEugene Zemtsov       m_basename = full.substr(basename_begin, basename_end - basename_begin);
195aa816b8fSJim Ingham     }
196aa816b8fSJim Ingham 
197a633ee6eSEugene Zemtsov     if (IsTrivialBasename(m_basename)) {
198a633ee6eSEugene Zemtsov       return true;
199a633ee6eSEugene Zemtsov     } else {
200aa816b8fSJim Ingham       // The C++ basename doesn't match our regular expressions so this can't
201aa816b8fSJim Ingham       // be a valid C++ method, clear everything out and indicate an error
202aa816b8fSJim Ingham       m_context = llvm::StringRef();
203aa816b8fSJim Ingham       m_basename = llvm::StringRef();
204aa816b8fSJim Ingham       m_arguments = llvm::StringRef();
205aa816b8fSJim Ingham       m_qualifiers = llvm::StringRef();
206a633ee6eSEugene Zemtsov       return false;
207aa816b8fSJim Ingham     }
208a633ee6eSEugene Zemtsov   }
209a633ee6eSEugene Zemtsov   return false;
210a633ee6eSEugene Zemtsov }
211a633ee6eSEugene Zemtsov 
212a633ee6eSEugene Zemtsov void CPlusPlusLanguage::MethodName::Parse() {
213a633ee6eSEugene Zemtsov   if (!m_parsed && m_full) {
214a633ee6eSEugene Zemtsov     if (TrySimplifiedParse()) {
215a633ee6eSEugene Zemtsov       m_parse_error = false;
216a633ee6eSEugene Zemtsov     } else {
217a633ee6eSEugene Zemtsov       CPlusPlusNameParser parser(m_full.GetStringRef());
218a633ee6eSEugene Zemtsov       if (auto function = parser.ParseAsFunctionDefinition()) {
219a633ee6eSEugene Zemtsov         m_basename = function.getValue().name.basename;
220a633ee6eSEugene Zemtsov         m_context = function.getValue().name.context;
221a633ee6eSEugene Zemtsov         m_arguments = function.getValue().arguments;
222a633ee6eSEugene Zemtsov         m_qualifiers = function.getValue().qualifiers;
223a633ee6eSEugene Zemtsov         m_parse_error = false;
224b9c1b51eSKate Stone       } else {
225aa816b8fSJim Ingham         m_parse_error = true;
226aa816b8fSJim Ingham       }
227aa816b8fSJim Ingham     }
228a633ee6eSEugene Zemtsov     m_parsed = true;
229a633ee6eSEugene Zemtsov   }
230aa816b8fSJim Ingham }
231aa816b8fSJim Ingham 
232b9c1b51eSKate Stone llvm::StringRef CPlusPlusLanguage::MethodName::GetBasename() {
233aa816b8fSJim Ingham   if (!m_parsed)
234aa816b8fSJim Ingham     Parse();
235aa816b8fSJim Ingham   return m_basename;
236aa816b8fSJim Ingham }
237aa816b8fSJim Ingham 
238b9c1b51eSKate Stone llvm::StringRef CPlusPlusLanguage::MethodName::GetContext() {
239aa816b8fSJim Ingham   if (!m_parsed)
240aa816b8fSJim Ingham     Parse();
241aa816b8fSJim Ingham   return m_context;
242aa816b8fSJim Ingham }
243aa816b8fSJim Ingham 
244b9c1b51eSKate Stone llvm::StringRef CPlusPlusLanguage::MethodName::GetArguments() {
245aa816b8fSJim Ingham   if (!m_parsed)
246aa816b8fSJim Ingham     Parse();
247aa816b8fSJim Ingham   return m_arguments;
248aa816b8fSJim Ingham }
249aa816b8fSJim Ingham 
250b9c1b51eSKate Stone llvm::StringRef CPlusPlusLanguage::MethodName::GetQualifiers() {
251aa816b8fSJim Ingham   if (!m_parsed)
252aa816b8fSJim Ingham     Parse();
253aa816b8fSJim Ingham   return m_qualifiers;
254aa816b8fSJim Ingham }
255aa816b8fSJim Ingham 
256b9c1b51eSKate Stone std::string CPlusPlusLanguage::MethodName::GetScopeQualifiedName() {
2579293fc41SSiva Chandra   if (!m_parsed)
2589293fc41SSiva Chandra     Parse();
259a633ee6eSEugene Zemtsov   if (m_context.empty())
260adcd0268SBenjamin Kramer     return std::string(m_basename);
2619293fc41SSiva Chandra 
2629293fc41SSiva Chandra   std::string res;
2639293fc41SSiva Chandra   res += m_context;
2649293fc41SSiva Chandra   res += "::";
2659293fc41SSiva Chandra   res += m_basename;
2669293fc41SSiva Chandra   return res;
2679293fc41SSiva Chandra }
2689293fc41SSiva Chandra 
26983393d27Sshafik bool CPlusPlusLanguage::IsCPPMangledName(llvm::StringRef name) {
27005097246SAdrian Prantl   // FIXME!! we should really run through all the known C++ Language plugins
27105097246SAdrian Prantl   // and ask each one if this is a C++ mangled name
272aa816b8fSJim Ingham 
27383393d27Sshafik   Mangled::ManglingScheme scheme = Mangled::GetManglingScheme(name);
27483393d27Sshafik 
27583393d27Sshafik   if (scheme == Mangled::eManglingSchemeNone)
276b38799c1SAaron Smith     return false;
277b38799c1SAaron Smith 
278b38799c1SAaron Smith   return true;
279aa816b8fSJim Ingham }
280aa816b8fSJim Ingham 
281b9c1b51eSKate Stone bool CPlusPlusLanguage::ExtractContextAndIdentifier(
282b9c1b51eSKate Stone     const char *name, llvm::StringRef &context, llvm::StringRef &identifier) {
283c1e530eeSAleksandr Urakov   if (MSVCUndecoratedNameParser::IsMSVCUndecoratedName(name))
284c1e530eeSAleksandr Urakov     return MSVCUndecoratedNameParser::ExtractContextAndIdentifier(name, context,
285c1e530eeSAleksandr Urakov                                                                   identifier);
286c1e530eeSAleksandr Urakov 
287a633ee6eSEugene Zemtsov   CPlusPlusNameParser parser(name);
288a633ee6eSEugene Zemtsov   if (auto full_name = parser.ParseAsFullName()) {
289a633ee6eSEugene Zemtsov     identifier = full_name.getValue().basename;
290a633ee6eSEugene Zemtsov     context = full_name.getValue().context;
291aa816b8fSJim Ingham     return true;
292aa816b8fSJim Ingham   }
293aa816b8fSJim Ingham   return false;
294aa816b8fSJim Ingham }
295aa816b8fSJim Ingham 
296e0d2733bSPavel Labath namespace {
297e0d2733bSPavel Labath class NodeAllocator {
298e0d2733bSPavel Labath   llvm::BumpPtrAllocator Alloc;
299f5bb1d6cSLuke Drummond 
3005e6bd2f8SStefan Granitz public:
301e0d2733bSPavel Labath   void reset() { Alloc.Reset(); }
302f5bb1d6cSLuke Drummond 
303e0d2733bSPavel Labath   template <typename T, typename... Args> T *makeNode(Args &&... args) {
304e0d2733bSPavel Labath     return new (Alloc.Allocate(sizeof(T), alignof(T)))
305e0d2733bSPavel Labath         T(std::forward<Args>(args)...);
3065e6bd2f8SStefan Granitz   }
307f5bb1d6cSLuke Drummond 
308e0d2733bSPavel Labath   void *allocateNodeArray(size_t sz) {
309e0d2733bSPavel Labath     return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz,
310e0d2733bSPavel Labath                           alignof(llvm::itanium_demangle::Node *));
311f5bb1d6cSLuke Drummond   }
312f5bb1d6cSLuke Drummond };
313f5bb1d6cSLuke Drummond 
314c16f0b18SPavel Labath template <typename Derived>
315c16f0b18SPavel Labath class ManglingSubstitutor
316c16f0b18SPavel Labath     : public llvm::itanium_demangle::AbstractManglingParser<Derived,
317e0d2733bSPavel Labath                                                             NodeAllocator> {
318c16f0b18SPavel Labath   using Base =
319c16f0b18SPavel Labath       llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
320f5bb1d6cSLuke Drummond 
321c16f0b18SPavel Labath public:
322c16f0b18SPavel Labath   ManglingSubstitutor() : Base(nullptr, nullptr) {}
323e0d2733bSPavel Labath 
324c16f0b18SPavel Labath   template <typename... Ts>
325c16f0b18SPavel Labath   ConstString substitute(llvm::StringRef Mangled, Ts &&... Vals) {
326c16f0b18SPavel Labath     this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
327c16f0b18SPavel Labath     return substituteImpl(Mangled);
328c16f0b18SPavel Labath   }
329e0d2733bSPavel Labath 
330c16f0b18SPavel Labath protected:
331c16f0b18SPavel Labath   void reset(llvm::StringRef Mangled) {
332c16f0b18SPavel Labath     Base::reset(Mangled.begin(), Mangled.end());
333e0d2733bSPavel Labath     Written = Mangled.begin();
334e0d2733bSPavel Labath     Result.clear();
335e0d2733bSPavel Labath     Substituted = false;
3365e6bd2f8SStefan Granitz   }
337f5bb1d6cSLuke Drummond 
338c16f0b18SPavel Labath   ConstString substituteImpl(llvm::StringRef Mangled) {
339e0d2733bSPavel Labath     Log *log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE);
340c16f0b18SPavel Labath     if (this->parse() == nullptr) {
341e0d2733bSPavel Labath       LLDB_LOG(log, "Failed to substitute mangling in {0}", Mangled);
342e0d2733bSPavel Labath       return ConstString();
343e0d2733bSPavel Labath     }
344e0d2733bSPavel Labath     if (!Substituted)
345e0d2733bSPavel Labath       return ConstString();
346e0d2733bSPavel Labath 
347e0d2733bSPavel Labath     // Append any trailing unmodified input.
348e0d2733bSPavel Labath     appendUnchangedInput();
349e0d2733bSPavel Labath     LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);
350e0d2733bSPavel Labath     return ConstString(Result);
351e0d2733bSPavel Labath   }
352e0d2733bSPavel Labath 
353c16f0b18SPavel Labath   void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
354c16f0b18SPavel Labath     if (!llvm::StringRef(currentParserPos(), this->numLeft()).startswith(From))
355c16f0b18SPavel Labath       return;
356c16f0b18SPavel Labath 
357e0d2733bSPavel Labath     // We found a match. Append unmodified input up to this point.
358e0d2733bSPavel Labath     appendUnchangedInput();
359e0d2733bSPavel Labath 
360e0d2733bSPavel Labath     // And then perform the replacement.
361c16f0b18SPavel Labath     Result += To;
362c16f0b18SPavel Labath     Written += From.size();
363e0d2733bSPavel Labath     Substituted = true;
364e0d2733bSPavel Labath   }
365c16f0b18SPavel Labath 
366c16f0b18SPavel Labath private:
367c16f0b18SPavel Labath   /// Input character until which we have constructed the respective output
368c16f0b18SPavel Labath   /// already.
369c16f0b18SPavel Labath   const char *Written;
370c16f0b18SPavel Labath 
371c16f0b18SPavel Labath   llvm::SmallString<128> Result;
372c16f0b18SPavel Labath 
373c16f0b18SPavel Labath   /// Whether we have performed any substitutions.
374c16f0b18SPavel Labath   bool Substituted;
375c16f0b18SPavel Labath 
376c16f0b18SPavel Labath   const char *currentParserPos() const { return this->First; }
377c16f0b18SPavel Labath 
378c16f0b18SPavel Labath   void appendUnchangedInput() {
379c16f0b18SPavel Labath     Result +=
380c16f0b18SPavel Labath         llvm::StringRef(Written, std::distance(Written, currentParserPos()));
381c16f0b18SPavel Labath     Written = currentParserPos();
382c16f0b18SPavel Labath   }
383c16f0b18SPavel Labath };
384c16f0b18SPavel Labath 
385c16f0b18SPavel Labath /// Given a mangled function `Mangled`, replace all the primitive function type
386c16f0b18SPavel Labath /// arguments of `Search` with type `Replace`.
387c16f0b18SPavel Labath class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> {
388c16f0b18SPavel Labath   llvm::StringRef Search;
389c16f0b18SPavel Labath   llvm::StringRef Replace;
390c16f0b18SPavel Labath 
391c16f0b18SPavel Labath public:
392c16f0b18SPavel Labath   void reset(llvm::StringRef Mangled, llvm::StringRef Search,
393c16f0b18SPavel Labath              llvm::StringRef Replace) {
394c16f0b18SPavel Labath     ManglingSubstitutor::reset(Mangled);
395c16f0b18SPavel Labath     this->Search = Search;
396c16f0b18SPavel Labath     this->Replace = Replace;
397c16f0b18SPavel Labath   }
398c16f0b18SPavel Labath 
399c16f0b18SPavel Labath   llvm::itanium_demangle::Node *parseType() {
400c16f0b18SPavel Labath     trySubstitute(Search, Replace);
401c16f0b18SPavel Labath     return ManglingSubstitutor::parseType();
402e0d2733bSPavel Labath   }
403e0d2733bSPavel Labath };
404c16f0b18SPavel Labath 
405c16f0b18SPavel Labath class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> {
406c16f0b18SPavel Labath public:
407c16f0b18SPavel Labath   llvm::itanium_demangle::Node *
408c16f0b18SPavel Labath   parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) {
409c16f0b18SPavel Labath     trySubstitute("C1", "C2");
410c16f0b18SPavel Labath     trySubstitute("D1", "D2");
411c16f0b18SPavel Labath     return ManglingSubstitutor::parseCtorDtorName(SoFar, State);
412f5bb1d6cSLuke Drummond   }
413c16f0b18SPavel Labath };
414c16f0b18SPavel Labath } // namespace
415f5bb1d6cSLuke Drummond 
416a65f6aafSAlex Langford std::vector<ConstString> CPlusPlusLanguage::GenerateAlternateFunctionManglings(
417a65f6aafSAlex Langford     const ConstString mangled_name) const {
418a65f6aafSAlex Langford   std::vector<ConstString> alternates;
419a65f6aafSAlex Langford 
420f5bb1d6cSLuke Drummond   /// Get a basic set of alternative manglings for the given symbol `name`, by
421f5bb1d6cSLuke Drummond   /// making a few basic possible substitutions on basic types, storage duration
422f5bb1d6cSLuke Drummond   /// and `const`ness for the given symbol. The output parameter `alternates`
423f5bb1d6cSLuke Drummond   /// is filled with a best-guess, non-exhaustive set of different manglings
424f5bb1d6cSLuke Drummond   /// for the given name.
425f5bb1d6cSLuke Drummond 
426f5bb1d6cSLuke Drummond   // Maybe we're looking for a const symbol but the debug info told us it was
427f5bb1d6cSLuke Drummond   // non-const...
428f5bb1d6cSLuke Drummond   if (!strncmp(mangled_name.GetCString(), "_ZN", 3) &&
429f5bb1d6cSLuke Drummond       strncmp(mangled_name.GetCString(), "_ZNK", 4)) {
430f5bb1d6cSLuke Drummond     std::string fixed_scratch("_ZNK");
431f5bb1d6cSLuke Drummond     fixed_scratch.append(mangled_name.GetCString() + 3);
432a65f6aafSAlex Langford     alternates.push_back(ConstString(fixed_scratch));
433f5bb1d6cSLuke Drummond   }
434f5bb1d6cSLuke Drummond 
435f5bb1d6cSLuke Drummond   // Maybe we're looking for a static symbol but we thought it was global...
436f5bb1d6cSLuke Drummond   if (!strncmp(mangled_name.GetCString(), "_Z", 2) &&
437f5bb1d6cSLuke Drummond       strncmp(mangled_name.GetCString(), "_ZL", 3)) {
438f5bb1d6cSLuke Drummond     std::string fixed_scratch("_ZL");
439f5bb1d6cSLuke Drummond     fixed_scratch.append(mangled_name.GetCString() + 2);
440a65f6aafSAlex Langford     alternates.push_back(ConstString(fixed_scratch));
441f5bb1d6cSLuke Drummond   }
442f5bb1d6cSLuke Drummond 
443e0d2733bSPavel Labath   TypeSubstitutor TS;
444f5bb1d6cSLuke Drummond   // `char` is implementation defined as either `signed` or `unsigned`.  As a
445f5bb1d6cSLuke Drummond   // result a char parameter has 3 possible manglings: 'c'-char, 'a'-signed
446f5bb1d6cSLuke Drummond   // char, 'h'-unsigned char.  If we're looking for symbols with a signed char
447f5bb1d6cSLuke Drummond   // parameter, try finding matches which have the general case 'c'.
448f5bb1d6cSLuke Drummond   if (ConstString char_fixup =
449e0d2733bSPavel Labath           TS.substitute(mangled_name.GetStringRef(), "a", "c"))
450a65f6aafSAlex Langford     alternates.push_back(char_fixup);
451f5bb1d6cSLuke Drummond 
452f5bb1d6cSLuke Drummond   // long long parameter mangling 'x', may actually just be a long 'l' argument
453f5bb1d6cSLuke Drummond   if (ConstString long_fixup =
454e0d2733bSPavel Labath           TS.substitute(mangled_name.GetStringRef(), "x", "l"))
455a65f6aafSAlex Langford     alternates.push_back(long_fixup);
456f5bb1d6cSLuke Drummond 
457f5bb1d6cSLuke Drummond   // unsigned long long parameter mangling 'y', may actually just be unsigned
458f5bb1d6cSLuke Drummond   // long 'm' argument
459f5bb1d6cSLuke Drummond   if (ConstString ulong_fixup =
460e0d2733bSPavel Labath           TS.substitute(mangled_name.GetStringRef(), "y", "m"))
461a65f6aafSAlex Langford     alternates.push_back(ulong_fixup);
462f5bb1d6cSLuke Drummond 
463c16f0b18SPavel Labath   if (ConstString ctor_fixup =
464c16f0b18SPavel Labath           CtorDtorSubstitutor().substitute(mangled_name.GetStringRef()))
465a65f6aafSAlex Langford     alternates.push_back(ctor_fixup);
466c16f0b18SPavel Labath 
467a65f6aafSAlex Langford   return alternates;
468f5bb1d6cSLuke Drummond }
469f5bb1d6cSLuke Drummond 
470385b2189SAlex Langford ConstString CPlusPlusLanguage::FindBestAlternateFunctionMangledName(
471385b2189SAlex Langford     const Mangled mangled, const SymbolContext &sym_ctx) const {
472385b2189SAlex Langford   ConstString demangled = mangled.GetDemangledName();
473385b2189SAlex Langford   if (!demangled)
474385b2189SAlex Langford     return ConstString();
475385b2189SAlex Langford 
476385b2189SAlex Langford   CPlusPlusLanguage::MethodName cpp_name(demangled);
477385b2189SAlex Langford   std::string scope_qualified_name = cpp_name.GetScopeQualifiedName();
478385b2189SAlex Langford 
479385b2189SAlex Langford   if (!scope_qualified_name.size())
480385b2189SAlex Langford     return ConstString();
481385b2189SAlex Langford 
482385b2189SAlex Langford   if (!sym_ctx.module_sp)
483385b2189SAlex Langford     return ConstString();
484385b2189SAlex Langford 
485385b2189SAlex Langford   lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile();
486385b2189SAlex Langford   if (!sym_file)
487385b2189SAlex Langford     return ConstString();
488385b2189SAlex Langford 
489385b2189SAlex Langford   std::vector<ConstString> alternates;
490385b2189SAlex Langford   sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates);
491385b2189SAlex Langford 
492385b2189SAlex Langford   std::vector<ConstString> param_and_qual_matches;
493385b2189SAlex Langford   std::vector<ConstString> param_matches;
494385b2189SAlex Langford   for (size_t i = 0; i < alternates.size(); i++) {
495385b2189SAlex Langford     ConstString alternate_mangled_name = alternates[i];
496385b2189SAlex Langford     Mangled mangled(alternate_mangled_name);
497385b2189SAlex Langford     ConstString demangled = mangled.GetDemangledName();
498385b2189SAlex Langford 
499385b2189SAlex Langford     CPlusPlusLanguage::MethodName alternate_cpp_name(demangled);
500385b2189SAlex Langford     if (!cpp_name.IsValid())
501385b2189SAlex Langford       continue;
502385b2189SAlex Langford 
503385b2189SAlex Langford     if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) {
504385b2189SAlex Langford       if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers())
505385b2189SAlex Langford         param_and_qual_matches.push_back(alternate_mangled_name);
506385b2189SAlex Langford       else
507385b2189SAlex Langford         param_matches.push_back(alternate_mangled_name);
508385b2189SAlex Langford     }
509385b2189SAlex Langford   }
510385b2189SAlex Langford 
511385b2189SAlex Langford   if (param_and_qual_matches.size())
512385b2189SAlex Langford     return param_and_qual_matches[0]; // It is assumed that there will be only
513385b2189SAlex Langford                                       // one!
514385b2189SAlex Langford   else if (param_matches.size())
515385b2189SAlex Langford     return param_matches[0]; // Return one of them as a best match
516385b2189SAlex Langford   else
517385b2189SAlex Langford     return ConstString();
518385b2189SAlex Langford }
519385b2189SAlex Langford 
520b9c1b51eSKate Stone static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
52133e97e63SEnrico Granata   if (!cpp_category_sp)
52233e97e63SEnrico Granata     return;
52333e97e63SEnrico Granata 
52433e97e63SEnrico Granata   TypeSummaryImpl::Flags stl_summary_flags;
52533e97e63SEnrico Granata   stl_summary_flags.SetCascades(true)
52633e97e63SEnrico Granata       .SetSkipPointers(false)
52733e97e63SEnrico Granata       .SetSkipReferences(false)
52833e97e63SEnrico Granata       .SetDontShowChildren(true)
52933e97e63SEnrico Granata       .SetDontShowValue(true)
53033e97e63SEnrico Granata       .SetShowMembersOneLiner(false)
53133e97e63SEnrico Granata       .SetHideItemNames(false);
53233e97e63SEnrico Granata 
5337ba2d3e8SThomas Anderson   AddCXXSummary(cpp_category_sp,
534693fbf5cSShafik Yaghmour                 lldb_private::formatters::LibcxxStringSummaryProviderASCII,
5357ba2d3e8SThomas Anderson                 "std::string summary provider",
5361115d1d0SRaphael Isemann                 ConstString("^std::__[[:alnum:]]+::string$"), stl_summary_flags,
5377ba2d3e8SThomas Anderson                 true);
5387ba2d3e8SThomas Anderson   AddCXXSummary(cpp_category_sp,
5397ba2d3e8SThomas Anderson                 lldb_private::formatters::LibcxxStringSummaryProviderASCII,
5407ba2d3e8SThomas Anderson                 "std::string summary provider",
5411115d1d0SRaphael Isemann                 ConstString("^std::__[[:alnum:]]+::basic_string<char, "
5421115d1d0SRaphael Isemann                             "std::__[[:alnum:]]+::char_traits<char>, "
5431115d1d0SRaphael Isemann                             "std::__[[:alnum:]]+::allocator<char> >$"),
5447ba2d3e8SThomas Anderson                 stl_summary_flags, true);
545506144daSJordan Rupprecht   AddCXXSummary(cpp_category_sp,
546506144daSJordan Rupprecht                 lldb_private::formatters::LibcxxStringSummaryProviderASCII,
547506144daSJordan Rupprecht                 "std::string summary provider",
5481115d1d0SRaphael Isemann                 ConstString("^std::__[[:alnum:]]+::basic_string<unsigned char, "
5491115d1d0SRaphael Isemann                             "std::__[[:alnum:]]+::char_traits<unsigned char>, "
5501115d1d0SRaphael Isemann                             "std::__[[:alnum:]]+::allocator<unsigned char> >$"),
551506144daSJordan Rupprecht                 stl_summary_flags, true);
5527ba2d3e8SThomas Anderson 
5537ba2d3e8SThomas Anderson   AddCXXSummary(cpp_category_sp,
554693fbf5cSShafik Yaghmour                 lldb_private::formatters::LibcxxStringSummaryProviderUTF16,
5557ba2d3e8SThomas Anderson                 "std::u16string summary provider",
55646fb5d5dSRaphael Isemann                 ConstString("^std::__[[:alnum:]]+::basic_string<char16_t, "
5571115d1d0SRaphael Isemann                             "std::__[[:alnum:]]+::char_traits<char16_t>, "
5581115d1d0SRaphael Isemann                             "std::__[[:alnum:]]+::allocator<char16_t> >$"),
5597ba2d3e8SThomas Anderson                 stl_summary_flags, true);
5607ba2d3e8SThomas Anderson 
5617ba2d3e8SThomas Anderson   AddCXXSummary(cpp_category_sp,
562693fbf5cSShafik Yaghmour                 lldb_private::formatters::LibcxxStringSummaryProviderUTF32,
5637ba2d3e8SThomas Anderson                 "std::u32string summary provider",
56446fb5d5dSRaphael Isemann                 ConstString("^std::__[[:alnum:]]+::basic_string<char32_t, "
5651115d1d0SRaphael Isemann                             "std::__[[:alnum:]]+::char_traits<char32_t>, "
5661115d1d0SRaphael Isemann                             "std::__[[:alnum:]]+::allocator<char32_t> >$"),
5677ba2d3e8SThomas Anderson                 stl_summary_flags, true);
56833e97e63SEnrico Granata 
56946fb5d5dSRaphael Isemann   AddCXXSummary(
57046fb5d5dSRaphael Isemann       cpp_category_sp, lldb_private::formatters::LibcxxWStringSummaryProvider,
5717ba2d3e8SThomas Anderson       "std::wstring summary provider",
57246fb5d5dSRaphael Isemann       ConstString("^std::__[[:alnum:]]+::wstring$"), stl_summary_flags, true);
5737ba2d3e8SThomas Anderson   AddCXXSummary(cpp_category_sp,
5747ba2d3e8SThomas Anderson                 lldb_private::formatters::LibcxxWStringSummaryProvider,
5757ba2d3e8SThomas Anderson                 "std::wstring summary provider",
5761115d1d0SRaphael Isemann                 ConstString("^std::__[[:alnum:]]+::basic_string<wchar_t, "
5771115d1d0SRaphael Isemann                             "std::__[[:alnum:]]+::char_traits<wchar_t>, "
5781115d1d0SRaphael Isemann                             "std::__[[:alnum:]]+::allocator<wchar_t> >$"),
5797ba2d3e8SThomas Anderson                 stl_summary_flags, true);
58033e97e63SEnrico Granata 
58133e97e63SEnrico Granata   SyntheticChildren::Flags stl_synth_flags;
582b9c1b51eSKate Stone   stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
583b9c1b51eSKate Stone       false);
584393fe62eSJim Ingham   SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
585393fe62eSJim Ingham   stl_deref_flags.SetFrontEndWantsDereference();
58633e97e63SEnrico Granata 
587b9c1b51eSKate Stone   AddCXXSynthetic(
588b9c1b51eSKate Stone       cpp_category_sp,
5895269875eSPavel Labath       lldb_private::formatters::LibcxxBitsetSyntheticFrontEndCreator,
5905269875eSPavel Labath       "libc++ std::bitset synthetic children",
5917ba2d3e8SThomas Anderson       ConstString("^std::__[[:alnum:]]+::bitset<.+>(( )?&)?$"), stl_deref_flags,
5925269875eSPavel Labath       true);
5935269875eSPavel Labath   AddCXXSynthetic(
5945269875eSPavel Labath       cpp_category_sp,
595b9c1b51eSKate Stone       lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator,
596b9c1b51eSKate Stone       "libc++ std::vector synthetic children",
5977ba2d3e8SThomas Anderson       ConstString("^std::__[[:alnum:]]+::vector<.+>(( )?&)?$"), stl_deref_flags,
598b9c1b51eSKate Stone       true);
599b9c1b51eSKate Stone   AddCXXSynthetic(
600b9c1b51eSKate Stone       cpp_category_sp,
60189ac0c7dSPavel Labath       lldb_private::formatters::LibcxxStdForwardListSyntheticFrontEndCreator,
60289ac0c7dSPavel Labath       "libc++ std::forward_list synthetic children",
6037ba2d3e8SThomas Anderson       ConstString("^std::__[[:alnum:]]+::forward_list<.+>(( )?&)?$"),
60489ac0c7dSPavel Labath       stl_synth_flags, true);
60589ac0c7dSPavel Labath   AddCXXSynthetic(
60689ac0c7dSPavel Labath       cpp_category_sp,
607b9c1b51eSKate Stone       lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator,
608b9c1b51eSKate Stone       "libc++ std::list synthetic children",
609b17d6c52SJan Kratochvil       // A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>(( )?&)?$"
610b17d6c52SJan Kratochvil       // so that it does not clash with: "^std::(__cxx11::)?list<.+>(( )?&)?$"
611b17d6c52SJan Kratochvil       ConstString("^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"
612b17d6c52SJan Kratochvil                   "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>(( )?&)?$"),
613b17d6c52SJan Kratochvil       stl_deref_flags, true);
614b9c1b51eSKate Stone   AddCXXSynthetic(
615b9c1b51eSKate Stone       cpp_category_sp,
616b9c1b51eSKate Stone       lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
617b9c1b51eSKate Stone       "libc++ std::map synthetic children",
6187ba2d3e8SThomas Anderson       ConstString("^std::__[[:alnum:]]+::map<.+> >(( )?&)?$"), stl_synth_flags,
619b9c1b51eSKate Stone       true);
620b9c1b51eSKate Stone   AddCXXSynthetic(
621b9c1b51eSKate Stone       cpp_category_sp,
622b9c1b51eSKate Stone       lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
623b9c1b51eSKate Stone       "libc++ std::set synthetic children",
6247ba2d3e8SThomas Anderson       ConstString("^std::__[[:alnum:]]+::set<.+> >(( )?&)?$"), stl_deref_flags,
625b9c1b51eSKate Stone       true);
626b9c1b51eSKate Stone   AddCXXSynthetic(
627b9c1b51eSKate Stone       cpp_category_sp,
628b9c1b51eSKate Stone       lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
629b9c1b51eSKate Stone       "libc++ std::multiset synthetic children",
6307ba2d3e8SThomas Anderson       ConstString("^std::__[[:alnum:]]+::multiset<.+> >(( )?&)?$"),
6317ba2d3e8SThomas Anderson       stl_deref_flags, true);
632b9c1b51eSKate Stone   AddCXXSynthetic(
633b9c1b51eSKate Stone       cpp_category_sp,
634b9c1b51eSKate Stone       lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
635b9c1b51eSKate Stone       "libc++ std::multimap synthetic children",
6367ba2d3e8SThomas Anderson       ConstString("^std::__[[:alnum:]]+::multimap<.+> >(( )?&)?$"),
6377ba2d3e8SThomas Anderson       stl_synth_flags, true);
638b9c1b51eSKate Stone   AddCXXSynthetic(
639b9c1b51eSKate Stone       cpp_category_sp,
640b9c1b51eSKate Stone       lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator,
641b9c1b51eSKate Stone       "libc++ std::unordered containers synthetic children",
6427ba2d3e8SThomas Anderson       ConstString("^(std::__[[:alnum:]]+::)unordered_(multi)?(map|set)<.+> >$"),
643b9c1b51eSKate Stone       stl_synth_flags, true);
644b9c1b51eSKate Stone   AddCXXSynthetic(
645b9c1b51eSKate Stone       cpp_category_sp,
646b9c1b51eSKate Stone       lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator,
647b9c1b51eSKate Stone       "libc++ std::initializer_list synthetic children",
648b9c1b51eSKate Stone       ConstString("^std::initializer_list<.+>(( )?&)?$"), stl_synth_flags,
649b9c1b51eSKate Stone       true);
650e0d51846SPavel Labath   AddCXXSynthetic(cpp_category_sp, LibcxxQueueFrontEndCreator,
651e0d51846SPavel Labath                   "libc++ std::queue synthetic children",
6527ba2d3e8SThomas Anderson                   ConstString("^std::__[[:alnum:]]+::queue<.+>(( )?&)?$"),
653e0d51846SPavel Labath                   stl_synth_flags, true);
654333739d0SPavel Labath   AddCXXSynthetic(cpp_category_sp, LibcxxTupleFrontEndCreator,
655333739d0SPavel Labath                   "libc++ std::tuple synthetic children",
6567ba2d3e8SThomas Anderson                   ConstString("^std::__[[:alnum:]]+::tuple<.*>(( )?&)?$"),
6577ba2d3e8SThomas Anderson                   stl_synth_flags, true);
658c53d3684SAdrian Prantl   AddCXXSynthetic(cpp_category_sp, LibcxxOptionalFrontEndCreator,
659c53d3684SAdrian Prantl                   "libc++ std::optional synthetic children",
6607ba2d3e8SThomas Anderson                   ConstString("^std::__[[:alnum:]]+::optional<.+>(( )?&)?$"),
661c53d3684SAdrian Prantl                   stl_synth_flags, true);
6628306f76eSShafik Yaghmour   AddCXXSynthetic(cpp_category_sp, LibcxxVariantFrontEndCreator,
6638306f76eSShafik Yaghmour                   "libc++ std::variant synthetic children",
6647ba2d3e8SThomas Anderson                   ConstString("^std::__[[:alnum:]]+::variant<.+>(( )?&)?$"),
6658306f76eSShafik Yaghmour                   stl_synth_flags, true);
666b9c1b51eSKate Stone   AddCXXSynthetic(
667b9c1b51eSKate Stone       cpp_category_sp,
668b9c1b51eSKate Stone       lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator,
669b9c1b51eSKate Stone       "libc++ std::atomic synthetic children",
6707ba2d3e8SThomas Anderson       ConstString("^std::__[[:alnum:]]+::atomic<.+>$"), stl_synth_flags, true);
67133e97e63SEnrico Granata 
672b9c1b51eSKate Stone   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
673fd50e7c0SRaphael Isemann       RegularExpression("^(std::__[[:alnum:]]+::)deque<.+>(( )?&)?$"),
674b9c1b51eSKate Stone       SyntheticChildrenSP(new ScriptedSyntheticChildren(
675b9c1b51eSKate Stone           stl_synth_flags,
67633e97e63SEnrico Granata           "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
67733e97e63SEnrico Granata 
678b9c1b51eSKate Stone   AddCXXSynthetic(
679b9c1b51eSKate Stone       cpp_category_sp,
680b9c1b51eSKate Stone       lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator,
681b9c1b51eSKate Stone       "shared_ptr synthetic children",
6827ba2d3e8SThomas Anderson       ConstString("^(std::__[[:alnum:]]+::)shared_ptr<.+>(( )?&)?$"),
683b9c1b51eSKate Stone       stl_synth_flags, true);
684a567d680Sshafik 
685a567d680Sshafik   ConstString libcxx_std_unique_ptr_regex(
686a567d680Sshafik       "^std::__[[:alnum:]]+::unique_ptr<.+>(( )?&)?$");
687a567d680Sshafik   AddCXXSynthetic(
688a567d680Sshafik       cpp_category_sp,
689a567d680Sshafik       lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEndCreator,
690a567d680Sshafik       "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
691a567d680Sshafik       stl_synth_flags, true);
692a567d680Sshafik 
693b9c1b51eSKate Stone   AddCXXSynthetic(
694b9c1b51eSKate Stone       cpp_category_sp,
695b9c1b51eSKate Stone       lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator,
696b9c1b51eSKate Stone       "weak_ptr synthetic children",
6977ba2d3e8SThomas Anderson       ConstString("^(std::__[[:alnum:]]+::)weak_ptr<.+>(( )?&)?$"),
6987ba2d3e8SThomas Anderson       stl_synth_flags, true);
69991e94a70Sshafik   AddCXXSummary(cpp_category_sp,
70091e94a70Sshafik                 lldb_private::formatters::LibcxxFunctionSummaryProvider,
70191e94a70Sshafik                 "libc++ std::function summary provider",
70291e94a70Sshafik                 ConstString("^std::__[[:alnum:]]+::function<.+>$"),
70391e94a70Sshafik                 stl_summary_flags, true);
70433e97e63SEnrico Granata 
705b9c1b51eSKate Stone   stl_summary_flags.SetDontShowChildren(false);
706b9c1b51eSKate Stone   stl_summary_flags.SetSkipPointers(false);
707b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
708b9c1b51eSKate Stone                 lldb_private::formatters::LibcxxContainerSummaryProvider,
7095269875eSPavel Labath                 "libc++ std::bitset summary provider",
7107ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::bitset<.+>(( )?&)?$"),
7115269875eSPavel Labath                 stl_summary_flags, true);
7125269875eSPavel Labath   AddCXXSummary(cpp_category_sp,
7135269875eSPavel Labath                 lldb_private::formatters::LibcxxContainerSummaryProvider,
714b9c1b51eSKate Stone                 "libc++ std::vector summary provider",
7157ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::vector<.+>(( )?&)?$"),
716b9c1b51eSKate Stone                 stl_summary_flags, true);
717b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
718b9c1b51eSKate Stone                 lldb_private::formatters::LibcxxContainerSummaryProvider,
719b9c1b51eSKate Stone                 "libc++ std::list summary provider",
7207ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::forward_list<.+>(( )?&)?$"),
72189ac0c7dSPavel Labath                 stl_summary_flags, true);
722b17d6c52SJan Kratochvil   AddCXXSummary(
723b17d6c52SJan Kratochvil       cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
72489ac0c7dSPavel Labath       "libc++ std::list summary provider",
725b17d6c52SJan Kratochvil       // A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>(( )?&)?$"
726b17d6c52SJan Kratochvil       // so that it does not clash with: "^std::(__cxx11::)?list<.+>(( )?&)?$"
727b17d6c52SJan Kratochvil       ConstString("^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"
728b17d6c52SJan Kratochvil                   "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>(( )?&)?$"),
729b9c1b51eSKate Stone       stl_summary_flags, true);
730b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
731b9c1b51eSKate Stone                 lldb_private::formatters::LibcxxContainerSummaryProvider,
732b9c1b51eSKate Stone                 "libc++ std::map summary provider",
7337ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::map<.+>(( )?&)?$"),
734b9c1b51eSKate Stone                 stl_summary_flags, true);
735b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
736b9c1b51eSKate Stone                 lldb_private::formatters::LibcxxContainerSummaryProvider,
737b9c1b51eSKate Stone                 "libc++ std::deque summary provider",
7387ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::deque<.+>(( )?&)?$"),
739b9c1b51eSKate Stone                 stl_summary_flags, true);
740b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
741b9c1b51eSKate Stone                 lldb_private::formatters::LibcxxContainerSummaryProvider,
742e0d51846SPavel Labath                 "libc++ std::queue summary provider",
7437ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::queue<.+>(( )?&)?$"),
744e0d51846SPavel Labath                 stl_summary_flags, true);
745e0d51846SPavel Labath   AddCXXSummary(cpp_category_sp,
746e0d51846SPavel Labath                 lldb_private::formatters::LibcxxContainerSummaryProvider,
747b9c1b51eSKate Stone                 "libc++ std::set summary provider",
7487ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::set<.+>(( )?&)?$"),
749b9c1b51eSKate Stone                 stl_summary_flags, true);
750b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
751b9c1b51eSKate Stone                 lldb_private::formatters::LibcxxContainerSummaryProvider,
752b9c1b51eSKate Stone                 "libc++ std::multiset summary provider",
7537ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::multiset<.+>(( )?&)?$"),
754b9c1b51eSKate Stone                 stl_summary_flags, true);
755b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
756b9c1b51eSKate Stone                 lldb_private::formatters::LibcxxContainerSummaryProvider,
757b9c1b51eSKate Stone                 "libc++ std::multimap summary provider",
7587ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::multimap<.+>(( )?&)?$"),
759b9c1b51eSKate Stone                 stl_summary_flags, true);
760b9c1b51eSKate Stone   AddCXXSummary(
761b9c1b51eSKate Stone       cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
762b9c1b51eSKate Stone       "libc++ std::unordered containers summary provider",
7637ba2d3e8SThomas Anderson       ConstString("^(std::__[[:alnum:]]+::)unordered_(multi)?(map|set)<.+> >$"),
764b9c1b51eSKate Stone       stl_summary_flags, true);
765333739d0SPavel Labath   AddCXXSummary(cpp_category_sp, LibcxxContainerSummaryProvider,
766333739d0SPavel Labath                 "libc++ std::tuple summary provider",
7677ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::tuple<.*>(( )?&)?$"),
7687ba2d3e8SThomas Anderson                 stl_summary_flags, true);
76946fb5d5dSRaphael Isemann   AddCXXSummary(cpp_category_sp,
77046fb5d5dSRaphael Isemann                 lldb_private::formatters::LibCxxAtomicSummaryProvider,
771b9c1b51eSKate Stone                 "libc++ std::atomic summary provider",
77246fb5d5dSRaphael Isemann                 ConstString("^std::__[[:alnum:]]+::atomic<.+>$"),
77346fb5d5dSRaphael Isemann                 stl_summary_flags, true);
774c53d3684SAdrian Prantl   AddCXXSummary(cpp_category_sp,
775c53d3684SAdrian Prantl                 lldb_private::formatters::LibcxxOptionalSummaryProvider,
776c53d3684SAdrian Prantl                 "libc++ std::optional summary provider",
7777ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::optional<.+>(( )?&)?$"),
778c53d3684SAdrian Prantl                 stl_summary_flags, true);
7798306f76eSShafik Yaghmour   AddCXXSummary(cpp_category_sp,
7808306f76eSShafik Yaghmour                 lldb_private::formatters::LibcxxVariantSummaryProvider,
7818306f76eSShafik Yaghmour                 "libc++ std::variant summary provider",
7827ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::variant<.+>(( )?&)?$"),
7838306f76eSShafik Yaghmour                 stl_summary_flags, true);
78433e97e63SEnrico Granata 
78533e97e63SEnrico Granata   stl_summary_flags.SetSkipPointers(true);
78633e97e63SEnrico Granata 
787b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
788b9c1b51eSKate Stone                 lldb_private::formatters::LibcxxSmartPointerSummaryProvider,
789b9c1b51eSKate Stone                 "libc++ std::shared_ptr summary provider",
7907ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::shared_ptr<.+>(( )?&)?$"),
791b9c1b51eSKate Stone                 stl_summary_flags, true);
792b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
793b9c1b51eSKate Stone                 lldb_private::formatters::LibcxxSmartPointerSummaryProvider,
794b9c1b51eSKate Stone                 "libc++ std::weak_ptr summary provider",
7957ba2d3e8SThomas Anderson                 ConstString("^std::__[[:alnum:]]+::weak_ptr<.+>(( )?&)?$"),
796b9c1b51eSKate Stone                 stl_summary_flags, true);
797a567d680Sshafik   AddCXXSummary(cpp_category_sp,
798a567d680Sshafik                 lldb_private::formatters::LibcxxUniquePointerSummaryProvider,
799a567d680Sshafik                 "libc++ std::unique_ptr summary provider",
800a567d680Sshafik                 libcxx_std_unique_ptr_regex, stl_summary_flags, true);
80133e97e63SEnrico Granata 
802b9c1b51eSKate Stone   AddCXXSynthetic(
803b9c1b51eSKate Stone       cpp_category_sp,
804b9c1b51eSKate Stone       lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator,
805b9c1b51eSKate Stone       "std::vector iterator synthetic children",
8067ba2d3e8SThomas Anderson       ConstString("^std::__[[:alnum:]]+::__wrap_iter<.+>$"), stl_synth_flags,
8077ba2d3e8SThomas Anderson       true);
80833e97e63SEnrico Granata 
809b9c1b51eSKate Stone   AddCXXSynthetic(
810b9c1b51eSKate Stone       cpp_category_sp,
811b9c1b51eSKate Stone       lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator,
812b9c1b51eSKate Stone       "std::map iterator synthetic children",
8137ba2d3e8SThomas Anderson       ConstString("^std::__[[:alnum:]]+::__map_iterator<.+>$"), stl_synth_flags,
814b9c1b51eSKate Stone       true);
81533e97e63SEnrico Granata }
81633e97e63SEnrico Granata 
817b9c1b51eSKate Stone static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
81833e97e63SEnrico Granata   if (!cpp_category_sp)
81933e97e63SEnrico Granata     return;
82033e97e63SEnrico Granata 
82133e97e63SEnrico Granata   TypeSummaryImpl::Flags stl_summary_flags;
82233e97e63SEnrico Granata   stl_summary_flags.SetCascades(true)
82333e97e63SEnrico Granata       .SetSkipPointers(false)
82433e97e63SEnrico Granata       .SetSkipReferences(false)
82533e97e63SEnrico Granata       .SetDontShowChildren(true)
82633e97e63SEnrico Granata       .SetDontShowValue(true)
82733e97e63SEnrico Granata       .SetShowMembersOneLiner(false)
82833e97e63SEnrico Granata       .SetHideItemNames(false);
82933e97e63SEnrico Granata 
830b9c1b51eSKate Stone   lldb::TypeSummaryImplSP std_string_summary_sp(
831b9c1b51eSKate Stone       new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p}"));
83233e97e63SEnrico Granata 
833b9c1b51eSKate Stone   lldb::TypeSummaryImplSP cxx11_string_summary_sp(new CXXFunctionSummaryFormat(
834b9c1b51eSKate Stone       stl_summary_flags, LibStdcppStringSummaryProvider,
83582ffb8e9STodd Fiala       "libstdc++ c++11 std::string summary provider"));
836b9c1b51eSKate Stone   lldb::TypeSummaryImplSP cxx11_wstring_summary_sp(new CXXFunctionSummaryFormat(
837b9c1b51eSKate Stone       stl_summary_flags, LibStdcppWStringSummaryProvider,
83882ffb8e9STodd Fiala       "libstdc++ c++11 std::wstring summary provider"));
83982ffb8e9STodd Fiala 
84033e97e63SEnrico Granata   cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::string"),
84133e97e63SEnrico Granata                                                     std_string_summary_sp);
842b9c1b51eSKate Stone   cpp_category_sp->GetTypeSummariesContainer()->Add(
843b9c1b51eSKate Stone       ConstString("std::basic_string<char>"), std_string_summary_sp);
844b9c1b51eSKate Stone   cpp_category_sp->GetTypeSummariesContainer()->Add(
845b9c1b51eSKate Stone       ConstString("std::basic_string<char,std::char_traits<char>,std::"
846b9c1b51eSKate Stone                   "allocator<char> >"),
84733e97e63SEnrico Granata       std_string_summary_sp);
848b9c1b51eSKate Stone   cpp_category_sp->GetTypeSummariesContainer()->Add(
849b9c1b51eSKate Stone       ConstString("std::basic_string<char, std::char_traits<char>, "
850b9c1b51eSKate Stone                   "std::allocator<char> >"),
85133e97e63SEnrico Granata       std_string_summary_sp);
85233e97e63SEnrico Granata 
853b9c1b51eSKate Stone   cpp_category_sp->GetTypeSummariesContainer()->Add(
854b9c1b51eSKate Stone       ConstString("std::__cxx11::string"), cxx11_string_summary_sp);
855b9c1b51eSKate Stone   cpp_category_sp->GetTypeSummariesContainer()->Add(
856b9c1b51eSKate Stone       ConstString("std::__cxx11::basic_string<char, std::char_traits<char>, "
857b9c1b51eSKate Stone                   "std::allocator<char> >"),
85882ffb8e9STodd Fiala       cxx11_string_summary_sp);
859506144daSJordan Rupprecht   cpp_category_sp->GetTypeSummariesContainer()->Add(
86046fb5d5dSRaphael Isemann       ConstString("std::__cxx11::basic_string<unsigned char, "
86146fb5d5dSRaphael Isemann                   "std::char_traits<unsigned char>, "
862506144daSJordan Rupprecht                   "std::allocator<unsigned char> >"),
863506144daSJordan Rupprecht       cxx11_string_summary_sp);
86482ffb8e9STodd Fiala 
865b9c1b51eSKate Stone   // making sure we force-pick the summary for printing wstring (_M_p is a
866b9c1b51eSKate Stone   // wchar_t*)
867b9c1b51eSKate Stone   lldb::TypeSummaryImplSP std_wstring_summary_sp(
868b9c1b51eSKate Stone       new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p%S}"));
86933e97e63SEnrico Granata 
87033e97e63SEnrico Granata   cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::wstring"),
87133e97e63SEnrico Granata                                                     std_wstring_summary_sp);
872b9c1b51eSKate Stone   cpp_category_sp->GetTypeSummariesContainer()->Add(
873b9c1b51eSKate Stone       ConstString("std::basic_string<wchar_t>"), std_wstring_summary_sp);
874b9c1b51eSKate Stone   cpp_category_sp->GetTypeSummariesContainer()->Add(
875b9c1b51eSKate Stone       ConstString("std::basic_string<wchar_t,std::char_traits<wchar_t>,std::"
876b9c1b51eSKate Stone                   "allocator<wchar_t> >"),
87733e97e63SEnrico Granata       std_wstring_summary_sp);
878b9c1b51eSKate Stone   cpp_category_sp->GetTypeSummariesContainer()->Add(
879b9c1b51eSKate Stone       ConstString("std::basic_string<wchar_t, std::char_traits<wchar_t>, "
880b9c1b51eSKate Stone                   "std::allocator<wchar_t> >"),
88133e97e63SEnrico Granata       std_wstring_summary_sp);
88233e97e63SEnrico Granata 
883b9c1b51eSKate Stone   cpp_category_sp->GetTypeSummariesContainer()->Add(
884b9c1b51eSKate Stone       ConstString("std::__cxx11::wstring"), cxx11_wstring_summary_sp);
885b9c1b51eSKate Stone   cpp_category_sp->GetTypeSummariesContainer()->Add(
886b9c1b51eSKate Stone       ConstString("std::__cxx11::basic_string<wchar_t, "
887b9c1b51eSKate Stone                   "std::char_traits<wchar_t>, std::allocator<wchar_t> >"),
88882ffb8e9STodd Fiala       cxx11_wstring_summary_sp);
88933e97e63SEnrico Granata 
89033e97e63SEnrico Granata   SyntheticChildren::Flags stl_synth_flags;
891b9c1b51eSKate Stone   stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
892b9c1b51eSKate Stone       false);
893566bfbb7SDanil Stefaniuc   SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
894566bfbb7SDanil Stefaniuc   stl_deref_flags.SetFrontEndWantsDereference();
89533e97e63SEnrico Granata 
896b9c1b51eSKate Stone   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
897fd50e7c0SRaphael Isemann       RegularExpression("^std::vector<.+>(( )?&)?$"),
898b9c1b51eSKate Stone       SyntheticChildrenSP(new ScriptedSyntheticChildren(
899b9c1b51eSKate Stone           stl_synth_flags,
90033e97e63SEnrico Granata           "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
901b9c1b51eSKate Stone   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
902fd50e7c0SRaphael Isemann       RegularExpression("^std::map<.+> >(( )?&)?$"),
903b9c1b51eSKate Stone       SyntheticChildrenSP(new ScriptedSyntheticChildren(
904b9c1b51eSKate Stone           stl_synth_flags,
905f869e0beSDanil Stefaniuc           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
9063eb9e653SDanil Stefaniuc   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
907*2ea3c8a5SWalter Erquinigo       RegularExpression("^std::deque<.+>(( )?&)?$"),
908*2ea3c8a5SWalter Erquinigo       SyntheticChildrenSP(new ScriptedSyntheticChildren(
909*2ea3c8a5SWalter Erquinigo           stl_deref_flags,
910*2ea3c8a5SWalter Erquinigo           "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
911*2ea3c8a5SWalter Erquinigo   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
9123eb9e653SDanil Stefaniuc       RegularExpression("^std::set<.+> >(( )?&)?$"),
9133eb9e653SDanil Stefaniuc       SyntheticChildrenSP(new ScriptedSyntheticChildren(
9143eb9e653SDanil Stefaniuc           stl_deref_flags,
915f869e0beSDanil Stefaniuc           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
916f869e0beSDanil Stefaniuc   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
917f869e0beSDanil Stefaniuc       RegularExpression("^std::multimap<.+> >(( )?&)?$"),
918f869e0beSDanil Stefaniuc       SyntheticChildrenSP(new ScriptedSyntheticChildren(
919f869e0beSDanil Stefaniuc           stl_deref_flags,
920f869e0beSDanil Stefaniuc           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
921b9c1b51eSKate Stone   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
922e3dea5cfSWalter Erquinigo       RegularExpression("^std::optional<.+>(( )?&)?$"),
923e3dea5cfSWalter Erquinigo       SyntheticChildrenSP(new ScriptedSyntheticChildren(
924e3dea5cfSWalter Erquinigo           stl_synth_flags,
925e3dea5cfSWalter Erquinigo           "lldb.formatters.cpp.gnu_libstdcpp.StdOptionalSynthProvider")));
926e3dea5cfSWalter Erquinigo   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
92782ed1065SDanil Stefaniuc       RegularExpression("^std::multiset<.+> >(( )?&)?$"),
92882ed1065SDanil Stefaniuc       SyntheticChildrenSP(new ScriptedSyntheticChildren(
92982ed1065SDanil Stefaniuc           stl_deref_flags,
93082ed1065SDanil Stefaniuc           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
93182ed1065SDanil Stefaniuc   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
932fcd288b5SDanil Stefaniuc       RegularExpression("^std::unordered_(multi)?(map|set)<.+> >$"),
933fcd288b5SDanil Stefaniuc       SyntheticChildrenSP(new ScriptedSyntheticChildren(
934fcd288b5SDanil Stefaniuc           stl_deref_flags,
935fcd288b5SDanil Stefaniuc           "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
936fcd288b5SDanil Stefaniuc   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
937fd50e7c0SRaphael Isemann       RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$"),
938b9c1b51eSKate Stone       SyntheticChildrenSP(new ScriptedSyntheticChildren(
939b9c1b51eSKate Stone           stl_synth_flags,
94033e97e63SEnrico Granata           "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
941577c1eecSDanil Stefaniuc   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
942577c1eecSDanil Stefaniuc       RegularExpression("^std::(__cxx11::)?forward_list<.+>(( )?&)?$"),
943577c1eecSDanil Stefaniuc       SyntheticChildrenSP(new ScriptedSyntheticChildren(
944577c1eecSDanil Stefaniuc           stl_synth_flags,
945577c1eecSDanil Stefaniuc           "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
946e3dea5cfSWalter Erquinigo 
947b9c1b51eSKate Stone   stl_summary_flags.SetDontShowChildren(false);
9483eb9e653SDanil Stefaniuc   stl_summary_flags.SetSkipPointers(false);
949b9c1b51eSKate Stone   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
950e3dea5cfSWalter Erquinigo       RegularExpression("^std::optional<.+>(( )?&)?$"),
951e3dea5cfSWalter Erquinigo       TypeSummaryImplSP(new ScriptSummaryFormat(
952e3dea5cfSWalter Erquinigo           stl_summary_flags,
953e3dea5cfSWalter Erquinigo           "lldb.formatters.cpp.gnu_libstdcpp.StdOptionalSummaryProvider")));
954e3dea5cfSWalter Erquinigo   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
955566bfbb7SDanil Stefaniuc       RegularExpression("^std::bitset<.+>(( )?&)?$"),
956566bfbb7SDanil Stefaniuc       TypeSummaryImplSP(
957566bfbb7SDanil Stefaniuc           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
958566bfbb7SDanil Stefaniuc   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
959fd50e7c0SRaphael Isemann       RegularExpression("^std::vector<.+>(( )?&)?$"),
960b9c1b51eSKate Stone       TypeSummaryImplSP(
961b9c1b51eSKate Stone           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
962b9c1b51eSKate Stone   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
963fd50e7c0SRaphael Isemann       RegularExpression("^std::map<.+> >(( )?&)?$"),
96495eae423SZachary Turner       TypeSummaryImplSP(
96595eae423SZachary Turner           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
96695eae423SZachary Turner   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
9673eb9e653SDanil Stefaniuc       RegularExpression("^std::set<.+> >(( )?&)?$"),
9683eb9e653SDanil Stefaniuc       TypeSummaryImplSP(
9693eb9e653SDanil Stefaniuc           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
9703eb9e653SDanil Stefaniuc   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
971*2ea3c8a5SWalter Erquinigo       RegularExpression("^std::deque<.+>(( )?&)?$"),
972*2ea3c8a5SWalter Erquinigo       TypeSummaryImplSP(
973*2ea3c8a5SWalter Erquinigo           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
974*2ea3c8a5SWalter Erquinigo   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
975f869e0beSDanil Stefaniuc       RegularExpression("^std::multimap<.+> >(( )?&)?$"),
976f869e0beSDanil Stefaniuc       TypeSummaryImplSP(
977f869e0beSDanil Stefaniuc           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
978f869e0beSDanil Stefaniuc   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
97982ed1065SDanil Stefaniuc       RegularExpression("^std::multiset<.+> >(( )?&)?$"),
98082ed1065SDanil Stefaniuc       TypeSummaryImplSP(
98182ed1065SDanil Stefaniuc           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
98282ed1065SDanil Stefaniuc   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
983fcd288b5SDanil Stefaniuc       RegularExpression("^std::unordered_(multi)?(map|set)<.+> >$"),
984fcd288b5SDanil Stefaniuc       TypeSummaryImplSP(
985fcd288b5SDanil Stefaniuc           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
986fcd288b5SDanil Stefaniuc   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
987fd50e7c0SRaphael Isemann       RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$"),
988b9c1b51eSKate Stone       TypeSummaryImplSP(
989b9c1b51eSKate Stone           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
990577c1eecSDanil Stefaniuc   cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
991577c1eecSDanil Stefaniuc       RegularExpression("^std::(__cxx11::)?forward_list<.+>(( )?&)?$"),
992577c1eecSDanil Stefaniuc       TypeSummaryImplSP(
9939a9d9a9bSDanil Stefaniuc           new ScriptSummaryFormat(stl_summary_flags, "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
99433e97e63SEnrico Granata 
995b9c1b51eSKate Stone   AddCXXSynthetic(
996b9c1b51eSKate Stone       cpp_category_sp,
997b9c1b51eSKate Stone       lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator,
998b9c1b51eSKate Stone       "std::vector iterator synthetic children",
999b9c1b51eSKate Stone       ConstString("^__gnu_cxx::__normal_iterator<.+>$"), stl_synth_flags, true);
100033e97e63SEnrico Granata 
1001b9c1b51eSKate Stone   AddCXXSynthetic(
1002b9c1b51eSKate Stone       cpp_category_sp,
1003b9c1b51eSKate Stone       lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator,
1004b9c1b51eSKate Stone       "std::map iterator synthetic children",
1005b9c1b51eSKate Stone       ConstString("^std::_Rb_tree_iterator<.+>$"), stl_synth_flags, true);
10069c6c8e99STamas Berghammer 
1007b9c1b51eSKate Stone   AddCXXSynthetic(
1008b9c1b51eSKate Stone       cpp_category_sp,
1009d161b214STamas Berghammer       lldb_private::formatters::LibStdcppUniquePtrSyntheticFrontEndCreator,
1010d161b214STamas Berghammer       "std::unique_ptr synthetic children",
1011d161b214STamas Berghammer       ConstString("^std::unique_ptr<.+>(( )?&)?$"), stl_synth_flags, true);
1012d161b214STamas Berghammer   AddCXXSynthetic(
1013d161b214STamas Berghammer       cpp_category_sp,
1014b9c1b51eSKate Stone       lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator,
1015b9c1b51eSKate Stone       "std::shared_ptr synthetic children",
1016b9c1b51eSKate Stone       ConstString("^std::shared_ptr<.+>(( )?&)?$"), stl_synth_flags, true);
1017b9c1b51eSKate Stone   AddCXXSynthetic(
1018b9c1b51eSKate Stone       cpp_category_sp,
1019b9c1b51eSKate Stone       lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator,
1020b9c1b51eSKate Stone       "std::weak_ptr synthetic children",
1021b9c1b51eSKate Stone       ConstString("^std::weak_ptr<.+>(( )?&)?$"), stl_synth_flags, true);
10227f15dba1STamas Berghammer   AddCXXSynthetic(
10237f15dba1STamas Berghammer       cpp_category_sp,
10247f15dba1STamas Berghammer       lldb_private::formatters::LibStdcppTupleSyntheticFrontEndCreator,
10257f15dba1STamas Berghammer       "std::tuple synthetic children", ConstString("^std::tuple<.+>(( )?&)?$"),
10267f15dba1STamas Berghammer       stl_synth_flags, true);
1027b9c1b51eSKate Stone 
1028566bfbb7SDanil Stefaniuc   AddCXXSynthetic(
1029566bfbb7SDanil Stefaniuc       cpp_category_sp,
1030566bfbb7SDanil Stefaniuc       lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator,
1031566bfbb7SDanil Stefaniuc       "std::bitset synthetic child", ConstString("^std::bitset<.+>(( )?&)?$"),
1032566bfbb7SDanil Stefaniuc       stl_deref_flags, true);
1033566bfbb7SDanil Stefaniuc 
1034b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
1035d161b214STamas Berghammer                 lldb_private::formatters::LibStdcppUniquePointerSummaryProvider,
1036d161b214STamas Berghammer                 "libstdc++ std::unique_ptr summary provider",
1037d161b214STamas Berghammer                 ConstString("^std::unique_ptr<.+>(( )?&)?$"), stl_summary_flags,
1038d161b214STamas Berghammer                 true);
1039d161b214STamas Berghammer   AddCXXSummary(cpp_category_sp,
1040b9c1b51eSKate Stone                 lldb_private::formatters::LibStdcppSmartPointerSummaryProvider,
1041b9c1b51eSKate Stone                 "libstdc++ std::shared_ptr summary provider",
1042b9c1b51eSKate Stone                 ConstString("^std::shared_ptr<.+>(( )?&)?$"), stl_summary_flags,
10439c6c8e99STamas Berghammer                 true);
1044b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
1045b9c1b51eSKate Stone                 lldb_private::formatters::LibStdcppSmartPointerSummaryProvider,
1046b9c1b51eSKate Stone                 "libstdc++ std::weak_ptr summary provider",
1047b9c1b51eSKate Stone                 ConstString("^std::weak_ptr<.+>(( )?&)?$"), stl_summary_flags,
10489c6c8e99STamas Berghammer                 true);
104933e97e63SEnrico Granata }
105033e97e63SEnrico Granata 
1051b9c1b51eSKate Stone static void LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
105233e97e63SEnrico Granata   if (!cpp_category_sp)
105333e97e63SEnrico Granata     return;
105433e97e63SEnrico Granata 
105533e97e63SEnrico Granata   TypeSummaryImpl::Flags string_flags;
105633e97e63SEnrico Granata   string_flags.SetCascades(true)
105733e97e63SEnrico Granata       .SetSkipPointers(true)
105833e97e63SEnrico Granata       .SetSkipReferences(false)
105933e97e63SEnrico Granata       .SetDontShowChildren(true)
106033e97e63SEnrico Granata       .SetDontShowValue(false)
106133e97e63SEnrico Granata       .SetShowMembersOneLiner(false)
106233e97e63SEnrico Granata       .SetHideItemNames(false);
106333e97e63SEnrico Granata 
106433e97e63SEnrico Granata   TypeSummaryImpl::Flags string_array_flags;
106533e97e63SEnrico Granata   string_array_flags.SetCascades(true)
106633e97e63SEnrico Granata       .SetSkipPointers(true)
106733e97e63SEnrico Granata       .SetSkipReferences(false)
106833e97e63SEnrico Granata       .SetDontShowChildren(true)
106933e97e63SEnrico Granata       .SetDontShowValue(true)
107033e97e63SEnrico Granata       .SetShowMembersOneLiner(false)
107133e97e63SEnrico Granata       .SetHideItemNames(false);
107233e97e63SEnrico Granata 
1073b9c1b51eSKate Stone   AddCXXSummary(
1074c46d39b9SJonas Devlieghere       cpp_category_sp, lldb_private::formatters::Char8StringSummaryProvider,
1075c46d39b9SJonas Devlieghere       "char8_t * summary provider", ConstString("char8_t *"), string_flags);
1076c46d39b9SJonas Devlieghere   AddCXXSummary(cpp_category_sp,
1077c46d39b9SJonas Devlieghere                 lldb_private::formatters::Char8StringSummaryProvider,
1078c46d39b9SJonas Devlieghere                 "char8_t [] summary provider",
1079aee49255SDavid Blaikie                 ConstString("char8_t ?\\[[0-9]+\\]"), string_array_flags, true);
1080c46d39b9SJonas Devlieghere 
1081c46d39b9SJonas Devlieghere   AddCXXSummary(
1082b9c1b51eSKate Stone       cpp_category_sp, lldb_private::formatters::Char16StringSummaryProvider,
1083b9c1b51eSKate Stone       "char16_t * summary provider", ConstString("char16_t *"), string_flags);
1084045c8292SDawn Perchik   AddCXXSummary(cpp_category_sp,
1085045c8292SDawn Perchik                 lldb_private::formatters::Char16StringSummaryProvider,
1086045c8292SDawn Perchik                 "char16_t [] summary provider",
1087aee49255SDavid Blaikie                 ConstString("char16_t ?\\[[0-9]+\\]"), string_array_flags, true);
108833e97e63SEnrico Granata 
1089b9c1b51eSKate Stone   AddCXXSummary(
1090b9c1b51eSKate Stone       cpp_category_sp, lldb_private::formatters::Char32StringSummaryProvider,
1091b9c1b51eSKate Stone       "char32_t * summary provider", ConstString("char32_t *"), string_flags);
1092045c8292SDawn Perchik   AddCXXSummary(cpp_category_sp,
1093045c8292SDawn Perchik                 lldb_private::formatters::Char32StringSummaryProvider,
1094045c8292SDawn Perchik                 "char32_t [] summary provider",
1095aee49255SDavid Blaikie                 ConstString("char32_t ?\\[[0-9]+\\]"), string_array_flags, true);
109633e97e63SEnrico Granata 
1097b9c1b51eSKate Stone   AddCXXSummary(
1098b9c1b51eSKate Stone       cpp_category_sp, lldb_private::formatters::WCharStringSummaryProvider,
1099b9c1b51eSKate Stone       "wchar_t * summary provider", ConstString("wchar_t *"), string_flags);
1100b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp,
1101b9c1b51eSKate Stone                 lldb_private::formatters::WCharStringSummaryProvider,
1102b9c1b51eSKate Stone                 "wchar_t * summary provider",
1103aee49255SDavid Blaikie                 ConstString("wchar_t ?\\[[0-9]+\\]"), string_array_flags, true);
110433e97e63SEnrico Granata 
1105b9c1b51eSKate Stone   AddCXXSummary(
1106b9c1b51eSKate Stone       cpp_category_sp, lldb_private::formatters::Char16StringSummaryProvider,
1107b9c1b51eSKate Stone       "unichar * summary provider", ConstString("unichar *"), string_flags);
110833e97e63SEnrico Granata 
110933e97e63SEnrico Granata   TypeSummaryImpl::Flags widechar_flags;
111033e97e63SEnrico Granata   widechar_flags.SetDontShowValue(true)
111133e97e63SEnrico Granata       .SetSkipPointers(true)
111233e97e63SEnrico Granata       .SetSkipReferences(false)
111333e97e63SEnrico Granata       .SetCascades(true)
111433e97e63SEnrico Granata       .SetDontShowChildren(true)
111533e97e63SEnrico Granata       .SetHideItemNames(true)
111633e97e63SEnrico Granata       .SetShowMembersOneLiner(false);
111733e97e63SEnrico Granata 
1118c46d39b9SJonas Devlieghere   AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char8SummaryProvider,
1119c46d39b9SJonas Devlieghere                 "char8_t summary provider", ConstString("char8_t"),
1120c46d39b9SJonas Devlieghere                 widechar_flags);
1121b9c1b51eSKate Stone   AddCXXSummary(
1122b9c1b51eSKate Stone       cpp_category_sp, lldb_private::formatters::Char16SummaryProvider,
1123b9c1b51eSKate Stone       "char16_t summary provider", ConstString("char16_t"), widechar_flags);
1124b9c1b51eSKate Stone   AddCXXSummary(
1125b9c1b51eSKate Stone       cpp_category_sp, lldb_private::formatters::Char32SummaryProvider,
1126b9c1b51eSKate Stone       "char32_t summary provider", ConstString("char32_t"), widechar_flags);
1127b9c1b51eSKate Stone   AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharSummaryProvider,
1128b9c1b51eSKate Stone                 "wchar_t summary provider", ConstString("wchar_t"),
1129b9c1b51eSKate Stone                 widechar_flags);
113033e97e63SEnrico Granata 
1131b9c1b51eSKate Stone   AddCXXSummary(
1132b9c1b51eSKate Stone       cpp_category_sp, lldb_private::formatters::Char16SummaryProvider,
1133b9c1b51eSKate Stone       "unichar summary provider", ConstString("unichar"), widechar_flags);
113433e97e63SEnrico Granata }
113533e97e63SEnrico Granata 
1136c046497bSEnrico Granata std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() {
113763db2395SEnrico Granata   class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger {
1138c046497bSEnrico Granata   public:
11391756630dSRaphael Isemann     CompilerType AdjustForInclusion(CompilerType &candidate) override {
114063db2395SEnrico Granata       LanguageType lang_type(candidate.GetMinimumLanguage());
114163db2395SEnrico Granata       if (!Language::LanguageIsC(lang_type) &&
114263db2395SEnrico Granata           !Language::LanguageIsCPlusPlus(lang_type))
114363db2395SEnrico Granata         return CompilerType();
114463db2395SEnrico Granata       if (candidate.IsTypedefType())
114563db2395SEnrico Granata         return candidate.GetTypedefedType();
114663db2395SEnrico Granata       return candidate;
1147c046497bSEnrico Granata     }
1148c046497bSEnrico Granata   };
1149c046497bSEnrico Granata 
1150c046497bSEnrico Granata   return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger());
1151c046497bSEnrico Granata }
1152c046497bSEnrico Granata 
1153b9c1b51eSKate Stone lldb::TypeCategoryImplSP CPlusPlusLanguage::GetFormatters() {
1154c5f28e2aSKamil Rytarowski   static llvm::once_flag g_initialize;
115533e97e63SEnrico Granata   static TypeCategoryImplSP g_category;
115633e97e63SEnrico Granata 
1157c5f28e2aSKamil Rytarowski   llvm::call_once(g_initialize, [this]() -> void {
1158a3939e15SPavel Labath     DataVisualization::Categories::GetCategory(ConstString(GetPluginName()),
1159a3939e15SPavel Labath                                                g_category);
1160b9c1b51eSKate Stone     if (g_category) {
116133e97e63SEnrico Granata       LoadLibStdcppFormatters(g_category);
11627ba2d3e8SThomas Anderson       LoadLibCxxFormatters(g_category);
116333e97e63SEnrico Granata       LoadSystemFormatters(g_category);
116433e97e63SEnrico Granata     }
116533e97e63SEnrico Granata   });
116633e97e63SEnrico Granata   return g_category;
116733e97e63SEnrico Granata }
116833e97e63SEnrico Granata 
11697cb59e1aSEnrico Granata HardcodedFormatters::HardcodedSummaryFinder
1170b9c1b51eSKate Stone CPlusPlusLanguage::GetHardcodedSummaries() {
1171c5f28e2aSKamil Rytarowski   static llvm::once_flag g_initialize;
11727cb59e1aSEnrico Granata   static ConstString g_vectortypes("VectorTypes");
11737cb59e1aSEnrico Granata   static HardcodedFormatters::HardcodedSummaryFinder g_formatters;
11747cb59e1aSEnrico Granata 
1175c5f28e2aSKamil Rytarowski   llvm::call_once(g_initialize, []() -> void {
11767cb59e1aSEnrico Granata     g_formatters.push_back(
1177b9c1b51eSKate Stone         [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
11787cb59e1aSEnrico Granata            FormatManager &) -> TypeSummaryImpl::SharedPointer {
1179b9c1b51eSKate Stone           static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
1180b9c1b51eSKate Stone               new CXXFunctionSummaryFormat(
1181b9c1b51eSKate Stone                   TypeSummaryImpl::Flags(),
1182b9c1b51eSKate Stone                   lldb_private::formatters::CXXFunctionPointerSummaryProvider,
1183b9c1b51eSKate Stone                   "Function pointer summary provider"));
1184b9c1b51eSKate Stone           if (valobj.GetCompilerType().IsFunctionPointerType()) {
11857cb59e1aSEnrico Granata             return formatter_sp;
11867cb59e1aSEnrico Granata           }
11877cb59e1aSEnrico Granata           return nullptr;
11887cb59e1aSEnrico Granata         });
11897cb59e1aSEnrico Granata     g_formatters.push_back(
1190b9c1b51eSKate Stone         [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
11917cb59e1aSEnrico Granata            FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer {
1192b9c1b51eSKate Stone           static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
1193b9c1b51eSKate Stone               new CXXFunctionSummaryFormat(
1194b9c1b51eSKate Stone                   TypeSummaryImpl::Flags()
11957cb59e1aSEnrico Granata                       .SetCascades(true)
11967cb59e1aSEnrico Granata                       .SetDontShowChildren(true)
11977cb59e1aSEnrico Granata                       .SetHideItemNames(true)
11987cb59e1aSEnrico Granata                       .SetShowMembersOneLiner(true)
11997cb59e1aSEnrico Granata                       .SetSkipPointers(true)
12007cb59e1aSEnrico Granata                       .SetSkipReferences(false),
12017cb59e1aSEnrico Granata                   lldb_private::formatters::VectorTypeSummaryProvider,
12027cb59e1aSEnrico Granata                   "vector_type pointer summary provider"));
120303310c1eSRaphael Isemann           if (valobj.GetCompilerType().IsVectorType()) {
12047cb59e1aSEnrico Granata             if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
12057cb59e1aSEnrico Granata               return formatter_sp;
12067cb59e1aSEnrico Granata           }
12077cb59e1aSEnrico Granata           return nullptr;
12087cb59e1aSEnrico Granata         });
1209c530ba98SSean Callanan     g_formatters.push_back(
1210b9c1b51eSKate Stone         [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
1211c530ba98SSean Callanan            FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer {
1212b9c1b51eSKate Stone           static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
1213b9c1b51eSKate Stone               new CXXFunctionSummaryFormat(
1214b9c1b51eSKate Stone                   TypeSummaryImpl::Flags()
1215c530ba98SSean Callanan                       .SetCascades(true)
1216c530ba98SSean Callanan                       .SetDontShowChildren(true)
1217c530ba98SSean Callanan                       .SetHideItemNames(true)
1218c530ba98SSean Callanan                       .SetShowMembersOneLiner(true)
1219c530ba98SSean Callanan                       .SetSkipPointers(true)
1220c530ba98SSean Callanan                       .SetSkipReferences(false),
1221c530ba98SSean Callanan                   lldb_private::formatters::BlockPointerSummaryProvider,
1222c530ba98SSean Callanan                   "block pointer summary provider"));
122303310c1eSRaphael Isemann           if (valobj.GetCompilerType().IsBlockPointerType()) {
1224c530ba98SSean Callanan             return formatter_sp;
1225c530ba98SSean Callanan           }
1226c530ba98SSean Callanan           return nullptr;
1227c530ba98SSean Callanan         });
12287cb59e1aSEnrico Granata   });
12297cb59e1aSEnrico Granata 
12307cb59e1aSEnrico Granata   return g_formatters;
12317cb59e1aSEnrico Granata }
12327cb59e1aSEnrico Granata 
12337cb59e1aSEnrico Granata HardcodedFormatters::HardcodedSyntheticFinder
1234b9c1b51eSKate Stone CPlusPlusLanguage::GetHardcodedSynthetics() {
1235c5f28e2aSKamil Rytarowski   static llvm::once_flag g_initialize;
12367cb59e1aSEnrico Granata   static ConstString g_vectortypes("VectorTypes");
12377cb59e1aSEnrico Granata   static HardcodedFormatters::HardcodedSyntheticFinder g_formatters;
12387cb59e1aSEnrico Granata 
1239c5f28e2aSKamil Rytarowski   llvm::call_once(g_initialize, []() -> void {
1240b9c1b51eSKate Stone     g_formatters.push_back([](lldb_private::ValueObject &valobj,
124146fb5d5dSRaphael Isemann                               lldb::DynamicValueType, FormatManager &fmt_mgr)
124246fb5d5dSRaphael Isemann                                -> SyntheticChildren::SharedPointer {
1243b9c1b51eSKate Stone       static CXXSyntheticChildren::SharedPointer formatter_sp(
1244b9c1b51eSKate Stone           new CXXSyntheticChildren(
1245b9c1b51eSKate Stone               SyntheticChildren::Flags()
1246b9c1b51eSKate Stone                   .SetCascades(true)
1247b9c1b51eSKate Stone                   .SetSkipPointers(true)
1248b9c1b51eSKate Stone                   .SetSkipReferences(true)
1249b9c1b51eSKate Stone                   .SetNonCacheable(true),
12507cb59e1aSEnrico Granata               "vector_type synthetic children",
12517cb59e1aSEnrico Granata               lldb_private::formatters::VectorTypeSyntheticFrontEndCreator));
125203310c1eSRaphael Isemann       if (valobj.GetCompilerType().IsVectorType()) {
12537cb59e1aSEnrico Granata         if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
12547cb59e1aSEnrico Granata           return formatter_sp;
12557cb59e1aSEnrico Granata       }
12567cb59e1aSEnrico Granata       return nullptr;
12577cb59e1aSEnrico Granata     });
1258b9c1b51eSKate Stone     g_formatters.push_back([](lldb_private::ValueObject &valobj,
125946fb5d5dSRaphael Isemann                               lldb::DynamicValueType, FormatManager &fmt_mgr)
126046fb5d5dSRaphael Isemann                                -> SyntheticChildren::SharedPointer {
1261b9c1b51eSKate Stone       static CXXSyntheticChildren::SharedPointer formatter_sp(
1262b9c1b51eSKate Stone           new CXXSyntheticChildren(
1263b9c1b51eSKate Stone               SyntheticChildren::Flags()
1264b9c1b51eSKate Stone                   .SetCascades(true)
1265b9c1b51eSKate Stone                   .SetSkipPointers(true)
1266b9c1b51eSKate Stone                   .SetSkipReferences(true)
1267b9c1b51eSKate Stone                   .SetNonCacheable(true),
1268c530ba98SSean Callanan               "block pointer synthetic children",
1269c530ba98SSean Callanan               lldb_private::formatters::BlockPointerSyntheticFrontEndCreator));
127003310c1eSRaphael Isemann       if (valobj.GetCompilerType().IsBlockPointerType()) {
1271c530ba98SSean Callanan         return formatter_sp;
1272c530ba98SSean Callanan       }
1273c530ba98SSean Callanan       return nullptr;
1274c530ba98SSean Callanan     });
12757cb59e1aSEnrico Granata   });
12767cb59e1aSEnrico Granata 
12777cb59e1aSEnrico Granata   return g_formatters;
12787cb59e1aSEnrico Granata }
1279566afa0aSRaphael Isemann 
1280406ad187SJonas Devlieghere bool CPlusPlusLanguage::IsNilReference(ValueObject &valobj) {
1281406ad187SJonas Devlieghere   if (!Language::LanguageIsCPlusPlus(valobj.GetObjectRuntimeLanguage()) ||
1282406ad187SJonas Devlieghere       !valobj.IsPointerType())
1283406ad187SJonas Devlieghere     return false;
1284406ad187SJonas Devlieghere   bool canReadValue = true;
1285406ad187SJonas Devlieghere   bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;
1286406ad187SJonas Devlieghere   return canReadValue && isZero;
1287406ad187SJonas Devlieghere }
1288406ad187SJonas Devlieghere 
1289566afa0aSRaphael Isemann bool CPlusPlusLanguage::IsSourceFile(llvm::StringRef file_path) const {
1290566afa0aSRaphael Isemann   const auto suffixes = {".cpp", ".cxx", ".c++", ".cc",  ".c",
1291566afa0aSRaphael Isemann                          ".h",   ".hh",  ".hpp", ".hxx", ".h++"};
1292566afa0aSRaphael Isemann   for (auto suffix : suffixes) {
1293e50f9c41SMartin Storsjö     if (file_path.endswith_insensitive(suffix))
1294566afa0aSRaphael Isemann       return true;
1295566afa0aSRaphael Isemann   }
1296566afa0aSRaphael Isemann 
1297566afa0aSRaphael Isemann   // Check if we're in a STL path (where the files usually have no extension
1298566afa0aSRaphael Isemann   // that we could check for.
1299566afa0aSRaphael Isemann   return file_path.contains("/usr/include/c++/");
1300566afa0aSRaphael Isemann }
1301