1*bbd16815SEugene Zelenko //===-- CPlusPlusLanguage.cpp -----------------------------------*- C++ -*-===//
25f9d3106SEnrico Granata //
35f9d3106SEnrico Granata //                     The LLVM Compiler Infrastructure
45f9d3106SEnrico Granata //
55f9d3106SEnrico Granata // This file is distributed under the University of Illinois Open Source
65f9d3106SEnrico Granata // License. See LICENSE.TXT for details.
75f9d3106SEnrico Granata //
85f9d3106SEnrico Granata //===----------------------------------------------------------------------===//
95f9d3106SEnrico Granata 
105f9d3106SEnrico Granata #include "CPlusPlusLanguage.h"
115f9d3106SEnrico Granata 
12*bbd16815SEugene Zelenko // C Includes
13*bbd16815SEugene Zelenko // C++ Includes
14*bbd16815SEugene Zelenko #include <cstring>
15*bbd16815SEugene Zelenko #include <cctype>
16*bbd16815SEugene Zelenko #include <functional>
17*bbd16815SEugene Zelenko #include <mutex>
18aa816b8fSJim Ingham 
19*bbd16815SEugene Zelenko // Other libraries and framework includes
20aa816b8fSJim Ingham #include "llvm/ADT/StringRef.h"
21aa816b8fSJim Ingham 
22*bbd16815SEugene Zelenko // Project includes
235f9d3106SEnrico Granata #include "lldb/Core/ConstString.h"
245f9d3106SEnrico Granata #include "lldb/Core/PluginManager.h"
25aa816b8fSJim Ingham #include "lldb/Core/RegularExpression.h"
26aa816b8fSJim Ingham #include "lldb/Core/UniqueCStringMap.h"
277cb59e1aSEnrico Granata #include "lldb/DataFormatters/CXXFunctionPointer.h"
2833e97e63SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
2933e97e63SEnrico Granata #include "lldb/DataFormatters/FormattersHelpers.h"
307cb59e1aSEnrico Granata #include "lldb/DataFormatters/VectorType.h"
3133e97e63SEnrico Granata 
3233e97e63SEnrico Granata #include "CxxStringTypes.h"
3333e97e63SEnrico Granata #include "LibCxx.h"
3475995b5eSEnrico Granata #include "LibCxxAtomic.h"
3533e97e63SEnrico Granata #include "LibStdcpp.h"
3633e97e63SEnrico Granata 
375f9d3106SEnrico Granata using namespace lldb;
385f9d3106SEnrico Granata using namespace lldb_private;
3933e97e63SEnrico Granata using namespace lldb_private::formatters;
405f9d3106SEnrico Granata 
415f9d3106SEnrico Granata void
425f9d3106SEnrico Granata CPlusPlusLanguage::Initialize()
435f9d3106SEnrico Granata {
445f9d3106SEnrico Granata     PluginManager::RegisterPlugin (GetPluginNameStatic(),
455f9d3106SEnrico Granata                                    "C++ Language",
465f9d3106SEnrico Granata                                    CreateInstance);
475f9d3106SEnrico Granata }
485f9d3106SEnrico Granata 
495f9d3106SEnrico Granata void
505f9d3106SEnrico Granata CPlusPlusLanguage::Terminate()
515f9d3106SEnrico Granata {
525f9d3106SEnrico Granata     PluginManager::UnregisterPlugin (CreateInstance);
535f9d3106SEnrico Granata }
545f9d3106SEnrico Granata 
555f9d3106SEnrico Granata lldb_private::ConstString
565f9d3106SEnrico Granata CPlusPlusLanguage::GetPluginNameStatic()
575f9d3106SEnrico Granata {
585f9d3106SEnrico Granata     static ConstString g_name("cplusplus");
595f9d3106SEnrico Granata     return g_name;
605f9d3106SEnrico Granata }
615f9d3106SEnrico Granata 
625f9d3106SEnrico Granata //------------------------------------------------------------------
635f9d3106SEnrico Granata // PluginInterface protocol
645f9d3106SEnrico Granata //------------------------------------------------------------------
65*bbd16815SEugene Zelenko 
665f9d3106SEnrico Granata lldb_private::ConstString
675f9d3106SEnrico Granata CPlusPlusLanguage::GetPluginName()
685f9d3106SEnrico Granata {
695f9d3106SEnrico Granata     return GetPluginNameStatic();
705f9d3106SEnrico Granata }
715f9d3106SEnrico Granata 
725f9d3106SEnrico Granata uint32_t
735f9d3106SEnrico Granata CPlusPlusLanguage::GetPluginVersion()
745f9d3106SEnrico Granata {
755f9d3106SEnrico Granata     return 1;
765f9d3106SEnrico Granata }
775f9d3106SEnrico Granata 
785f9d3106SEnrico Granata //------------------------------------------------------------------
795f9d3106SEnrico Granata // Static Functions
805f9d3106SEnrico Granata //------------------------------------------------------------------
81*bbd16815SEugene Zelenko 
825f9d3106SEnrico Granata Language *
835f9d3106SEnrico Granata CPlusPlusLanguage::CreateInstance (lldb::LanguageType language)
845f9d3106SEnrico Granata {
85578c8a78SEnrico Granata     if (Language::LanguageIsCPlusPlus(language))
865f9d3106SEnrico Granata         return new CPlusPlusLanguage();
875f9d3106SEnrico Granata     return nullptr;
885f9d3106SEnrico Granata }
89aa816b8fSJim Ingham 
90aa816b8fSJim Ingham void
91aa816b8fSJim Ingham CPlusPlusLanguage::MethodName::Clear()
92aa816b8fSJim Ingham {
93aa816b8fSJim Ingham     m_full.Clear();
94aa816b8fSJim Ingham     m_basename = llvm::StringRef();
95aa816b8fSJim Ingham     m_context = llvm::StringRef();
96aa816b8fSJim Ingham     m_arguments = llvm::StringRef();
97aa816b8fSJim Ingham     m_qualifiers = llvm::StringRef();
98aa816b8fSJim Ingham     m_type = eTypeInvalid;
99aa816b8fSJim Ingham     m_parsed = false;
100aa816b8fSJim Ingham     m_parse_error = false;
101aa816b8fSJim Ingham }
102aa816b8fSJim Ingham 
103aa816b8fSJim Ingham bool
104aa816b8fSJim Ingham ReverseFindMatchingChars (const llvm::StringRef &s,
105aa816b8fSJim Ingham                           const llvm::StringRef &left_right_chars,
106aa816b8fSJim Ingham                           size_t &left_pos,
107aa816b8fSJim Ingham                           size_t &right_pos,
108aa816b8fSJim Ingham                           size_t pos = llvm::StringRef::npos)
109aa816b8fSJim Ingham {
110aa816b8fSJim Ingham     assert (left_right_chars.size() == 2);
111aa816b8fSJim Ingham     left_pos = llvm::StringRef::npos;
112aa816b8fSJim Ingham     const char left_char = left_right_chars[0];
113aa816b8fSJim Ingham     const char right_char = left_right_chars[1];
114aa816b8fSJim Ingham     pos = s.find_last_of(left_right_chars, pos);
115aa816b8fSJim Ingham     if (pos == llvm::StringRef::npos || s[pos] == left_char)
116aa816b8fSJim Ingham         return false;
117aa816b8fSJim Ingham     right_pos = pos;
118aa816b8fSJim Ingham     uint32_t depth = 1;
119aa816b8fSJim Ingham     while (pos > 0 && depth > 0)
120aa816b8fSJim Ingham     {
121aa816b8fSJim Ingham         pos = s.find_last_of(left_right_chars, pos);
122aa816b8fSJim Ingham         if (pos == llvm::StringRef::npos)
123aa816b8fSJim Ingham             return false;
124aa816b8fSJim Ingham         if (s[pos] == left_char)
125aa816b8fSJim Ingham         {
126aa816b8fSJim Ingham             if (--depth == 0)
127aa816b8fSJim Ingham             {
128aa816b8fSJim Ingham                 left_pos = pos;
129aa816b8fSJim Ingham                 return left_pos < right_pos;
130aa816b8fSJim Ingham             }
131aa816b8fSJim Ingham         }
132aa816b8fSJim Ingham         else if (s[pos] == right_char)
133aa816b8fSJim Ingham         {
134aa816b8fSJim Ingham             ++depth;
135aa816b8fSJim Ingham         }
136aa816b8fSJim Ingham     }
137aa816b8fSJim Ingham     return false;
138aa816b8fSJim Ingham }
139aa816b8fSJim Ingham 
1409fa11470STamas Berghammer static bool
1419fa11470STamas Berghammer IsValidBasename(const llvm::StringRef& basename)
1429fa11470STamas Berghammer {
1439fa11470STamas Berghammer     // Check that the basename matches with the following regular expression or is an operator name:
1449fa11470STamas Berghammer     // "^~?([A-Za-z_][A-Za-z_0-9]*)(<.*>)?$"
1459fa11470STamas Berghammer     // We are using a hand written implementation because it is significantly more efficient then
1469fa11470STamas Berghammer     // using the general purpose 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] != '_')
1559fa11470STamas Berghammer         return false; // First charater (after removing the possible '~'') isn't in [A-Za-z_]
1569fa11470STamas Berghammer 
1579fa11470STamas Berghammer     // Read all characters matching [A-Za-z_0-9]
1589fa11470STamas Berghammer     ++idx;
1599fa11470STamas Berghammer     while (idx < basename.size())
1609fa11470STamas Berghammer     {
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.
1679fa11470STamas Berghammer     if (idx == basename.size())
1689fa11470STamas Berghammer         return true;
1699fa11470STamas Berghammer 
1709fa11470STamas Berghammer     // Check for basename with template arguments
1719fa11470STamas Berghammer     // TODO: Improve the quality of the validation with validating the template arguments
1729fa11470STamas Berghammer     if (basename[idx] == '<' && basename.back() == '>')
1739fa11470STamas Berghammer         return true;
1749fa11470STamas Berghammer 
1759fa11470STamas Berghammer     // Check if the basename is a vaild C++ operator name
1769fa11470STamas Berghammer     if (!basename.startswith("operator"))
1779fa11470STamas Berghammer         return false;
1789fa11470STamas Berghammer 
1799fa11470STamas Berghammer     static RegularExpression g_operator_regex("^(operator)( ?)([A-Za-z_][A-Za-z_0-9]*|\\(\\)|\\[\\]|[\\^<>=!\\/*+-]+)(<.*>)?(\\[\\])?$");
1809fa11470STamas Berghammer     std::string basename_str(basename.str());
1819fa11470STamas Berghammer     return g_operator_regex.Execute(basename_str.c_str(), nullptr);
1829fa11470STamas Berghammer }
183aa816b8fSJim Ingham 
184aa816b8fSJim Ingham void
185aa816b8fSJim Ingham CPlusPlusLanguage::MethodName::Parse()
186aa816b8fSJim Ingham {
187aa816b8fSJim Ingham     if (!m_parsed && m_full)
188aa816b8fSJim Ingham     {
189aa816b8fSJim Ingham //        ConstString mangled;
190aa816b8fSJim Ingham //        m_full.GetMangledCounterpart(mangled);
191aa816b8fSJim Ingham //        printf ("\n   parsing = '%s'\n", m_full.GetCString());
192aa816b8fSJim Ingham //        if (mangled)
193aa816b8fSJim Ingham //            printf ("   mangled = '%s'\n", mangled.GetCString());
194aa816b8fSJim Ingham         m_parse_error = false;
195aa816b8fSJim Ingham         m_parsed = true;
196aa816b8fSJim Ingham         llvm::StringRef full (m_full.GetCString());
197aa816b8fSJim Ingham 
198aa816b8fSJim Ingham         size_t arg_start, arg_end;
199aa816b8fSJim Ingham         llvm::StringRef parens("()", 2);
200aa816b8fSJim Ingham         if (ReverseFindMatchingChars (full, parens, arg_start, arg_end))
201aa816b8fSJim Ingham         {
202aa816b8fSJim Ingham             m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
203aa816b8fSJim Ingham             if (arg_end + 1 < full.size())
204aa816b8fSJim Ingham                 m_qualifiers = full.substr(arg_end + 1);
205aa816b8fSJim Ingham             if (arg_start > 0)
206aa816b8fSJim Ingham             {
207aa816b8fSJim Ingham                 size_t basename_end = arg_start;
208aa816b8fSJim Ingham                 size_t context_start = 0;
209aa816b8fSJim Ingham                 size_t context_end = llvm::StringRef::npos;
210aa816b8fSJim Ingham                 if (basename_end > 0 && full[basename_end-1] == '>')
211aa816b8fSJim Ingham                 {
212aa816b8fSJim Ingham                     // TODO: handle template junk...
213aa816b8fSJim Ingham                     // Templated function
214aa816b8fSJim Ingham                     size_t template_start, template_end;
215aa816b8fSJim Ingham                     llvm::StringRef lt_gt("<>", 2);
216aa816b8fSJim Ingham                     if (ReverseFindMatchingChars (full, lt_gt, template_start, template_end, basename_end))
217aa816b8fSJim Ingham                     {
218aa816b8fSJim Ingham                         // Check for templated functions that include return type like: 'void foo<Int>()'
219aa816b8fSJim Ingham                         context_start = full.rfind(' ', template_start);
220aa816b8fSJim Ingham                         if (context_start == llvm::StringRef::npos)
221aa816b8fSJim Ingham                             context_start = 0;
222aa816b8fSJim Ingham 
223aa816b8fSJim Ingham                         context_end = full.rfind(':', template_start);
224aa816b8fSJim Ingham                         if (context_end == llvm::StringRef::npos || context_end < context_start)
225aa816b8fSJim Ingham                             context_end = context_start;
226aa816b8fSJim Ingham                     }
227aa816b8fSJim Ingham                     else
228aa816b8fSJim Ingham                     {
229aa816b8fSJim Ingham                         context_end = full.rfind(':', basename_end);
230aa816b8fSJim Ingham                     }
231aa816b8fSJim Ingham                 }
232aa816b8fSJim Ingham                 else if (context_end == llvm::StringRef::npos)
233aa816b8fSJim Ingham                 {
234aa816b8fSJim Ingham                     context_end = full.rfind(':', basename_end);
235aa816b8fSJim Ingham                 }
236aa816b8fSJim Ingham 
237aa816b8fSJim Ingham                 if (context_end == llvm::StringRef::npos)
238aa816b8fSJim Ingham                     m_basename = full.substr(0, basename_end);
239aa816b8fSJim Ingham                 else
240aa816b8fSJim Ingham                 {
241aa816b8fSJim Ingham                     if (context_start < context_end)
242aa816b8fSJim Ingham                         m_context = full.substr(context_start, context_end - 1);
243aa816b8fSJim Ingham                     const size_t basename_begin = context_end + 1;
244aa816b8fSJim Ingham                     m_basename = full.substr(basename_begin, basename_end - basename_begin);
245aa816b8fSJim Ingham                 }
246aa816b8fSJim Ingham                 m_type = eTypeUnknownMethod;
247aa816b8fSJim Ingham             }
248aa816b8fSJim Ingham             else
249aa816b8fSJim Ingham             {
250aa816b8fSJim Ingham                 m_parse_error = true;
251aa816b8fSJim Ingham                 return;
252aa816b8fSJim Ingham             }
253aa816b8fSJim Ingham 
2549fa11470STamas Berghammer             if (!IsValidBasename(m_basename))
255aa816b8fSJim Ingham             {
256aa816b8fSJim Ingham                 // The C++ basename doesn't match our regular expressions so this can't
257aa816b8fSJim Ingham                 // be a valid C++ method, clear everything out and indicate an error
258aa816b8fSJim Ingham                 m_context = llvm::StringRef();
259aa816b8fSJim Ingham                 m_basename = llvm::StringRef();
260aa816b8fSJim Ingham                 m_arguments = llvm::StringRef();
261aa816b8fSJim Ingham                 m_qualifiers = llvm::StringRef();
262aa816b8fSJim Ingham                 m_parse_error = true;
263aa816b8fSJim Ingham             }
264aa816b8fSJim Ingham         }
265aa816b8fSJim Ingham         else
266aa816b8fSJim Ingham         {
267aa816b8fSJim Ingham             m_parse_error = true;
268aa816b8fSJim Ingham         }
269aa816b8fSJim Ingham     }
270aa816b8fSJim Ingham }
271aa816b8fSJim Ingham 
272aa816b8fSJim Ingham llvm::StringRef
273aa816b8fSJim Ingham CPlusPlusLanguage::MethodName::GetBasename ()
274aa816b8fSJim Ingham {
275aa816b8fSJim Ingham     if (!m_parsed)
276aa816b8fSJim Ingham         Parse();
277aa816b8fSJim Ingham     return m_basename;
278aa816b8fSJim Ingham }
279aa816b8fSJim Ingham 
280aa816b8fSJim Ingham llvm::StringRef
281aa816b8fSJim Ingham CPlusPlusLanguage::MethodName::GetContext ()
282aa816b8fSJim Ingham {
283aa816b8fSJim Ingham     if (!m_parsed)
284aa816b8fSJim Ingham         Parse();
285aa816b8fSJim Ingham     return m_context;
286aa816b8fSJim Ingham }
287aa816b8fSJim Ingham 
288aa816b8fSJim Ingham llvm::StringRef
289aa816b8fSJim Ingham CPlusPlusLanguage::MethodName::GetArguments ()
290aa816b8fSJim Ingham {
291aa816b8fSJim Ingham     if (!m_parsed)
292aa816b8fSJim Ingham         Parse();
293aa816b8fSJim Ingham     return m_arguments;
294aa816b8fSJim Ingham }
295aa816b8fSJim Ingham 
296aa816b8fSJim Ingham llvm::StringRef
297aa816b8fSJim Ingham CPlusPlusLanguage::MethodName::GetQualifiers ()
298aa816b8fSJim Ingham {
299aa816b8fSJim Ingham     if (!m_parsed)
300aa816b8fSJim Ingham         Parse();
301aa816b8fSJim Ingham     return m_qualifiers;
302aa816b8fSJim Ingham }
303aa816b8fSJim Ingham 
3049293fc41SSiva Chandra std::string
3059293fc41SSiva Chandra CPlusPlusLanguage::MethodName::GetScopeQualifiedName ()
3069293fc41SSiva Chandra {
3079293fc41SSiva Chandra     if (!m_parsed)
3089293fc41SSiva Chandra         Parse();
3099293fc41SSiva Chandra     if (m_basename.empty() || m_context.empty())
3109293fc41SSiva Chandra         return std::string();
3119293fc41SSiva Chandra 
3129293fc41SSiva Chandra     std::string res;
3139293fc41SSiva Chandra     res += m_context;
3149293fc41SSiva Chandra     res += "::";
3159293fc41SSiva Chandra     res += m_basename;
3169293fc41SSiva Chandra 
3179293fc41SSiva Chandra     return res;
3189293fc41SSiva Chandra }
3199293fc41SSiva Chandra 
320aa816b8fSJim Ingham bool
321aa816b8fSJim Ingham CPlusPlusLanguage::IsCPPMangledName (const char *name)
322aa816b8fSJim Ingham {
323aa816b8fSJim Ingham     // FIXME, we should really run through all the known C++ Language plugins and ask each one if
324aa816b8fSJim Ingham     // this is a C++ mangled name, but we can put that off till there is actually more than one
325aa816b8fSJim Ingham     // we care about.
326aa816b8fSJim Ingham 
327*bbd16815SEugene Zelenko     return (name != nullptr && name[0] == '_' && name[1] == 'Z');
328aa816b8fSJim Ingham }
329aa816b8fSJim Ingham 
330aa816b8fSJim Ingham bool
331aa816b8fSJim Ingham CPlusPlusLanguage::ExtractContextAndIdentifier (const char *name, llvm::StringRef &context, llvm::StringRef &identifier)
332aa816b8fSJim Ingham {
333aa816b8fSJim Ingham     static RegularExpression g_basename_regex("^(([A-Za-z_][A-Za-z_0-9]*::)*)([A-Za-z_][A-Za-z_0-9]*)$");
334aa816b8fSJim Ingham     RegularExpression::Match match(4);
335aa816b8fSJim Ingham     if (g_basename_regex.Execute (name, &match))
336aa816b8fSJim Ingham     {
337aa816b8fSJim Ingham         match.GetMatchAtIndex(name, 1, context);
338aa816b8fSJim Ingham         match.GetMatchAtIndex(name, 3, identifier);
339aa816b8fSJim Ingham         return true;
340aa816b8fSJim Ingham     }
341aa816b8fSJim Ingham     return false;
342aa816b8fSJim Ingham }
343aa816b8fSJim Ingham 
344aa816b8fSJim Ingham class CPPRuntimeEquivalents
345aa816b8fSJim Ingham {
346aa816b8fSJim Ingham public:
347aa816b8fSJim Ingham     CPPRuntimeEquivalents ()
348aa816b8fSJim Ingham     {
349aa816b8fSJim Ingham         m_impl.Append(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >").AsCString(), ConstString("basic_string<char>"));
350aa816b8fSJim Ingham 
351aa816b8fSJim Ingham         // these two (with a prefixed std::) occur when c++stdlib string class occurs as a template argument in some STL container
352aa816b8fSJim Ingham         m_impl.Append(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >").AsCString(), ConstString("std::basic_string<char>"));
353aa816b8fSJim Ingham 
354aa816b8fSJim Ingham         m_impl.Sort();
355aa816b8fSJim Ingham     }
356aa816b8fSJim Ingham 
357aa816b8fSJim Ingham     void
358aa816b8fSJim Ingham     Add (ConstString& type_name,
359aa816b8fSJim Ingham          ConstString& type_equivalent)
360aa816b8fSJim Ingham     {
361aa816b8fSJim Ingham         m_impl.Insert(type_name.AsCString(), type_equivalent);
362aa816b8fSJim Ingham     }
363aa816b8fSJim Ingham 
364aa816b8fSJim Ingham     uint32_t
365aa816b8fSJim Ingham     FindExactMatches (ConstString& type_name,
366aa816b8fSJim Ingham                       std::vector<ConstString>& equivalents)
367aa816b8fSJim Ingham     {
368aa816b8fSJim Ingham         uint32_t count = 0;
369aa816b8fSJim Ingham 
370aa816b8fSJim Ingham         for (ImplData match = m_impl.FindFirstValueForName(type_name.AsCString());
371*bbd16815SEugene Zelenko              match != nullptr;
372aa816b8fSJim Ingham              match = m_impl.FindNextValueForName(match))
373aa816b8fSJim Ingham         {
374aa816b8fSJim Ingham             equivalents.push_back(match->value);
375aa816b8fSJim Ingham             count++;
376aa816b8fSJim Ingham         }
377aa816b8fSJim Ingham 
378aa816b8fSJim Ingham         return count;
379aa816b8fSJim Ingham     }
380aa816b8fSJim Ingham 
381aa816b8fSJim Ingham     // partial matches can occur when a name with equivalents is a template argument.
382aa816b8fSJim Ingham     // e.g. we may have "class Foo" be a match for "struct Bar". if we have a typename
383aa816b8fSJim Ingham     // such as "class Templatized<class Foo, Anything>" we want this to be replaced with
384aa816b8fSJim Ingham     // "class Templatized<struct Bar, Anything>". Since partial matching is time consuming
385aa816b8fSJim Ingham     // once we get a partial match, we add it to the exact matches list for faster retrieval
386aa816b8fSJim Ingham     uint32_t
387aa816b8fSJim Ingham     FindPartialMatches (ConstString& type_name,
388aa816b8fSJim Ingham                         std::vector<ConstString>& equivalents)
389aa816b8fSJim Ingham     {
390aa816b8fSJim Ingham         uint32_t count = 0;
391aa816b8fSJim Ingham 
392aa816b8fSJim Ingham         const char* type_name_cstr = type_name.AsCString();
393aa816b8fSJim Ingham 
394aa816b8fSJim Ingham         size_t items_count = m_impl.GetSize();
395aa816b8fSJim Ingham 
396aa816b8fSJim Ingham         for (size_t item = 0; item < items_count; item++)
397aa816b8fSJim Ingham         {
398aa816b8fSJim Ingham             const char* key_cstr = m_impl.GetCStringAtIndex(item);
399aa816b8fSJim Ingham             if ( strstr(type_name_cstr,key_cstr) )
400aa816b8fSJim Ingham             {
401aa816b8fSJim Ingham                 count += AppendReplacements(type_name_cstr,
402aa816b8fSJim Ingham                                             key_cstr,
403aa816b8fSJim Ingham                                             equivalents);
404aa816b8fSJim Ingham             }
405aa816b8fSJim Ingham         }
406aa816b8fSJim Ingham 
407aa816b8fSJim Ingham         return count;
408aa816b8fSJim Ingham     }
409aa816b8fSJim Ingham 
410aa816b8fSJim Ingham private:
411aa816b8fSJim Ingham     std::string& replace (std::string& target,
412aa816b8fSJim Ingham                           std::string& pattern,
413aa816b8fSJim Ingham                           std::string& with)
414aa816b8fSJim Ingham     {
415aa816b8fSJim Ingham         size_t pos;
416aa816b8fSJim Ingham         size_t pattern_len = pattern.size();
417aa816b8fSJim Ingham 
418aa816b8fSJim Ingham         while ( (pos = target.find(pattern)) != std::string::npos )
419aa816b8fSJim Ingham             target.replace(pos, pattern_len, with);
420aa816b8fSJim Ingham 
421aa816b8fSJim Ingham         return target;
422aa816b8fSJim Ingham     }
423aa816b8fSJim Ingham 
424aa816b8fSJim Ingham     uint32_t
425aa816b8fSJim Ingham     AppendReplacements (const char* original,
426aa816b8fSJim Ingham                         const char *matching_key,
427aa816b8fSJim Ingham                         std::vector<ConstString>& equivalents)
428aa816b8fSJim Ingham     {
429aa816b8fSJim Ingham         std::string matching_key_str(matching_key);
430aa816b8fSJim Ingham         ConstString original_const(original);
431aa816b8fSJim Ingham 
432aa816b8fSJim Ingham         uint32_t count = 0;
433aa816b8fSJim Ingham 
434aa816b8fSJim Ingham         for (ImplData match = m_impl.FindFirstValueForName(matching_key);
435*bbd16815SEugene Zelenko              match != nullptr;
436aa816b8fSJim Ingham              match = m_impl.FindNextValueForName(match))
437aa816b8fSJim Ingham         {
438aa816b8fSJim Ingham             std::string target(original);
439aa816b8fSJim Ingham             std::string equiv_class(match->value.AsCString());
440aa816b8fSJim Ingham 
441aa816b8fSJim Ingham             replace (target, matching_key_str, equiv_class);
442aa816b8fSJim Ingham 
443aa816b8fSJim Ingham             ConstString target_const(target.c_str());
444aa816b8fSJim Ingham 
445aa816b8fSJim Ingham // you will most probably want to leave this off since it might make this map grow indefinitely
446aa816b8fSJim Ingham #ifdef ENABLE_CPP_EQUIVALENTS_MAP_TO_GROW
447aa816b8fSJim Ingham             Add(original_const, target_const);
448aa816b8fSJim Ingham #endif
449aa816b8fSJim Ingham             equivalents.push_back(target_const);
450aa816b8fSJim Ingham 
451aa816b8fSJim Ingham             count++;
452aa816b8fSJim Ingham         }
453aa816b8fSJim Ingham 
454aa816b8fSJim Ingham         return count;
455aa816b8fSJim Ingham     }
456aa816b8fSJim Ingham 
457aa816b8fSJim Ingham     typedef UniqueCStringMap<ConstString> Impl;
458aa816b8fSJim Ingham     typedef const Impl::Entry* ImplData;
459aa816b8fSJim Ingham     Impl m_impl;
460aa816b8fSJim Ingham };
461aa816b8fSJim Ingham 
462aa816b8fSJim Ingham static CPPRuntimeEquivalents&
463aa816b8fSJim Ingham GetEquivalentsMap ()
464aa816b8fSJim Ingham {
465aa816b8fSJim Ingham     static CPPRuntimeEquivalents g_equivalents_map;
466aa816b8fSJim Ingham     return g_equivalents_map;
467aa816b8fSJim Ingham }
468aa816b8fSJim Ingham 
469aa816b8fSJim Ingham uint32_t
470aa816b8fSJim Ingham CPlusPlusLanguage::FindEquivalentNames(ConstString type_name, std::vector<ConstString>& equivalents)
471aa816b8fSJim Ingham {
472aa816b8fSJim Ingham     uint32_t count = GetEquivalentsMap().FindExactMatches(type_name, equivalents);
473aa816b8fSJim Ingham 
474aa816b8fSJim Ingham     bool might_have_partials=
475aa816b8fSJim Ingham         ( count == 0 )  // if we have a full name match just use it
476*bbd16815SEugene Zelenko         && (strchr(type_name.AsCString(), '<') != nullptr  // we should only have partial matches when templates are involved, check that we have
477*bbd16815SEugene Zelenko             && strchr(type_name.AsCString(), '>') != nullptr); // angle brackets in the type_name before trying to scan for partial matches
478aa816b8fSJim Ingham 
479aa816b8fSJim Ingham     if ( might_have_partials )
480aa816b8fSJim Ingham         count = GetEquivalentsMap().FindPartialMatches(type_name, equivalents);
481aa816b8fSJim Ingham 
482aa816b8fSJim Ingham     return count;
483aa816b8fSJim Ingham }
484aa816b8fSJim Ingham 
48533e97e63SEnrico Granata static void
48633e97e63SEnrico Granata LoadLibCxxFormatters (lldb::TypeCategoryImplSP cpp_category_sp)
48733e97e63SEnrico Granata {
48833e97e63SEnrico Granata     if (!cpp_category_sp)
48933e97e63SEnrico Granata         return;
49033e97e63SEnrico Granata 
49133e97e63SEnrico Granata     TypeSummaryImpl::Flags stl_summary_flags;
49233e97e63SEnrico Granata     stl_summary_flags.SetCascades(true)
49333e97e63SEnrico Granata     .SetSkipPointers(false)
49433e97e63SEnrico Granata     .SetSkipReferences(false)
49533e97e63SEnrico Granata     .SetDontShowChildren(true)
49633e97e63SEnrico Granata     .SetDontShowValue(true)
49733e97e63SEnrico Granata     .SetShowMembersOneLiner(false)
49833e97e63SEnrico Granata     .SetHideItemNames(false);
49933e97e63SEnrico Granata 
50033e97e63SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
50133e97e63SEnrico Granata     lldb::TypeSummaryImplSP std_string_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxStringSummaryProvider, "std::string summary provider"));
50233e97e63SEnrico Granata     lldb::TypeSummaryImplSP std_wstring_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxWStringSummaryProvider, "std::wstring summary provider"));
50333e97e63SEnrico Granata 
50433e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::string"),
50533e97e63SEnrico Granata                                                          std_string_summary_sp);
50633e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >"),
50733e97e63SEnrico Granata                                                          std_string_summary_sp);
50833e97e63SEnrico Granata 
50933e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::wstring"),
51033e97e63SEnrico Granata                                                          std_wstring_summary_sp);
51133e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >"),
51233e97e63SEnrico Granata                                                          std_wstring_summary_sp);
51333e97e63SEnrico Granata 
51433e97e63SEnrico Granata     SyntheticChildren::Flags stl_synth_flags;
51533e97e63SEnrico Granata     stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
51633e97e63SEnrico Granata 
51733e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator, "libc++ std::vector synthetic children", ConstString("^std::__1::vector<.+>(( )?&)?$"), stl_synth_flags, true);
51833e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator, "libc++ std::list synthetic children", ConstString("^std::__1::list<.+>(( )?&)?$"), stl_synth_flags, true);
51933e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::map synthetic children", ConstString("^std::__1::map<.+> >(( )?&)?$"), stl_synth_flags, true);
52033e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__1::vector<std::__1::allocator<bool> >"), stl_synth_flags);
52133e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_synth_flags);
52233e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::set synthetic children", ConstString("^std::__1::set<.+> >(( )?&)?$"), stl_synth_flags, true);
52333e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::multiset synthetic children", ConstString("^std::__1::multiset<.+> >(( )?&)?$"), stl_synth_flags, true);
52433e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::multimap synthetic children", ConstString("^std::__1::multimap<.+> >(( )?&)?$"), stl_synth_flags, true);
52533e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator, "libc++ std::unordered containers synthetic children", ConstString("^(std::__1::)unordered_(multi)?(map|set)<.+> >$"), stl_synth_flags, true);
52633e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator, "libc++ std::initializer_list synthetic children", ConstString("^std::initializer_list<.+>(( )?&)?$"), stl_synth_flags, true);
52775995b5eSEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator, "libc++ std::atomic synthetic children", ConstString("^std::__1::atomic<.+>$"), stl_synth_flags, true);
52833e97e63SEnrico Granata 
52933e97e63SEnrico Granata     cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)deque<.+>(( )?&)?$")),
53033e97e63SEnrico Granata                                                                SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
53133e97e63SEnrico Granata                                                                                                                  "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
53233e97e63SEnrico Granata 
53333e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, "shared_ptr synthetic children", ConstString("^(std::__1::)shared_ptr<.+>(( )?&)?$"), stl_synth_flags, true);
53433e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, "weak_ptr synthetic children", ConstString("^(std::__1::)weak_ptr<.+>(( )?&)?$"), stl_synth_flags, true);
53533e97e63SEnrico Granata 
53633e97e63SEnrico Granata     stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(false);
53733e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_synth_flags);
53833e97e63SEnrico Granata 
53933e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector summary provider", ConstString("^std::__1::vector<.+>(( )?&)?$"), stl_summary_flags, true);
54033e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::list summary provider", ConstString("^std::__1::list<.+>(( )?&)?$"), stl_summary_flags, true);
54133e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::map summary provider", ConstString("^std::__1::map<.+>(( )?&)?$"), stl_summary_flags, true);
54233e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::deque summary provider", ConstString("^std::__1::deque<.+>(( )?&)?$"), stl_summary_flags, true);
54333e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__1::vector<std::__1::allocator<bool> >"), stl_summary_flags);
54433e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_summary_flags);
54533e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::set summary provider", ConstString("^std::__1::set<.+>(( )?&)?$"), stl_summary_flags, true);
54633e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::multiset summary provider", ConstString("^std::__1::multiset<.+>(( )?&)?$"), stl_summary_flags, true);
54733e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::multimap summary provider", ConstString("^std::__1::multimap<.+>(( )?&)?$"), stl_summary_flags, true);
54833e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::unordered containers summary provider", ConstString("^(std::__1::)unordered_(multi)?(map|set)<.+> >$"), stl_summary_flags, true);
54975995b5eSEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibCxxAtomicSummaryProvider, "libc++ std::atomic summary provider", ConstString("^std::__1::atomic<.+>$"), stl_summary_flags, true);
55033e97e63SEnrico Granata 
55133e97e63SEnrico Granata     stl_summary_flags.SetSkipPointers(true);
55233e97e63SEnrico Granata 
55333e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxSmartPointerSummaryProvider, "libc++ std::shared_ptr summary provider", ConstString("^std::__1::shared_ptr<.+>(( )?&)?$"), stl_summary_flags, true);
55433e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxSmartPointerSummaryProvider, "libc++ std::weak_ptr summary provider", ConstString("^std::__1::weak_ptr<.+>(( )?&)?$"), stl_summary_flags, true);
55533e97e63SEnrico Granata 
55633e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator, "std::vector iterator synthetic children", ConstString("^std::__1::__wrap_iter<.+>$"), stl_synth_flags, true);
55733e97e63SEnrico Granata 
55833e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_summary_flags);
55933e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator, "std::map iterator synthetic children", ConstString("^std::__1::__map_iterator<.+>$"), stl_synth_flags, true);
56033e97e63SEnrico Granata #endif
56133e97e63SEnrico Granata }
56233e97e63SEnrico Granata 
56333e97e63SEnrico Granata static void
56433e97e63SEnrico Granata LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
56533e97e63SEnrico Granata {
56633e97e63SEnrico Granata     if (!cpp_category_sp)
56733e97e63SEnrico Granata         return;
56833e97e63SEnrico Granata 
56933e97e63SEnrico Granata     TypeSummaryImpl::Flags stl_summary_flags;
57033e97e63SEnrico Granata     stl_summary_flags.SetCascades(true)
57133e97e63SEnrico Granata     .SetSkipPointers(false)
57233e97e63SEnrico Granata     .SetSkipReferences(false)
57333e97e63SEnrico Granata     .SetDontShowChildren(true)
57433e97e63SEnrico Granata     .SetDontShowValue(true)
57533e97e63SEnrico Granata     .SetShowMembersOneLiner(false)
57633e97e63SEnrico Granata     .SetHideItemNames(false);
57733e97e63SEnrico Granata 
57833e97e63SEnrico Granata     lldb::TypeSummaryImplSP std_string_summary_sp(new StringSummaryFormat(stl_summary_flags,
57933e97e63SEnrico Granata                                                                           "${var._M_dataplus._M_p}"));
58033e97e63SEnrico Granata 
58182ffb8e9STodd Fiala     lldb::TypeSummaryImplSP cxx11_string_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags,
58282ffb8e9STodd Fiala                                                                                  LibStdcppStringSummaryProvider,
58382ffb8e9STodd Fiala                                                                                  "libstdc++ c++11 std::string summary provider"));
58482ffb8e9STodd Fiala     lldb::TypeSummaryImplSP cxx11_wstring_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags,
58582ffb8e9STodd Fiala                                                                                  LibStdcppWStringSummaryProvider,
58682ffb8e9STodd Fiala                                                                                  "libstdc++ c++11 std::wstring summary provider"));
58782ffb8e9STodd Fiala 
58833e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::string"),
58933e97e63SEnrico Granata                                                       std_string_summary_sp);
59033e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char>"),
59133e97e63SEnrico Granata                                                       std_string_summary_sp);
59233e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char,std::char_traits<char>,std::allocator<char> >"),
59333e97e63SEnrico Granata                                                       std_string_summary_sp);
59433e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
59533e97e63SEnrico Granata                                                       std_string_summary_sp);
59633e97e63SEnrico Granata 
59782ffb8e9STodd Fiala     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__cxx11::string"),
59882ffb8e9STodd Fiala                                                       cxx11_string_summary_sp);
59982ffb8e9STodd Fiala     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
60082ffb8e9STodd Fiala                                                       cxx11_string_summary_sp);
60182ffb8e9STodd Fiala 
60233e97e63SEnrico Granata     // making sure we force-pick the summary for printing wstring (_M_p is a wchar_t*)
60333e97e63SEnrico Granata     lldb::TypeSummaryImplSP std_wstring_summary_sp(new StringSummaryFormat(stl_summary_flags,
60433e97e63SEnrico Granata                                                                            "${var._M_dataplus._M_p%S}"));
60533e97e63SEnrico Granata 
60633e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::wstring"),
60733e97e63SEnrico Granata                                                       std_wstring_summary_sp);
60833e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t>"),
60933e97e63SEnrico Granata                                                       std_wstring_summary_sp);
61033e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >"),
61133e97e63SEnrico Granata                                                       std_wstring_summary_sp);
61233e97e63SEnrico Granata     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >"),
61333e97e63SEnrico Granata                                                       std_wstring_summary_sp);
61433e97e63SEnrico Granata 
61582ffb8e9STodd Fiala     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__cxx11::wstring"),
61682ffb8e9STodd Fiala                                                       cxx11_wstring_summary_sp);
61782ffb8e9STodd Fiala     cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >"),
61882ffb8e9STodd Fiala                                                       cxx11_wstring_summary_sp);
61933e97e63SEnrico Granata 
62033e97e63SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
62133e97e63SEnrico Granata 
62233e97e63SEnrico Granata     SyntheticChildren::Flags stl_synth_flags;
62333e97e63SEnrico Granata     stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
62433e97e63SEnrico Granata 
62533e97e63SEnrico Granata     cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")),
62633e97e63SEnrico Granata                                                             SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
62733e97e63SEnrico Granata                                                                                                               "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
62833e97e63SEnrico Granata     cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")),
62933e97e63SEnrico Granata                                                             SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
63033e97e63SEnrico Granata                                                                                                               "lldb.formatters.cpp.gnu_libstdcpp.StdMapSynthProvider")));
63182ffb8e9STodd Fiala     cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$")),
63233e97e63SEnrico Granata                                                             SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
63333e97e63SEnrico Granata                                                                                                               "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
63433e97e63SEnrico Granata     stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(true);
63533e97e63SEnrico Granata     cpp_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")),
63633e97e63SEnrico Granata                                                            TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags,
63733e97e63SEnrico Granata                                                                                                      "size=${svar%#}")));
63833e97e63SEnrico Granata     cpp_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")),
63933e97e63SEnrico Granata                                                            TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags,
64033e97e63SEnrico Granata                                                                                                      "size=${svar%#}")));
64182ffb8e9STodd Fiala     cpp_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$")),
64233e97e63SEnrico Granata                                                            TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags,
64333e97e63SEnrico Granata                                                                                                      "size=${svar%#}")));
64433e97e63SEnrico Granata 
64533e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator, "std::vector iterator synthetic children", ConstString("^__gnu_cxx::__normal_iterator<.+>$"), stl_synth_flags, true);
64633e97e63SEnrico Granata 
64733e97e63SEnrico Granata     AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator, "std::map iterator synthetic children", ConstString("^std::_Rb_tree_iterator<.+>$"), stl_synth_flags, true);
64833e97e63SEnrico Granata #endif
64933e97e63SEnrico Granata }
65033e97e63SEnrico Granata 
65133e97e63SEnrico Granata static void
65233e97e63SEnrico Granata LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp)
65333e97e63SEnrico Granata {
65433e97e63SEnrico Granata     if (!cpp_category_sp)
65533e97e63SEnrico Granata         return;
65633e97e63SEnrico Granata 
65733e97e63SEnrico Granata     TypeSummaryImpl::Flags string_flags;
65833e97e63SEnrico Granata     string_flags.SetCascades(true)
65933e97e63SEnrico Granata     .SetSkipPointers(true)
66033e97e63SEnrico Granata     .SetSkipReferences(false)
66133e97e63SEnrico Granata     .SetDontShowChildren(true)
66233e97e63SEnrico Granata     .SetDontShowValue(false)
66333e97e63SEnrico Granata     .SetShowMembersOneLiner(false)
66433e97e63SEnrico Granata     .SetHideItemNames(false);
66533e97e63SEnrico Granata 
66633e97e63SEnrico Granata     TypeSummaryImpl::Flags string_array_flags;
66733e97e63SEnrico Granata     string_array_flags.SetCascades(true)
66833e97e63SEnrico Granata     .SetSkipPointers(true)
66933e97e63SEnrico Granata     .SetSkipReferences(false)
67033e97e63SEnrico Granata     .SetDontShowChildren(true)
67133e97e63SEnrico Granata     .SetDontShowValue(true)
67233e97e63SEnrico Granata     .SetShowMembersOneLiner(false)
67333e97e63SEnrico Granata     .SetHideItemNames(false);
67433e97e63SEnrico Granata 
67533e97e63SEnrico Granata #ifndef LLDB_DISABLE_PYTHON
67633e97e63SEnrico Granata     // FIXME because of a bug in the FormattersContainer we need to add a summary for both X* and const X* (<rdar://problem/12717717>)
67733e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "char16_t * summary provider", ConstString("char16_t *"), string_flags);
678045c8292SDawn Perchik     AddCXXSummary(cpp_category_sp,
679045c8292SDawn Perchik                   lldb_private::formatters::Char16StringSummaryProvider,
680045c8292SDawn Perchik                   "char16_t [] summary provider",
681045c8292SDawn Perchik                   ConstString("char16_t \\[[0-9]+\\]"),
682045c8292SDawn Perchik                   string_array_flags,
683045c8292SDawn Perchik                   true);
68433e97e63SEnrico Granata 
68533e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char32StringSummaryProvider, "char32_t * summary provider", ConstString("char32_t *"), string_flags);
686045c8292SDawn Perchik     AddCXXSummary(cpp_category_sp,
687045c8292SDawn Perchik                   lldb_private::formatters::Char32StringSummaryProvider,
688045c8292SDawn Perchik                   "char32_t [] summary provider",
689045c8292SDawn Perchik                   ConstString("char32_t \\[[0-9]+\\]"),
690045c8292SDawn Perchik                   string_array_flags,
691045c8292SDawn Perchik                   true);
69233e97e63SEnrico Granata 
69333e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("wchar_t *"), string_flags);
69433e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("wchar_t \\[[0-9]+\\]"), string_array_flags, true);
69533e97e63SEnrico Granata 
69633e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "unichar * summary provider", ConstString("unichar *"), string_flags);
69733e97e63SEnrico Granata 
69833e97e63SEnrico Granata     TypeSummaryImpl::Flags widechar_flags;
69933e97e63SEnrico Granata     widechar_flags.SetDontShowValue(true)
70033e97e63SEnrico Granata     .SetSkipPointers(true)
70133e97e63SEnrico Granata     .SetSkipReferences(false)
70233e97e63SEnrico Granata     .SetCascades(true)
70333e97e63SEnrico Granata     .SetDontShowChildren(true)
70433e97e63SEnrico Granata     .SetHideItemNames(true)
70533e97e63SEnrico Granata     .SetShowMembersOneLiner(false);
70633e97e63SEnrico Granata 
70733e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char16SummaryProvider, "char16_t summary provider", ConstString("char16_t"), widechar_flags);
70833e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char32SummaryProvider, "char32_t summary provider", ConstString("char32_t"), widechar_flags);
70933e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharSummaryProvider, "wchar_t summary provider", ConstString("wchar_t"), widechar_flags);
71033e97e63SEnrico Granata 
71133e97e63SEnrico Granata     AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char16SummaryProvider, "unichar summary provider", ConstString("unichar"), widechar_flags);
71233e97e63SEnrico Granata #endif
71333e97e63SEnrico Granata }
71433e97e63SEnrico Granata 
71533e97e63SEnrico Granata lldb::TypeCategoryImplSP
71633e97e63SEnrico Granata CPlusPlusLanguage::GetFormatters ()
71733e97e63SEnrico Granata {
71833e97e63SEnrico Granata     static std::once_flag g_initialize;
71933e97e63SEnrico Granata     static TypeCategoryImplSP g_category;
72033e97e63SEnrico Granata 
72133e97e63SEnrico Granata     std::call_once(g_initialize, [this] () -> void {
72233e97e63SEnrico Granata         DataVisualization::Categories::GetCategory(GetPluginName(), g_category);
72333e97e63SEnrico Granata         if (g_category)
72433e97e63SEnrico Granata         {
72533e97e63SEnrico Granata             LoadLibCxxFormatters(g_category);
72633e97e63SEnrico Granata             LoadLibStdcppFormatters(g_category);
72733e97e63SEnrico Granata             LoadSystemFormatters(g_category);
72833e97e63SEnrico Granata         }
72933e97e63SEnrico Granata     });
73033e97e63SEnrico Granata     return g_category;
73133e97e63SEnrico Granata }
73233e97e63SEnrico Granata 
7337cb59e1aSEnrico Granata HardcodedFormatters::HardcodedSummaryFinder
7347cb59e1aSEnrico Granata CPlusPlusLanguage::GetHardcodedSummaries ()
7357cb59e1aSEnrico Granata {
7367cb59e1aSEnrico Granata     static std::once_flag g_initialize;
7377cb59e1aSEnrico Granata     static ConstString g_vectortypes("VectorTypes");
7387cb59e1aSEnrico Granata     static HardcodedFormatters::HardcodedSummaryFinder g_formatters;
7397cb59e1aSEnrico Granata 
7407cb59e1aSEnrico Granata     std::call_once(g_initialize, [] () -> void {
7417cb59e1aSEnrico Granata         g_formatters.push_back(
7427cb59e1aSEnrico Granata                                         [](lldb_private::ValueObject& valobj,
7437cb59e1aSEnrico Granata                                            lldb::DynamicValueType,
7447cb59e1aSEnrico Granata                                            FormatManager&) -> TypeSummaryImpl::SharedPointer {
7457cb59e1aSEnrico Granata                                             static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::CXXFunctionPointerSummaryProvider, "Function pointer summary provider"));
7467cb59e1aSEnrico Granata                                             if (valobj.GetCompilerType().IsFunctionPointerType())
7477cb59e1aSEnrico Granata                                             {
7487cb59e1aSEnrico Granata                                                 return formatter_sp;
7497cb59e1aSEnrico Granata                                             }
7507cb59e1aSEnrico Granata                                             return nullptr;
7517cb59e1aSEnrico Granata                                         });
7527cb59e1aSEnrico Granata         g_formatters.push_back(
7537cb59e1aSEnrico Granata                                         [](lldb_private::ValueObject& valobj,
7547cb59e1aSEnrico Granata                                            lldb::DynamicValueType,
7557cb59e1aSEnrico Granata                                            FormatManager& fmt_mgr) -> TypeSummaryImpl::SharedPointer {
7567cb59e1aSEnrico Granata                                             static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags()
7577cb59e1aSEnrico Granata                                                                                                                                      .SetCascades(true)
7587cb59e1aSEnrico Granata                                                                                                                                      .SetDontShowChildren(true)
7597cb59e1aSEnrico Granata                                                                                                                                      .SetHideItemNames(true)
7607cb59e1aSEnrico Granata                                                                                                                                      .SetShowMembersOneLiner(true)
7617cb59e1aSEnrico Granata                                                                                                                                      .SetSkipPointers(true)
7627cb59e1aSEnrico Granata                                                                                                                                      .SetSkipReferences(false),
7637cb59e1aSEnrico Granata                                                                                                                                      lldb_private::formatters::VectorTypeSummaryProvider,
7647cb59e1aSEnrico Granata                                                                                                                                      "vector_type pointer summary provider"));
7657cb59e1aSEnrico Granata                                             if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr))
7667cb59e1aSEnrico Granata                                             {
7677cb59e1aSEnrico Granata                                                 if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
7687cb59e1aSEnrico Granata                                                     return formatter_sp;
7697cb59e1aSEnrico Granata                                             }
7707cb59e1aSEnrico Granata                                             return nullptr;
7717cb59e1aSEnrico Granata                                         });
7727cb59e1aSEnrico Granata     });
7737cb59e1aSEnrico Granata 
7747cb59e1aSEnrico Granata     return g_formatters;
7757cb59e1aSEnrico Granata }
7767cb59e1aSEnrico Granata 
7777cb59e1aSEnrico Granata HardcodedFormatters::HardcodedSyntheticFinder
7787cb59e1aSEnrico Granata CPlusPlusLanguage::GetHardcodedSynthetics ()
7797cb59e1aSEnrico Granata {
7807cb59e1aSEnrico Granata     static std::once_flag g_initialize;
7817cb59e1aSEnrico Granata     static ConstString g_vectortypes("VectorTypes");
7827cb59e1aSEnrico Granata     static HardcodedFormatters::HardcodedSyntheticFinder g_formatters;
7837cb59e1aSEnrico Granata 
7847cb59e1aSEnrico Granata     std::call_once(g_initialize, [] () -> void {
7857cb59e1aSEnrico Granata         g_formatters.push_back(
7867cb59e1aSEnrico Granata                                          [](lldb_private::ValueObject& valobj,
7877cb59e1aSEnrico Granata                                             lldb::DynamicValueType,
7887cb59e1aSEnrico Granata                                             FormatManager& fmt_mgr) -> SyntheticChildren::SharedPointer {
7897cb59e1aSEnrico Granata                                              static CXXSyntheticChildren::SharedPointer formatter_sp(new CXXSyntheticChildren(SyntheticChildren::Flags().SetCascades(true).SetSkipPointers(true).SetSkipReferences(true).SetNonCacheable(true),
7907cb59e1aSEnrico Granata                                                                                                                               "vector_type synthetic children",
7917cb59e1aSEnrico Granata                                                                                                                               lldb_private::formatters::VectorTypeSyntheticFrontEndCreator));
7927cb59e1aSEnrico Granata                                              if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr))
7937cb59e1aSEnrico Granata                                              {
7947cb59e1aSEnrico Granata                                                  if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
7957cb59e1aSEnrico Granata                                                      return formatter_sp;
7967cb59e1aSEnrico Granata                                              }
7977cb59e1aSEnrico Granata                                              return nullptr;
7987cb59e1aSEnrico Granata                                          });
7997cb59e1aSEnrico Granata     });
8007cb59e1aSEnrico Granata 
8017cb59e1aSEnrico Granata     return g_formatters;
8027cb59e1aSEnrico Granata }
803