Coverage Report

Created: 2023-09-30 09:22

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
Line
Count
Source (jump to first uncovered line)
1
//===-- CPlusPlusLanguage.cpp ---------------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "CPlusPlusLanguage.h"
10
11
#include <cctype>
12
#include <cstring>
13
14
#include <functional>
15
#include <memory>
16
#include <mutex>
17
#include <set>
18
19
#include "llvm/ADT/StringRef.h"
20
#include "llvm/Demangle/ItaniumDemangle.h"
21
22
#include "lldb/Core/Mangled.h"
23
#include "lldb/Core/Module.h"
24
#include "lldb/Core/PluginManager.h"
25
#include "lldb/Core/UniqueCStringMap.h"
26
#include "lldb/Core/ValueObjectVariable.h"
27
#include "lldb/DataFormatters/CXXFunctionPointer.h"
28
#include "lldb/DataFormatters/DataVisualization.h"
29
#include "lldb/DataFormatters/FormattersHelpers.h"
30
#include "lldb/DataFormatters/VectorType.h"
31
#include "lldb/Symbol/SymbolFile.h"
32
#include "lldb/Symbol/VariableList.h"
33
#include "lldb/Utility/ConstString.h"
34
#include "lldb/Utility/LLDBLog.h"
35
#include "lldb/Utility/Log.h"
36
#include "lldb/Utility/RegularExpression.h"
37
38
#include "BlockPointer.h"
39
#include "CPlusPlusNameParser.h"
40
#include "Coroutines.h"
41
#include "CxxStringTypes.h"
42
#include "Generic.h"
43
#include "LibCxx.h"
44
#include "LibCxxAtomic.h"
45
#include "LibCxxVariant.h"
46
#include "LibStdcpp.h"
47
#include "MSVCUndecoratedNameParser.h"
48
49
using namespace lldb;
50
using namespace lldb_private;
51
using namespace lldb_private::formatters;
52
53
LLDB_PLUGIN_DEFINE(CPlusPlusLanguage)
54
55
3.96k
void CPlusPlusLanguage::Initialize() {
56
3.96k
  PluginManager::RegisterPlugin(GetPluginNameStatic(), "C++ Language",
57
3.96k
                                CreateInstance);
58
3.96k
}
59
60
3.95k
void CPlusPlusLanguage::Terminate() {
61
3.95k
  PluginManager::UnregisterPlugin(CreateInstance);
62
3.95k
}
63
64
822k
bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const {
65
822k
  const char *mangled_name = mangled.GetMangledName().GetCString();
66
822k
  return mangled_name && 
CPlusPlusLanguage::IsCPPMangledName(mangled_name)11.5k
;
67
822k
}
68
69
ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments(
70
377
    Mangled mangled) const {
71
377
  const char *mangled_name_cstr = mangled.GetMangledName().GetCString();
72
377
  ConstString demangled_name = mangled.GetDemangledName();
73
377
  if (demangled_name && 
mangled_name_cstr376
&&
mangled_name_cstr[0]338
) {
74
338
    if (mangled_name_cstr[0] == '_' && mangled_name_cstr[1] == 'Z' &&
75
338
        (mangled_name_cstr[2] != 'T' && // avoid virtual table, VTT structure,
76
                                        // typeinfo structure, and typeinfo
77
                                        // mangled_name
78
338
         mangled_name_cstr[2] != 'G' && // avoid guard variables
79
338
         mangled_name_cstr[2] != 'Z'))  // named local entities (if we
80
                                        // eventually handle eSymbolTypeData,
81
                                        // we will want this back)
82
334
    {
83
334
      CPlusPlusLanguage::MethodName cxx_method(demangled_name);
84
334
      if (!cxx_method.GetBasename().empty()) {
85
298
        std::string shortname;
86
298
        if (!cxx_method.GetContext().empty())
87
178
          shortname = cxx_method.GetContext().str() + "::";
88
298
        shortname += cxx_method.GetBasename().str();
89
298
        return ConstString(shortname);
90
298
      }
91
334
    }
92
338
  }
93
79
  if (demangled_name)
94
78
    return demangled_name;
95
1
  return mangled.GetMangledName();
96
79
}
97
98
// Static Functions
99
100
171k
Language *CPlusPlusLanguage::CreateInstance(lldb::LanguageType language) {
101
  // Use plugin for C++ but not for Objective-C++ (which has its own plugin).
102
171k
  if (Language::LanguageIsCPlusPlus(language) &&
103
171k
      
language != eLanguageTypeObjC_plus_plus7.79k
)
104
6.68k
    return new CPlusPlusLanguage();
105
164k
  return nullptr;
106
171k
}
107
108
0
void CPlusPlusLanguage::MethodName::Clear() {
109
0
  m_full.Clear();
110
0
  m_basename = llvm::StringRef();
111
0
  m_context = llvm::StringRef();
112
0
  m_arguments = llvm::StringRef();
113
0
  m_qualifiers = llvm::StringRef();
114
0
  m_return_type = llvm::StringRef();
115
0
  m_parsed = false;
116
0
  m_parse_error = false;
117
0
}
118
119
static bool ReverseFindMatchingChars(const llvm::StringRef &s,
120
                                     const llvm::StringRef &left_right_chars,
121
                                     size_t &left_pos, size_t &right_pos,
122
669k
                                     size_t pos = llvm::StringRef::npos) {
123
669k
  assert(left_right_chars.size() == 2);
124
669k
  left_pos = llvm::StringRef::npos;
125
669k
  const char left_char = left_right_chars[0];
126
669k
  const char right_char = left_right_chars[1];
127
669k
  pos = s.find_last_of(left_right_chars, pos);
128
669k
  if (pos == llvm::StringRef::npos || 
s[pos] == left_char6.53k
)
129
663k
    return false;
130
6.53k
  right_pos = pos;
131
6.53k
  uint32_t depth = 1;
132
7.06k
  while (pos > 0 && depth > 0) {
133
7.06k
    pos = s.find_last_of(left_right_chars, pos);
134
7.06k
    if (pos == llvm::StringRef::npos)
135
0
      return false;
136
7.06k
    if (s[pos] == left_char) {
137
6.80k
      if (--depth == 0) {
138
6.53k
        left_pos = pos;
139
6.53k
        return left_pos < right_pos;
140
6.53k
      }
141
6.80k
    } else 
if (267
s[pos] == right_char267
) {
142
267
      ++depth;
143
267
    }
144
7.06k
  }
145
0
  return false;
146
6.53k
}
147
148
6.47k
static bool IsTrivialBasename(const llvm::StringRef &basename) {
149
  // Check that the basename matches with the following regular expression
150
  // "^~?([A-Za-z_][A-Za-z_0-9]*)$" We are using a hand written implementation
151
  // because it is significantly more efficient then using the general purpose
152
  // regular expression library.
153
6.47k
  size_t idx = 0;
154
6.47k
  if (basename.size() > 0 && 
basename[0] == '~'6.46k
)
155
27
    idx = 1;
156
157
6.47k
  if (basename.size() <= idx)
158
1
    return false; // Empty string or "~"
159
160
6.46k
  if (!std::isalpha(basename[idx]) && 
basename[idx] != '_'190
)
161
16
    return false; // First character (after removing the possible '~'') isn't in
162
                  // [A-Za-z_]
163
164
  // Read all characters matching [A-Za-z_0-9]
165
6.45k
  ++idx;
166
96.4k
  while (idx < basename.size()) {
167
90.7k
    if (!std::isalnum(basename[idx]) && 
basename[idx] != '_'10.8k
)
168
777
      break;
169
89.9k
    ++idx;
170
89.9k
  }
171
172
  // We processed all characters. It is a vaild basename.
173
6.45k
  return idx == basename.size();
174
6.46k
}
175
176
/// Writes out the function name in 'full_name' to 'out_stream'
177
/// but replaces each argument type with the variable name
178
/// and the corresponding pretty-printed value
179
static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream,
180
                                            char const *full_name,
181
                                            ExecutionContextScope *exe_scope,
182
1.17k
                                            VariableList const &args) {
183
1.17k
  CPlusPlusLanguage::MethodName cpp_method{ConstString(full_name)};
184
185
1.17k
  if (!cpp_method.IsValid())
186
460
    return false;
187
188
715
  llvm::StringRef return_type = cpp_method.GetReturnType();
189
715
  if (!return_type.empty()) {
190
83
    out_stream.PutCString(return_type);
191
83
    out_stream.PutChar(' ');
192
83
  }
193
194
715
  out_stream.PutCString(cpp_method.GetScopeQualifiedName());
195
715
  out_stream.PutChar('(');
196
197
715
  FormatEntity::PrettyPrintFunctionArguments(out_stream, args, exe_scope);
198
199
715
  out_stream.PutChar(')');
200
201
715
  llvm::StringRef qualifiers = cpp_method.GetQualifiers();
202
715
  if (!qualifiers.empty()) {
203
3
    out_stream.PutChar(' ');
204
3
    out_stream.PutCString(qualifiers);
205
3
  }
206
207
715
  return true;
208
1.17k
}
209
210
669k
bool CPlusPlusLanguage::MethodName::TrySimplifiedParse() {
211
  // This method tries to parse simple method definitions which are presumably
212
  // most comman in user programs. Definitions that can be parsed by this
213
  // function don't have return types and templates in the name.
214
  // A::B::C::fun(std::vector<T> &) const
215
669k
  size_t arg_start, arg_end;
216
669k
  llvm::StringRef full(m_full.GetCString());
217
669k
  llvm::StringRef parens("()", 2);
218
669k
  if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) {
219
6.47k
    m_arguments = full.substr(arg_start, arg_end - arg_start + 1);
220
6.47k
    if (arg_end + 1 < full.size())
221
362
      m_qualifiers = full.substr(arg_end + 1).ltrim();
222
223
6.47k
    if (arg_start == 0)
224
0
      return false;
225
6.47k
    size_t basename_end = arg_start;
226
6.47k
    size_t context_start = 0;
227
6.47k
    size_t context_end = full.rfind(':', basename_end);
228
6.47k
    if (context_end == llvm::StringRef::npos)
229
5.34k
      m_basename = full.substr(0, basename_end);
230
1.12k
    else {
231
1.12k
      if (context_start < context_end)
232
1.12k
        m_context = full.substr(context_start, context_end - 1 - context_start);
233
1.12k
      const size_t basename_begin = context_end + 1;
234
1.12k
      m_basename = full.substr(basename_begin, basename_end - basename_begin);
235
1.12k
    }
236
237
6.47k
    if (IsTrivialBasename(m_basename)) {
238
5.67k
      return true;
239
5.67k
    } else {
240
      // The C++ basename doesn't match our regular expressions so this can't
241
      // be a valid C++ method, clear everything out and indicate an error
242
794
      m_context = llvm::StringRef();
243
794
      m_basename = llvm::StringRef();
244
794
      m_arguments = llvm::StringRef();
245
794
      m_qualifiers = llvm::StringRef();
246
794
      m_return_type = llvm::StringRef();
247
794
      return false;
248
794
    }
249
6.47k
  }
250
663k
  return false;
251
669k
}
252
253
669k
void CPlusPlusLanguage::MethodName::Parse() {
254
669k
  if (!m_parsed && m_full) {
255
669k
    if (TrySimplifiedParse()) {
256
5.67k
      m_parse_error = false;
257
664k
    } else {
258
664k
      CPlusPlusNameParser parser(m_full.GetStringRef());
259
664k
      if (auto function = parser.ParseAsFunctionDefinition()) {
260
617
        m_basename = function->name.basename;
261
617
        m_context = function->name.context;
262
617
        m_arguments = function->arguments;
263
617
        m_qualifiers = function->qualifiers;
264
617
        m_return_type = function->return_type;
265
617
        m_parse_error = false;
266
663k
      } else {
267
663k
        m_parse_error = true;
268
663k
      }
269
664k
    }
270
669k
    m_parsed = true;
271
669k
  }
272
669k
}
273
274
537k
llvm::StringRef CPlusPlusLanguage::MethodName::GetBasename() {
275
537k
  if (!m_parsed)
276
532k
    Parse();
277
537k
  return m_basename;
278
537k
}
279
280
2.65k
llvm::StringRef CPlusPlusLanguage::MethodName::GetContext() {
281
2.65k
  if (!m_parsed)
282
1
    Parse();
283
2.65k
  return m_context;
284
2.65k
}
285
286
54
llvm::StringRef CPlusPlusLanguage::MethodName::GetArguments() {
287
54
  if (!m_parsed)
288
7
    Parse();
289
54
  return m_arguments;
290
54
}
291
292
757
llvm::StringRef CPlusPlusLanguage::MethodName::GetQualifiers() {
293
757
  if (!m_parsed)
294
0
    Parse();
295
757
  return m_qualifiers;
296
757
}
297
298
755
llvm::StringRef CPlusPlusLanguage::MethodName::GetReturnType() {
299
755
  if (!m_parsed)
300
0
    Parse();
301
755
  return m_return_type;
302
755
}
303
304
791
std::string CPlusPlusLanguage::MethodName::GetScopeQualifiedName() {
305
791
  if (!m_parsed)
306
36
    Parse();
307
791
  if (m_context.empty())
308
635
    return std::string(m_basename);
309
310
156
  std::string res;
311
156
  res += m_context;
312
156
  res += "::";
313
156
  res += m_basename;
314
156
  return res;
315
791
}
316
317
llvm::StringRef
318
65
CPlusPlusLanguage::MethodName::GetBasenameNoTemplateParameters() {
319
65
  llvm::StringRef basename = GetBasename();
320
65
  size_t arg_start, arg_end;
321
65
  llvm::StringRef parens("<>", 2);
322
65
  if (ReverseFindMatchingChars(basename, parens, arg_start, arg_end))
323
63
    return basename.substr(0, arg_start);
324
325
2
  return basename;
326
65
}
327
328
3.08k
bool CPlusPlusLanguage::MethodName::ContainsPath(llvm::StringRef path) {
329
3.08k
  if (!m_parsed)
330
3.05k
    Parse();
331
332
  // If we can't parse the incoming name, then just check that it contains path.
333
3.08k
  if (m_parse_error)
334
0
    return m_full.GetStringRef().contains(path);
335
    
336
3.08k
  llvm::StringRef identifier;
337
3.08k
  llvm::StringRef context;
338
3.08k
  std::string path_str = path.str();
339
3.08k
  bool success 
340
3.08k
      = CPlusPlusLanguage::ExtractContextAndIdentifier(path_str.c_str(),
341
3.08k
                                                       context,
342
3.08k
                                                       identifier);
343
3.08k
  if (!success)
344
70
    return m_full.GetStringRef().contains(path);
345
346
  // Basename may include template arguments.
347
  // E.g.,
348
  // GetBaseName(): func<int>
349
  // identifier   : func
350
  //
351
  // ...but we still want to account for identifiers with template parameter
352
  // lists, e.g., when users set breakpoints on template specializations.
353
  //
354
  // E.g.,
355
  // GetBaseName(): func<uint32_t>
356
  // identifier   : func<int32_t*>
357
  //
358
  // Try to match the basename with or without template parameters.
359
3.01k
  if (GetBasename() != identifier &&
360
3.01k
      
GetBasenameNoTemplateParameters() != identifier65
)
361
5
    return false;
362
363
  // Incoming path only had an identifier, so we match.
364
3.00k
  if (context.empty())
365
2.58k
    return true;
366
  // Incoming path has context but this method does not, no match.
367
426
  if (m_context.empty())
368
7
    return false;
369
370
419
  llvm::StringRef haystack = m_context;
371
419
  if (!haystack.consume_back(context))
372
307
    return false;
373
112
  if (haystack.empty() || 
!isalnum(haystack.back())61
)
374
97
    return true;
375
    
376
15
  return false;
377
112
}
378
379
569k
bool CPlusPlusLanguage::IsCPPMangledName(llvm::StringRef name) {
380
  // FIXME!! we should really run through all the known C++ Language plugins
381
  // and ask each one if this is a C++ mangled name
382
383
569k
  Mangled::ManglingScheme scheme = Mangled::GetManglingScheme(name);
384
385
569k
  if (scheme == Mangled::eManglingSchemeNone)
386
545k
    return false;
387
388
23.8k
  return true;
389
569k
}
390
391
bool CPlusPlusLanguage::DemangledNameContainsPath(llvm::StringRef path, 
392
3.05k
                                                  ConstString demangled) const {
393
3.05k
  MethodName demangled_name(demangled);
394
3.05k
  return demangled_name.ContainsPath(path);
395
3.05k
}
396
397
bool CPlusPlusLanguage::ExtractContextAndIdentifier(
398
680k
    const char *name, llvm::StringRef &context, llvm::StringRef &identifier) {
399
680k
  if (MSVCUndecoratedNameParser::IsMSVCUndecoratedName(name))
400
3
    return MSVCUndecoratedNameParser::ExtractContextAndIdentifier(name, context,
401
3
                                                                  identifier);
402
403
680k
  CPlusPlusNameParser parser(name);
404
680k
  if (auto full_name = parser.ParseAsFullName()) {
405
659k
    identifier = full_name->basename;
406
659k
    context = full_name->context;
407
659k
    return true;
408
659k
  }
409
21.3k
  return false;
410
680k
}
411
412
namespace {
413
class NodeAllocator {
414
  llvm::BumpPtrAllocator Alloc;
415
416
public:
417
328
  void reset() { Alloc.Reset(); }
418
419
2.64k
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
2.64k
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
2.64k
        T(std::forward<Args>(args)...);
422
2.64k
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [31], llvm::itanium_demangle::Node*&>(char const (&) [31], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [12], llvm::itanium_demangle::Node*&>(char const (&) [12], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [9], llvm::itanium_demangle::Node*&>(char const (&) [9], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [14], llvm::itanium_demangle::Node*&>(char const (&) [14], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [19], llvm::itanium_demangle::Node*&>(char const (&) [19], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [27], llvm::itanium_demangle::Node*&>(char const (&) [27], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::CtorVtableSpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::CtorVtableSpecialName, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [41], llvm::itanium_demangle::Node*&>(char const (&) [41], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [18], llvm::itanium_demangle::Node*&>(char const (&) [18], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [22], llvm::itanium_demangle::Node*&>(char const (&) [22], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [20], llvm::itanium_demangle::Node*&>(char const (&) [20], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [25], llvm::itanium_demangle::Node*&>(char const (&) [25], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [22]>(char const (&) [22])
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Line
Count
Source
419
688
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
688
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
688
        T(std::forward<Args>(args)...);
422
688
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ModuleName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ModuleName, llvm::itanium_demangle::ModuleName*&, llvm::itanium_demangle::Node*&, bool&>(llvm::itanium_demangle::ModuleName*&, llvm::itanium_demangle::Node*&, bool&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [24], llvm::itanium_demangle::ModuleName*&>(char const (&) [24], llvm::itanium_demangle::ModuleName*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(std::__1::basic_string_view<char, std::__1::char_traits<char> >&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ForwardTemplateReference* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ForwardTemplateReference, unsigned long&>(unsigned long&)
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [5]>(char const (&) [5])
Line
Count
Source
419
88
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
88
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
88
        T(std::forward<Args>(args)...);
422
88
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BinaryExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BinaryExpr, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PrefixExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PrefixExpr, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PostfixExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PostfixExpr, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ArraySubscriptExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ArraySubscriptExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::MemberExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::MemberExpr, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NewExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NewExpr, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, bool&, bool, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, bool&, bool&&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::DeleteExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::DeleteExpr, llvm::itanium_demangle::Node*&, bool&, bool, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, bool&, bool&&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::CallExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::CallExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ConversionExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ConversionExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ConditionalExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ConditionalExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::CastExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::CastExpr, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnclosingExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnclosingExpr, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::IntegerLiteral* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::IntegerLiteral, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BoolExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BoolExpr, int>(int&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::FloatLiteralImpl<float>* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FloatLiteralImpl<float>, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::FloatLiteralImpl<double>* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FloatLiteralImpl<double>, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::FloatLiteralImpl<long double>* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FloatLiteralImpl<long double>, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::StringLiteral* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::StringLiteral, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [8]>(char const (&) [8])
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::UnnamedTypeName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::UnnamedTypeName, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SyntheticTemplateParamName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SyntheticTemplateParamName, llvm::itanium_demangle::TemplateParamKind&, unsigned int&>(llvm::itanium_demangle::TemplateParamKind&, unsigned int&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TypeTemplateParamDecl* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TypeTemplateParamDecl, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ConstrainedTypeTemplateParamDecl* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ConstrainedTypeTemplateParamDecl, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NoexceptSpec* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NoexceptSpec, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::DynamicExceptionSpec* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::DynamicExceptionSpec, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&&)
CPlusPlusLanguage.cpp:llvm::itanium_demangle::FunctionType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FunctionType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Qualifiers&, llvm::itanium_demangle::FunctionRefQual&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Qualifiers&, llvm::itanium_demangle::FunctionRefQual&, llvm::itanium_demangle::Node*&)
Line
Count
Source
419
40
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
40
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
40
        T(std::forward<Args>(args)...);
422
40
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ObjCProtoName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ObjCProtoName, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::VendorExtQualType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::VendorExtQualType, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&)
CPlusPlusLanguage.cpp:llvm::itanium_demangle::QualType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::QualType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Qualifiers&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Qualifiers&)
Line
Count
Source
419
16
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
16
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
16
        T(std::forward<Args>(args)...);
422
16
  }
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [12]>(char const (&) [12])
Line
Count
Source
419
8
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
8
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
8
        T(std::forward<Args>(args)...);
422
8
  }
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [14]>(char const (&) [14])
Line
Count
Source
419
120
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
120
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
120
        T(std::forward<Args>(args)...);
422
120
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [15]>(char const (&) [15])
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [13]>(char const (&) [13])
Line
Count
Source
419
120
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
120
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
120
        T(std::forward<Args>(args)...);
422
120
  }
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [10]>(char const (&) [10])
Line
Count
Source
419
4
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
4
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
4
        T(std::forward<Args>(args)...);
422
4
  }
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [19]>(char const (&) [19])
Line
Count
Source
419
4
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
4
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
4
        T(std::forward<Args>(args)...);
422
4
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [9]>(char const (&) [9])
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [18]>(char const (&) [18])
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [7]>(char const (&) [7])
Line
Count
Source
419
32
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
32
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
32
        T(std::forward<Args>(args)...);
422
32
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [11]>(char const (&) [11])
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TransformedType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TransformedType, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BinaryFPType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BinaryFPType, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BitIntType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BitIntType, llvm::itanium_demangle::Node*&, bool&>(llvm::itanium_demangle::Node*&, bool&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PostfixQualifiedType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PostfixQualifiedType, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PixelVectorType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PixelVectorType, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::VectorType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::VectorType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::VectorType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::VectorType, llvm::itanium_demangle::Node*&, std::nullptr_t>(llvm::itanium_demangle::Node*&, std::nullptr_t&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ArrayType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ArrayType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PointerToMemberType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PointerToMemberType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ElaboratedTypeSpefType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ElaboratedTypeSpefType, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node*&)
CPlusPlusLanguage.cpp:llvm::itanium_demangle::PointerType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PointerType, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Line
Count
Source
419
240
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
240
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
240
        T(std::forward<Args>(args)...);
422
240
  }
CPlusPlusLanguage.cpp:llvm::itanium_demangle::ReferenceType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ReferenceType, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::ReferenceKind>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::ReferenceKind&&)
Line
Count
Source
419
16
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
16
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
16
        T(std::forward<Args>(args)...);
422
16
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PostfixQualifiedType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PostfixQualifiedType, llvm::itanium_demangle::Node*&, char const (&) [9]>(llvm::itanium_demangle::Node*&, char const (&) [9])
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PostfixQualifiedType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PostfixQualifiedType, llvm::itanium_demangle::Node*&, char const (&) [11]>(llvm::itanium_demangle::Node*&, char const (&) [11])
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NonTypeTemplateParamDecl* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NonTypeTemplateParamDecl, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TemplateTemplateParamDecl* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TemplateTemplateParamDecl, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TemplateParamPackDecl* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TemplateParamPackDecl, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ClosureTypeName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ClosureTypeName, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [16]>(char const (&) [16])
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::LambdaExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::LambdaExpr, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnumLiteral* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnumLiteral, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::FunctionParam* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FunctionParam, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::FoldExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FoldExpr, bool&, std::__1::basic_string_view<char, std::__1::char_traits<char> >, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(bool&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BracedExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BracedExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, bool>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, bool&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::BracedRangeExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::BracedRangeExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::InitListExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::InitListExpr, std::nullptr_t, llvm::itanium_demangle::NodeArray>(std::nullptr_t&&, llvm::itanium_demangle::NodeArray&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::PointerToMemberConversionExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::PointerToMemberConversionExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node::Prec&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::Node::Prec&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnclosingExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnclosingExpr, char const (&) [10], llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec>(char const (&) [10], llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node::Prec&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ExprRequirement* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ExprRequirement, llvm::itanium_demangle::Node*&, bool&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, bool&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TypeRequirement* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TypeRequirement, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NestedRequirement* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NestedRequirement, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::RequiresExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::RequiresExpr, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::NodeArray&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SubobjectExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SubobjectExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::NodeArray, bool&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&, llvm::itanium_demangle::NodeArray&&, bool&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ParameterPackExpansion* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ParameterPackExpansion, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SizeofParamPackExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SizeofParamPackExpr, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnclosingExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnclosingExpr, char const (&) [11], llvm::itanium_demangle::Node*&>(char const (&) [11], llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NodeArrayNode* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NodeArrayNode, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::InitListExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::InitListExpr, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [6]>(char const (&) [6])
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ThrowExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ThrowExpr, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::QualifiedName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::QualifiedName, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::DtorName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::DtorName, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ConversionOperatorType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ConversionOperatorType, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::LiteralOperator* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::LiteralOperator, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::GlobalQualifiedName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::GlobalQualifiedName, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnclosingExpr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnclosingExpr, char const (&) [9], llvm::itanium_demangle::Node*&>(char const (&) [9], llvm::itanium_demangle::Node*&)
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameType* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameType, char const (&) [4]>(char const (&) [4])
Line
Count
Source
419
180
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
180
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
180
        T(std::forward<Args>(args)...);
422
180
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialSubstitution* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialSubstitution, llvm::itanium_demangle::SpecialSubKind&>(llvm::itanium_demangle::SpecialSubKind&)
CPlusPlusLanguage.cpp:llvm::itanium_demangle::AbiTagAttr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::AbiTagAttr, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&>(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&)
Line
Count
Source
419
16
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
16
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
16
        T(std::forward<Args>(args)...);
422
16
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::StructuredBindingName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::StructuredBindingName, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ExpandedSpecialSubstitution* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ExpandedSpecialSubstitution, llvm::itanium_demangle::SpecialSubstitution*>(llvm::itanium_demangle::SpecialSubstitution*&&)
CPlusPlusLanguage.cpp:llvm::itanium_demangle::CtorDtorName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::CtorDtorName, llvm::itanium_demangle::Node*&, bool, int&>(llvm::itanium_demangle::Node*&, bool&&, int&)
Line
Count
Source
419
56
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
56
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
56
        T(std::forward<Args>(args)...);
422
56
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ModuleEntity* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ModuleEntity, llvm::itanium_demangle::ModuleName*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::ModuleName*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::MemberLikeFriendName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::MemberLikeFriendName, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NestedName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NestedName, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Line
Count
Source
419
460
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
460
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
460
        T(std::forward<Args>(args)...);
422
460
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::LocalName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::LocalName, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::ParameterPack* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::ParameterPack, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&&)
CPlusPlusLanguage.cpp:llvm::itanium_demangle::TemplateArgs* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TemplateArgs, llvm::itanium_demangle::NodeArray, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::NodeArray&&, llvm::itanium_demangle::Node*&)
Line
Count
Source
419
192
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
192
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
192
        T(std::forward<Args>(args)...);
422
192
  }
CPlusPlusLanguage.cpp:llvm::itanium_demangle::NameWithTemplateArgs* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::NameWithTemplateArgs, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Line
Count
Source
419
192
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
192
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
192
        T(std::forward<Args>(args)...);
422
192
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TemplateArgumentPack* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TemplateArgumentPack, llvm::itanium_demangle::NodeArray&>(llvm::itanium_demangle::NodeArray&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::TemplateParamQualifiedArg* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::TemplateParamQualifiedArg, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::EnableIfAttr* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::EnableIfAttr, llvm::itanium_demangle::NodeArray>(llvm::itanium_demangle::NodeArray&&)
CPlusPlusLanguage.cpp:llvm::itanium_demangle::FunctionEncoding* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::FunctionEncoding, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Qualifiers&, llvm::itanium_demangle::FunctionRefQual&>(llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::NodeArray&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Node*&, llvm::itanium_demangle::Qualifiers&, llvm::itanium_demangle::FunctionRefQual&)
Line
Count
Source
419
172
  template <typename T, typename... Args> T *makeNode(Args &&... args) {
420
172
    return new (Alloc.Allocate(sizeof(T), alignof(T)))
421
172
        T(std::forward<Args>(args)...);
422
172
  }
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::DotSuffix* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::DotSuffix, llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> > >(llvm::itanium_demangle::Node*&, std::__1::basic_string_view<char, std::__1::char_traits<char> >&&)
Unexecuted instantiation: CPlusPlusLanguage.cpp:llvm::itanium_demangle::SpecialName* (anonymous namespace)::NodeAllocator::makeNode<llvm::itanium_demangle::SpecialName, char const (&) [34], llvm::itanium_demangle::Node*&>(char const (&) [34], llvm::itanium_demangle::Node*&)
423
424
320
  void *allocateNodeArray(size_t sz) {
425
320
    return Alloc.Allocate(sizeof(llvm::itanium_demangle::Node *) * sz,
426
320
                          alignof(llvm::itanium_demangle::Node *));
427
320
  }
428
};
429
430
template <typename Derived>
431
class ManglingSubstitutor
432
    : public llvm::itanium_demangle::AbstractManglingParser<Derived,
433
                                                            NodeAllocator> {
434
  using Base =
435
      llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>;
436
437
public:
438
164
  ManglingSubstitutor() : Base(nullptr, nullptr) {}
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::ManglingSubstitutor()
Line
Count
Source
438
82
  ManglingSubstitutor() : Base(nullptr, nullptr) {}
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::ManglingSubstitutor()
Line
Count
Source
438
82
  ManglingSubstitutor() : Base(nullptr, nullptr) {}
439
440
  template <typename... Ts>
441
328
  ConstString substitute(llvm::StringRef Mangled, Ts &&... Vals) {
442
328
    this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
443
328
    return substituteImpl(Mangled);
444
328
  }
CPlusPlusLanguage.cpp:lldb_private::ConstString (anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::substitute<char const (&) [2], char const (&) [2]>(llvm::StringRef, char const (&) [2], char const (&) [2])
Line
Count
Source
441
246
  ConstString substitute(llvm::StringRef Mangled, Ts &&... Vals) {
442
246
    this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
443
246
    return substituteImpl(Mangled);
444
246
  }
CPlusPlusLanguage.cpp:lldb_private::ConstString (anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::substitute<>(llvm::StringRef)
Line
Count
Source
441
82
  ConstString substitute(llvm::StringRef Mangled, Ts &&... Vals) {
442
82
    this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...);
443
82
    return substituteImpl(Mangled);
444
82
  }
445
446
protected:
447
328
  void reset(llvm::StringRef Mangled) {
448
328
    Base::reset(Mangled.begin(), Mangled.end());
449
328
    Written = Mangled.begin();
450
328
    Result.clear();
451
328
    Substituted = false;
452
328
  }
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::reset(llvm::StringRef)
Line
Count
Source
447
246
  void reset(llvm::StringRef Mangled) {
448
246
    Base::reset(Mangled.begin(), Mangled.end());
449
246
    Written = Mangled.begin();
450
246
    Result.clear();
451
246
    Substituted = false;
452
246
  }
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::reset(llvm::StringRef)
Line
Count
Source
447
82
  void reset(llvm::StringRef Mangled) {
448
82
    Base::reset(Mangled.begin(), Mangled.end());
449
82
    Written = Mangled.begin();
450
82
    Result.clear();
451
82
    Substituted = false;
452
82
  }
453
454
328
  ConstString substituteImpl(llvm::StringRef Mangled) {
455
328
    Log *log = GetLog(LLDBLog::Language);
456
328
    if (this->parse() == nullptr) {
457
12
      LLDB_LOG(log, "Failed to substitute mangling in {0}", Mangled);
458
12
      return ConstString();
459
12
    }
460
316
    if (!Substituted)
461
298
      return ConstString();
462
463
    // Append any trailing unmodified input.
464
18
    appendUnchangedInput();
465
18
    LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);
466
18
    return ConstString(Result);
467
316
  }
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::substituteImpl(llvm::StringRef)
Line
Count
Source
454
246
  ConstString substituteImpl(llvm::StringRef Mangled) {
455
246
    Log *log = GetLog(LLDBLog::Language);
456
246
    if (this->parse() == nullptr) {
457
9
      LLDB_LOG(log, "Failed to substitute mangling in {0}", Mangled);
458
9
      return ConstString();
459
9
    }
460
237
    if (!Substituted)
461
233
      return ConstString();
462
463
    // Append any trailing unmodified input.
464
4
    appendUnchangedInput();
465
4
    LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);
466
4
    return ConstString(Result);
467
237
  }
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::substituteImpl(llvm::StringRef)
Line
Count
Source
454
82
  ConstString substituteImpl(llvm::StringRef Mangled) {
455
82
    Log *log = GetLog(LLDBLog::Language);
456
82
    if (this->parse() == nullptr) {
457
3
      LLDB_LOG(log, "Failed to substitute mangling in {0}", Mangled);
458
3
      return ConstString();
459
3
    }
460
79
    if (!Substituted)
461
65
      return ConstString();
462
463
    // Append any trailing unmodified input.
464
14
    appendUnchangedInput();
465
14
    LLDB_LOG(log, "Substituted mangling {0} -> {1}", Mangled, Result);
466
14
    return ConstString(Result);
467
79
  }
468
469
778
  void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
470
778
    if (!llvm::StringRef(currentParserPos(), this->numLeft()).startswith(From))
471
760
      return;
472
473
    // We found a match. Append unmodified input up to this point.
474
18
    appendUnchangedInput();
475
476
    // And then perform the replacement.
477
18
    Result += To;
478
18
    Written += From.size();
479
18
    Substituted = true;
480
18
  }
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::trySubstitute(llvm::StringRef, llvm::StringRef)
Line
Count
Source
469
750
  void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
470
750
    if (!llvm::StringRef(currentParserPos(), this->numLeft()).startswith(From))
471
746
      return;
472
473
    // We found a match. Append unmodified input up to this point.
474
4
    appendUnchangedInput();
475
476
    // And then perform the replacement.
477
4
    Result += To;
478
4
    Written += From.size();
479
4
    Substituted = true;
480
4
  }
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::trySubstitute(llvm::StringRef, llvm::StringRef)
Line
Count
Source
469
28
  void trySubstitute(llvm::StringRef From, llvm::StringRef To) {
470
28
    if (!llvm::StringRef(currentParserPos(), this->numLeft()).startswith(From))
471
14
      return;
472
473
    // We found a match. Append unmodified input up to this point.
474
14
    appendUnchangedInput();
475
476
    // And then perform the replacement.
477
14
    Result += To;
478
14
    Written += From.size();
479
14
    Substituted = true;
480
14
  }
481
482
private:
483
  /// Input character until which we have constructed the respective output
484
  /// already.
485
  const char *Written = "";
486
487
  llvm::SmallString<128> Result;
488
489
  /// Whether we have performed any substitutions.
490
  bool Substituted = false;
491
492
850
  const char *currentParserPos() const { return this->First; }
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::currentParserPos() const
Line
Count
Source
492
766
  const char *currentParserPos() const { return this->First; }
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::currentParserPos() const
Line
Count
Source
492
84
  const char *currentParserPos() const { return this->First; }
493
494
36
  void appendUnchangedInput() {
495
36
    Result +=
496
36
        llvm::StringRef(Written, std::distance(Written, currentParserPos()));
497
36
    Written = currentParserPos();
498
36
  }
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::TypeSubstitutor>::appendUnchangedInput()
Line
Count
Source
494
8
  void appendUnchangedInput() {
495
8
    Result +=
496
8
        llvm::StringRef(Written, std::distance(Written, currentParserPos()));
497
8
    Written = currentParserPos();
498
8
  }
CPlusPlusLanguage.cpp:(anonymous namespace)::ManglingSubstitutor<(anonymous namespace)::CtorDtorSubstitutor>::appendUnchangedInput()
Line
Count
Source
494
28
  void appendUnchangedInput() {
495
28
    Result +=
496
28
        llvm::StringRef(Written, std::distance(Written, currentParserPos()));
497
28
    Written = currentParserPos();
498
28
  }
499
};
500
501
/// Given a mangled function `Mangled`, replace all the primitive function type
502
/// arguments of `Search` with type `Replace`.
503
class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> {
504
  llvm::StringRef Search;
505
  llvm::StringRef Replace;
506
507
public:
508
  void reset(llvm::StringRef Mangled, llvm::StringRef Search,
509
246
             llvm::StringRef Replace) {
510
246
    ManglingSubstitutor::reset(Mangled);
511
246
    this->Search = Search;
512
246
    this->Replace = Replace;
513
246
  }
514
515
750
  llvm::itanium_demangle::Node *parseType() {
516
750
    trySubstitute(Search, Replace);
517
750
    return ManglingSubstitutor::parseType();
518
750
  }
519
};
520
521
class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> {
522
public:
523
  llvm::itanium_demangle::Node *
524
14
  parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) {
525
14
    trySubstitute("C1", "C2");
526
14
    trySubstitute("D1", "D2");
527
14
    return ManglingSubstitutor::parseCtorDtorName(SoFar, State);
528
14
  }
529
};
530
} // namespace
531
532
std::vector<ConstString> CPlusPlusLanguage::GenerateAlternateFunctionManglings(
533
82
    const ConstString mangled_name) const {
534
82
  std::vector<ConstString> alternates;
535
536
  /// Get a basic set of alternative manglings for the given symbol `name`, by
537
  /// making a few basic possible substitutions on basic types, storage duration
538
  /// and `const`ness for the given symbol. The output parameter `alternates`
539
  /// is filled with a best-guess, non-exhaustive set of different manglings
540
  /// for the given name.
541
542
  // Maybe we're looking for a const symbol but the debug info told us it was
543
  // non-const...
544
82
  if (!strncmp(mangled_name.GetCString(), "_ZN", 3) &&
545
82
      
strncmp(mangled_name.GetCString(), "_ZNK", 4)35
) {
546
33
    std::string fixed_scratch("_ZNK");
547
33
    fixed_scratch.append(mangled_name.GetCString() + 3);
548
33
    alternates.push_back(ConstString(fixed_scratch));
549
33
  }
550
551
  // Maybe we're looking for a static symbol but we thought it was global...
552
82
  if (!strncmp(mangled_name.GetCString(), "_Z", 2) &&
553
82
      
strncmp(mangled_name.GetCString(), "_ZL", 3)43
) {
554
43
    std::string fixed_scratch("_ZL");
555
43
    fixed_scratch.append(mangled_name.GetCString() + 2);
556
43
    alternates.push_back(ConstString(fixed_scratch));
557
43
  }
558
559
82
  TypeSubstitutor TS;
560
  // `char` is implementation defined as either `signed` or `unsigned`.  As a
561
  // result a char parameter has 3 possible manglings: 'c'-char, 'a'-signed
562
  // char, 'h'-unsigned char.  If we're looking for symbols with a signed char
563
  // parameter, try finding matches which have the general case 'c'.
564
82
  if (ConstString char_fixup =
565
82
          TS.substitute(mangled_name.GetStringRef(), "a", "c"))
566
2
    alternates.push_back(char_fixup);
567
568
  // long long parameter mangling 'x', may actually just be a long 'l' argument
569
82
  if (ConstString long_fixup =
570
82
          TS.substitute(mangled_name.GetStringRef(), "x", "l"))
571
1
    alternates.push_back(long_fixup);
572
573
  // unsigned long long parameter mangling 'y', may actually just be unsigned
574
  // long 'm' argument
575
82
  if (ConstString ulong_fixup =
576
82
          TS.substitute(mangled_name.GetStringRef(), "y", "m"))
577
1
    alternates.push_back(ulong_fixup);
578
579
82
  if (ConstString ctor_fixup =
580
82
          CtorDtorSubstitutor().substitute(mangled_name.GetStringRef()))
581
14
    alternates.push_back(ctor_fixup);
582
583
82
  return alternates;
584
82
}
585
586
ConstString CPlusPlusLanguage::FindBestAlternateFunctionMangledName(
587
36
    const Mangled mangled, const SymbolContext &sym_ctx) const {
588
36
  ConstString demangled = mangled.GetDemangledName();
589
36
  if (!demangled)
590
0
    return ConstString();
591
592
36
  CPlusPlusLanguage::MethodName cpp_name(demangled);
593
36
  std::string scope_qualified_name = cpp_name.GetScopeQualifiedName();
594
595
36
  if (!scope_qualified_name.size())
596
18
    return ConstString();
597
598
18
  if (!sym_ctx.module_sp)
599
0
    return ConstString();
600
601
18
  lldb_private::SymbolFile *sym_file = sym_ctx.module_sp->GetSymbolFile();
602
18
  if (!sym_file)
603
0
    return ConstString();
604
605
18
  std::vector<ConstString> alternates;
606
18
  sym_file->GetMangledNamesForFunction(scope_qualified_name, alternates);
607
608
18
  std::vector<ConstString> param_and_qual_matches;
609
18
  std::vector<ConstString> param_matches;
610
25
  for (size_t i = 0; i < alternates.size(); 
i++7
) {
611
7
    ConstString alternate_mangled_name = alternates[i];
612
7
    Mangled mangled(alternate_mangled_name);
613
7
    ConstString demangled = mangled.GetDemangledName();
614
615
7
    CPlusPlusLanguage::MethodName alternate_cpp_name(demangled);
616
7
    if (!cpp_name.IsValid())
617
0
      continue;
618
619
7
    if (alternate_cpp_name.GetArguments() == cpp_name.GetArguments()) {
620
1
      if (alternate_cpp_name.GetQualifiers() == cpp_name.GetQualifiers())
621
1
        param_and_qual_matches.push_back(alternate_mangled_name);
622
0
      else
623
0
        param_matches.push_back(alternate_mangled_name);
624
1
    }
625
7
  }
626
627
18
  if (param_and_qual_matches.size())
628
1
    return param_and_qual_matches[0]; // It is assumed that there will be only
629
                                      // one!
630
17
  else if (param_matches.size())
631
0
    return param_matches[0]; // Return one of them as a best match
632
17
  else
633
17
    return ConstString();
634
18
}
635
636
683
static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
637
683
  if (!cpp_category_sp)
638
0
    return;
639
640
683
  TypeSummaryImpl::Flags stl_summary_flags;
641
683
  stl_summary_flags.SetCascades(true)
642
683
      .SetSkipPointers(false)
643
683
      .SetSkipReferences(false)
644
683
      .SetDontShowChildren(true)
645
683
      .SetDontShowValue(true)
646
683
      .SetShowMembersOneLiner(false)
647
683
      .SetHideItemNames(false);
648
649
683
  AddCXXSummary(cpp_category_sp,
650
683
                lldb_private::formatters::LibcxxStringSummaryProviderASCII,
651
683
                "std::string summary provider", "^std::__[[:alnum:]]+::string$",
652
683
                stl_summary_flags, true);
653
683
  AddCXXSummary(cpp_category_sp,
654
683
                lldb_private::formatters::LibcxxStringSummaryProviderASCII,
655
683
                "std::string summary provider",
656
683
                "^std::__[[:alnum:]]+::basic_string<char, "
657
683
                "std::__[[:alnum:]]+::char_traits<char>, "
658
683
                "std::__[[:alnum:]]+::allocator<char> >$",
659
683
                stl_summary_flags, true);
660
683
  AddCXXSummary(cpp_category_sp,
661
683
                lldb_private::formatters::LibcxxStringSummaryProviderASCII,
662
683
                "std::string summary provider",
663
683
                "^std::__[[:alnum:]]+::basic_string<unsigned char, "
664
683
                "std::__[[:alnum:]]+::char_traits<unsigned char>, "
665
683
                "std::__[[:alnum:]]+::allocator<unsigned char> >$",
666
683
                stl_summary_flags, true);
667
668
683
  AddCXXSummary(cpp_category_sp,
669
683
                lldb_private::formatters::LibcxxStringSummaryProviderUTF16,
670
683
                "std::u16string summary provider",
671
683
                "^std::__[[:alnum:]]+::basic_string<char16_t, "
672
683
                "std::__[[:alnum:]]+::char_traits<char16_t>, "
673
683
                "std::__[[:alnum:]]+::allocator<char16_t> >$",
674
683
                stl_summary_flags, true);
675
676
683
  AddCXXSummary(cpp_category_sp,
677
683
                lldb_private::formatters::LibcxxStringSummaryProviderUTF32,
678
683
                "std::u32string summary provider",
679
683
                "^std::__[[:alnum:]]+::basic_string<char32_t, "
680
683
                "std::__[[:alnum:]]+::char_traits<char32_t>, "
681
683
                "std::__[[:alnum:]]+::allocator<char32_t> >$",
682
683
                stl_summary_flags, true);
683
684
683
  AddCXXSummary(cpp_category_sp,
685
683
                lldb_private::formatters::LibcxxWStringSummaryProvider,
686
683
                "std::wstring summary provider",
687
683
                "^std::__[[:alnum:]]+::wstring$", stl_summary_flags, true);
688
683
  AddCXXSummary(cpp_category_sp,
689
683
                lldb_private::formatters::LibcxxWStringSummaryProvider,
690
683
                "std::wstring summary provider",
691
683
                "^std::__[[:alnum:]]+::basic_string<wchar_t, "
692
683
                "std::__[[:alnum:]]+::char_traits<wchar_t>, "
693
683
                "std::__[[:alnum:]]+::allocator<wchar_t> >$",
694
683
                stl_summary_flags, true);
695
696
683
  AddCXXSummary(cpp_category_sp,
697
683
                lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,
698
683
                "std::string_view summary provider",
699
683
                "^std::__[[:alnum:]]+::string_view$", stl_summary_flags, true);
700
683
  AddCXXSummary(cpp_category_sp,
701
683
                lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,
702
683
                "std::string_view summary provider",
703
683
                "^std::__[[:alnum:]]+::basic_string_view<char, "
704
683
                "std::__[[:alnum:]]+::char_traits<char> >$",
705
683
                stl_summary_flags, true);
706
683
  AddCXXSummary(cpp_category_sp,
707
683
                lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,
708
683
                "std::string_view summary provider",
709
683
                "^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
710
683
                "std::__[[:alnum:]]+::char_traits<unsigned char> >$",
711
683
                stl_summary_flags, true);
712
713
683
  AddCXXSummary(cpp_category_sp,
714
683
                lldb_private::formatters::LibcxxStringViewSummaryProviderUTF16,
715
683
                "std::u16string_view summary provider",
716
683
                "^std::__[[:alnum:]]+::basic_string_view<char16_t, "
717
683
                "std::__[[:alnum:]]+::char_traits<char16_t> >$",
718
683
                stl_summary_flags, true);
719
720
683
  AddCXXSummary(cpp_category_sp,
721
683
                lldb_private::formatters::LibcxxStringViewSummaryProviderUTF32,
722
683
                "std::u32string_view summary provider",
723
683
                "^std::__[[:alnum:]]+::basic_string_view<char32_t, "
724
683
                "std::__[[:alnum:]]+::char_traits<char32_t> >$",
725
683
                stl_summary_flags, true);
726
727
683
  AddCXXSummary(cpp_category_sp,
728
683
                lldb_private::formatters::LibcxxWStringViewSummaryProvider,
729
683
                "std::wstring_view summary provider",
730
683
                "^std::__[[:alnum:]]+::wstring_view$", stl_summary_flags, true);
731
683
  AddCXXSummary(cpp_category_sp,
732
683
                lldb_private::formatters::LibcxxWStringViewSummaryProvider,
733
683
                "std::wstring_view summary provider",
734
683
                "^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
735
683
                "std::__[[:alnum:]]+::char_traits<wchar_t> >$",
736
683
                stl_summary_flags, true);
737
738
683
  SyntheticChildren::Flags stl_synth_flags;
739
683
  stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
740
683
      false);
741
683
  SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
742
683
  stl_deref_flags.SetFrontEndWantsDereference();
743
744
683
  AddCXXSynthetic(
745
683
      cpp_category_sp,
746
683
      lldb_private::formatters::LibcxxBitsetSyntheticFrontEndCreator,
747
683
      "libc++ std::bitset synthetic children",
748
683
      "^std::__[[:alnum:]]+::bitset<.+>(( )?&)?$", stl_deref_flags, true);
749
683
  AddCXXSynthetic(
750
683
      cpp_category_sp,
751
683
      lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator,
752
683
      "libc++ std::vector synthetic children",
753
683
      "^std::__[[:alnum:]]+::vector<.+>(( )?&)?$", stl_deref_flags, true);
754
683
  AddCXXSynthetic(
755
683
      cpp_category_sp,
756
683
      lldb_private::formatters::LibcxxStdForwardListSyntheticFrontEndCreator,
757
683
      "libc++ std::forward_list synthetic children",
758
683
      "^std::__[[:alnum:]]+::forward_list<.+>(( )?&)?$", stl_synth_flags, true);
759
683
  AddCXXSynthetic(
760
683
      cpp_category_sp,
761
683
      lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator,
762
683
      "libc++ std::list synthetic children",
763
      // A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>(( )?&)?$"
764
      // so that it does not clash with: "^std::(__cxx11::)?list<.+>(( )?&)?$"
765
683
      "^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"
766
683
      "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>(( )?&)?$",
767
683
      stl_deref_flags, true);
768
683
  AddCXXSynthetic(
769
683
      cpp_category_sp,
770
683
      lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
771
683
      "libc++ std::map synthetic children",
772
683
      "^std::__[[:alnum:]]+::map<.+> >(( )?&)?$", stl_synth_flags, true);
773
683
  AddCXXSynthetic(
774
683
      cpp_category_sp,
775
683
      lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
776
683
      "libc++ std::set synthetic children",
777
683
      "^std::__[[:alnum:]]+::set<.+> >(( )?&)?$", stl_deref_flags, true);
778
683
  AddCXXSynthetic(
779
683
      cpp_category_sp,
780
683
      lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
781
683
      "libc++ std::multiset synthetic children",
782
683
      "^std::__[[:alnum:]]+::multiset<.+> >(( )?&)?$", stl_deref_flags, true);
783
683
  AddCXXSynthetic(
784
683
      cpp_category_sp,
785
683
      lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator,
786
683
      "libc++ std::multimap synthetic children",
787
683
      "^std::__[[:alnum:]]+::multimap<.+> >(( )?&)?$", stl_synth_flags, true);
788
683
  AddCXXSynthetic(
789
683
      cpp_category_sp,
790
683
      lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator,
791
683
      "libc++ std::unordered containers synthetic children",
792
683
      "^(std::__[[:alnum:]]+::)unordered_(multi)?(map|set)<.+> >$",
793
683
      stl_synth_flags, true);
794
683
  AddCXXSynthetic(
795
683
      cpp_category_sp,
796
683
      lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator,
797
683
      "libc++ std::initializer_list synthetic children",
798
683
      "^std::initializer_list<.+>(( )?&)?$", stl_synth_flags, true);
799
683
  AddCXXSynthetic(cpp_category_sp, LibcxxQueueFrontEndCreator,
800
683
                  "libc++ std::queue synthetic children",
801
683
                  "^std::__[[:alnum:]]+::queue<.+>(( )?&)?$", stl_synth_flags,
802
683
                  true);
803
683
  AddCXXSynthetic(cpp_category_sp, LibcxxTupleFrontEndCreator,
804
683
                  "libc++ std::tuple synthetic children",
805
683
                  "^std::__[[:alnum:]]+::tuple<.*>(( )?&)?$", stl_synth_flags,
806
683
                  true);
807
683
  AddCXXSynthetic(cpp_category_sp, LibcxxOptionalSyntheticFrontEndCreator,
808
683
                  "libc++ std::optional synthetic children",
809
683
                  "^std::__[[:alnum:]]+::optional<.+>(( )?&)?$",
810
683
                  stl_synth_flags, true);
811
683
  AddCXXSynthetic(cpp_category_sp, LibcxxVariantFrontEndCreator,
812
683
                  "libc++ std::variant synthetic children",
813
683
                  "^std::__[[:alnum:]]+::variant<.+>(( )?&)?$", stl_synth_flags,
814
683
                  true);
815
683
  AddCXXSynthetic(
816
683
      cpp_category_sp,
817
683
      lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator,
818
683
      "libc++ std::atomic synthetic children",
819
683
      "^std::__[[:alnum:]]+::atomic<.+>$", stl_synth_flags, true);
820
683
  AddCXXSynthetic(
821
683
      cpp_category_sp,
822
683
      lldb_private::formatters::LibcxxStdSpanSyntheticFrontEndCreator,
823
683
      "libc++ std::span synthetic children",
824
683
      "^std::__[[:alnum:]]+::span<.+>(( )?&)?$", stl_deref_flags, true);
825
683
  AddCXXSynthetic(
826
683
      cpp_category_sp,
827
683
      lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEndCreator,
828
683
      "libc++ std::ranges::ref_view synthetic children",
829
683
      "^std::__[[:alnum:]]+::ranges::ref_view<.+>(( )?&)?$", stl_deref_flags,
830
683
      true);
831
832
683
  cpp_category_sp->AddTypeSynthetic(
833
683
      "^(std::__[[:alnum:]]+::)deque<.+>(( )?&)?$", eFormatterMatchRegex,
834
683
      SyntheticChildrenSP(new ScriptedSyntheticChildren(
835
683
          stl_synth_flags,
836
683
          "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
837
838
683
  AddCXXSynthetic(
839
683
      cpp_category_sp,
840
683
      lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator,
841
683
      "shared_ptr synthetic children",
842
683
      "^(std::__[[:alnum:]]+::)shared_ptr<.+>(( )?&)?$", stl_synth_flags, true);
843
844
683
  static constexpr const char *const libcxx_std_unique_ptr_regex =
845
683
      "^std::__[[:alnum:]]+::unique_ptr<.+>(( )?&)?$";
846
683
  AddCXXSynthetic(
847
683
      cpp_category_sp,
848
683
      lldb_private::formatters::LibcxxUniquePtrSyntheticFrontEndCreator,
849
683
      "unique_ptr synthetic children", libcxx_std_unique_ptr_regex,
850
683
      stl_synth_flags, true);
851
852
683
  AddCXXSynthetic(
853
683
      cpp_category_sp,
854
683
      lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator,
855
683
      "weak_ptr synthetic children",
856
683
      "^(std::__[[:alnum:]]+::)weak_ptr<.+>(( )?&)?$", stl_synth_flags, true);
857
683
  AddCXXSummary(cpp_category_sp,
858
683
                lldb_private::formatters::LibcxxFunctionSummaryProvider,
859
683
                "libc++ std::function summary provider",
860
683
                "^std::__[[:alnum:]]+::function<.+>$", stl_summary_flags, true);
861
862
683
  static constexpr const char *const libcxx_std_coroutine_handle_regex =
863
683
      "^std::__[[:alnum:]]+::coroutine_handle<.+>(( )?&)?$";
864
683
  AddCXXSynthetic(
865
683
      cpp_category_sp,
866
683
      lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEndCreator,
867
683
      "coroutine_handle synthetic children", libcxx_std_coroutine_handle_regex,
868
683
      stl_deref_flags, true);
869
870
683
  stl_summary_flags.SetDontShowChildren(false);
871
683
  stl_summary_flags.SetSkipPointers(false);
872
683
  AddCXXSummary(
873
683
      cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
874
683
      "libc++ std::bitset summary provider",
875
683
      "^std::__[[:alnum:]]+::bitset<.+>(( )?&)?$", stl_summary_flags, true);
876
683
  AddCXXSummary(
877
683
      cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
878
683
      "libc++ std::vector summary provider",
879
683
      "^std::__[[:alnum:]]+::vector<.+>(( )?&)?$", stl_summary_flags, true);
880
683
  AddCXXSummary(cpp_category_sp,
881
683
                lldb_private::formatters::LibcxxContainerSummaryProvider,
882
683
                "libc++ std::list summary provider",
883
683
                "^std::__[[:alnum:]]+::forward_list<.+>(( )?&)?$",
884
683
                stl_summary_flags, true);
885
683
  AddCXXSummary(
886
683
      cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
887
683
      "libc++ std::list summary provider",
888
      // A POSIX variant of: "^std::__(?!cxx11:)[[:alnum:]]+::list<.+>(( )?&)?$"
889
      // so that it does not clash with: "^std::(__cxx11::)?list<.+>(( )?&)?$"
890
683
      "^std::__([A-Zabd-z0-9]|cx?[A-Za-wyz0-9]|cxx1?[A-Za-z02-9]|"
891
683
      "cxx11[[:alnum:]])[[:alnum:]]*::list<.+>(( )?&)?$",
892
683
      stl_summary_flags, true);
893
683
  AddCXXSummary(
894
683
      cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
895
683
      "libc++ std::map summary provider",
896
683
      "^std::__[[:alnum:]]+::map<.+>(( )?&)?$", stl_summary_flags, true);
897
683
  AddCXXSummary(
898
683
      cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
899
683
      "libc++ std::deque summary provider",
900
683
      "^std::__[[:alnum:]]+::deque<.+>(( )?&)?$", stl_summary_flags, true);
901
683
  AddCXXSummary(
902
683
      cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
903
683
      "libc++ std::queue summary provider",
904
683
      "^std::__[[:alnum:]]+::queue<.+>(( )?&)?$", stl_summary_flags, true);
905
683
  AddCXXSummary(
906
683
      cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
907
683
      "libc++ std::set summary provider",
908
683
      "^std::__[[:alnum:]]+::set<.+>(( )?&)?$", stl_summary_flags, true);
909
683
  AddCXXSummary(
910
683
      cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
911
683
      "libc++ std::multiset summary provider",
912
683
      "^std::__[[:alnum:]]+::multiset<.+>(( )?&)?$", stl_summary_flags, true);
913
683
  AddCXXSummary(
914
683
      cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
915
683
      "libc++ std::multimap summary provider",
916
683
      "^std::__[[:alnum:]]+::multimap<.+>(( )?&)?$", stl_summary_flags, true);
917
683
  AddCXXSummary(cpp_category_sp,
918
683
                lldb_private::formatters::LibcxxContainerSummaryProvider,
919
683
                "libc++ std::unordered containers summary provider",
920
683
                "^(std::__[[:alnum:]]+::)unordered_(multi)?(map|set)<.+> >$",
921
683
                stl_summary_flags, true);
922
683
  AddCXXSummary(cpp_category_sp, LibcxxContainerSummaryProvider,
923
683
                "libc++ std::tuple summary provider",
924
683
                "^std::__[[:alnum:]]+::tuple<.*>(( )?&)?$", stl_summary_flags,
925
683
                true);
926
683
  AddCXXSummary(cpp_category_sp,
927
683
                lldb_private::formatters::LibCxxAtomicSummaryProvider,
928
683
                "libc++ std::atomic summary provider",
929
683
                "^std::__[[:alnum:]]+::atomic<.+>$", stl_summary_flags, true);
930
683
  AddCXXSummary(
931
683
      cpp_category_sp, lldb_private::formatters::GenericOptionalSummaryProvider,
932
683
      "libc++ std::optional summary provider",
933
683
      "^std::__[[:alnum:]]+::optional<.+>(( )?&)?$", stl_summary_flags, true);
934
683
  AddCXXSummary(
935
683
      cpp_category_sp, lldb_private::formatters::LibcxxVariantSummaryProvider,
936
683
      "libc++ std::variant summary provider",
937
683
      "^std::__[[:alnum:]]+::variant<.+>(( )?&)?$", stl_summary_flags, true);
938
683
  AddCXXSummary(
939
683
      cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider,
940
683
      "libc++ std::span summary provider",
941
683
      "^std::__[[:alnum:]]+::span<.+>(( )?&)?$", stl_summary_flags, true);
942
943
683
  stl_summary_flags.SetSkipPointers(true);
944
945
683
  AddCXXSummary(cpp_category_sp,
946
683
                lldb_private::formatters::LibcxxSmartPointerSummaryProvider,
947
683
                "libc++ std::shared_ptr summary provider",
948
683
                "^std::__[[:alnum:]]+::shared_ptr<.+>(( )?&)?$",
949
683
                stl_summary_flags, true);
950
683
  AddCXXSummary(cpp_category_sp,
951
683
                lldb_private::formatters::LibcxxSmartPointerSummaryProvider,
952
683
                "libc++ std::weak_ptr summary provider",
953
683
                "^std::__[[:alnum:]]+::weak_ptr<.+>(( )?&)?$",
954
683
                stl_summary_flags, true);
955
683
  AddCXXSummary(cpp_category_sp,
956
683
                lldb_private::formatters::LibcxxUniquePointerSummaryProvider,
957
683
                "libc++ std::unique_ptr summary provider",
958
683
                libcxx_std_unique_ptr_regex, stl_summary_flags, true);
959
960
683
  AddCXXSummary(cpp_category_sp,
961
683
                lldb_private::formatters::StdlibCoroutineHandleSummaryProvider,
962
683
                "libc++ std::coroutine_handle summary provider",
963
683
                libcxx_std_coroutine_handle_regex, stl_summary_flags, true);
964
965
683
  AddCXXSynthetic(
966
683
      cpp_category_sp,
967
683
      lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator,
968
683
      "std::vector iterator synthetic children",
969
683
      "^std::__[[:alnum:]]+::__wrap_iter<.+>$", stl_synth_flags, true);
970
971
683
  AddCXXSynthetic(
972
683
      cpp_category_sp,
973
683
      lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator,
974
683
      "std::map iterator synthetic children",
975
683
      "^std::__[[:alnum:]]+::__map_(const_)?iterator<.+>$", stl_synth_flags,
976
683
      true);
977
978
683
  AddCXXSynthetic(cpp_category_sp,
979
683
                  lldb_private::formatters::
980
683
                      LibCxxUnorderedMapIteratorSyntheticFrontEndCreator,
981
683
                  "std::unordered_map iterator synthetic children",
982
683
                  "^std::__[[:alnum:]]+::__hash_map_(const_)?iterator<.+>$",
983
683
                  stl_synth_flags, true);
984
683
}
985
986
683
static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
987
683
  if (!cpp_category_sp)
988
0
    return;
989
990
683
  TypeSummaryImpl::Flags stl_summary_flags;
991
683
  stl_summary_flags.SetCascades(true)
992
683
      .SetSkipPointers(false)
993
683
      .SetSkipReferences(false)
994
683
      .SetDontShowChildren(true)
995
683
      .SetDontShowValue(true)
996
683
      .SetShowMembersOneLiner(false)
997
683
      .SetHideItemNames(false);
998
999
683
  lldb::TypeSummaryImplSP std_string_summary_sp(
1000
683
      new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p}"));
1001
1002
683
  lldb::TypeSummaryImplSP cxx11_string_summary_sp(new CXXFunctionSummaryFormat(
1003
683
      stl_summary_flags, LibStdcppStringSummaryProvider,
1004
683
      "libstdc++ c++11 std::string summary provider"));
1005
683
  lldb::TypeSummaryImplSP cxx11_wstring_summary_sp(new CXXFunctionSummaryFormat(
1006
683
      stl_summary_flags, LibStdcppWStringSummaryProvider,
1007
683
      "libstdc++ c++11 std::wstring summary provider"));
1008
1009
683
  cpp_category_sp->AddTypeSummary("std::string", eFormatterMatchExact,
1010
683
                                  std_string_summary_sp);
1011
683
  cpp_category_sp->AddTypeSummary("std::basic_string<char>",
1012
683
                                  eFormatterMatchExact, std_string_summary_sp);
1013
683
  cpp_category_sp->AddTypeSummary(
1014
683
      "std::basic_string<char,std::char_traits<char>,std::allocator<char> >",
1015
683
      eFormatterMatchExact, std_string_summary_sp);
1016
683
  cpp_category_sp->AddTypeSummary(
1017
683
      "std::basic_string<char, std::char_traits<char>, std::allocator<char> >",
1018
683
      eFormatterMatchExact, std_string_summary_sp);
1019
1020
683
  cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact,
1021
683
                                  cxx11_string_summary_sp);
1022
683
  cpp_category_sp->AddTypeSummary(
1023
683
      "std::__cxx11::basic_string<char, std::char_traits<char>, "
1024
683
      "std::allocator<char> >",
1025
683
      eFormatterMatchExact, cxx11_string_summary_sp);
1026
683
  cpp_category_sp->AddTypeSummary("std::__cxx11::basic_string<unsigned char, "
1027
683
                                  "std::char_traits<unsigned char>, "
1028
683
                                  "std::allocator<unsigned char> >",
1029
683
                                  eFormatterMatchExact,
1030
683
                                  cxx11_string_summary_sp);
1031
1032
  // making sure we force-pick the summary for printing wstring (_M_p is a
1033
  // wchar_t*)
1034
683
  lldb::TypeSummaryImplSP std_wstring_summary_sp(
1035
683
      new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p%S}"));
1036
1037
683
  cpp_category_sp->AddTypeSummary("std::wstring", eFormatterMatchExact,
1038
683
                                  std_wstring_summary_sp);
1039
683
  cpp_category_sp->AddTypeSummary("std::basic_string<wchar_t>",
1040
683
                                  eFormatterMatchExact, std_wstring_summary_sp);
1041
683
  cpp_category_sp->AddTypeSummary("std::basic_string<wchar_t,std::char_traits<"
1042
683
                                  "wchar_t>,std::allocator<wchar_t> >",
1043
683
                                  eFormatterMatchExact, std_wstring_summary_sp);
1044
683
  cpp_category_sp->AddTypeSummary(
1045
683
      "std::basic_string<wchar_t, std::char_traits<wchar_t>, "
1046
683
      "std::allocator<wchar_t> >",
1047
683
      eFormatterMatchExact, std_wstring_summary_sp);
1048
1049
683
  cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact,
1050
683
                                  cxx11_wstring_summary_sp);
1051
683
  cpp_category_sp->AddTypeSummary(
1052
683
      "std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, "
1053
683
      "std::allocator<wchar_t> >",
1054
683
      eFormatterMatchExact, cxx11_wstring_summary_sp);
1055
1056
683
  SyntheticChildren::Flags stl_synth_flags;
1057
683
  stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
1058
683
      false);
1059
683
  SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
1060
683
  stl_deref_flags.SetFrontEndWantsDereference();
1061
1062
683
  cpp_category_sp->AddTypeSynthetic(
1063
683
      "^std::vector<.+>(( )?&)?$", eFormatterMatchRegex,
1064
683
      SyntheticChildrenSP(new ScriptedSyntheticChildren(
1065
683
          stl_synth_flags,
1066
683
          "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
1067
683
  cpp_category_sp->AddTypeSynthetic(
1068
683
      "^std::map<.+> >(( )?&)?$", eFormatterMatchRegex,
1069
683
      SyntheticChildrenSP(new ScriptedSyntheticChildren(
1070
683
          stl_synth_flags,
1071
683
          "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1072
683
  cpp_category_sp->AddTypeSynthetic(
1073
683
      "^std::deque<.+>(( )?&)?$", eFormatterMatchRegex,
1074
683
      SyntheticChildrenSP(new ScriptedSyntheticChildren(
1075
683
          stl_deref_flags,
1076
683
          "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
1077
683
  cpp_category_sp->AddTypeSynthetic(
1078
683
      "^std::set<.+> >(( )?&)?$", eFormatterMatchRegex,
1079
683
      SyntheticChildrenSP(new ScriptedSyntheticChildren(
1080
683
          stl_deref_flags,
1081
683
          "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1082
683
  cpp_category_sp->AddTypeSynthetic(
1083
683
      "^std::multimap<.+> >(( )?&)?$", eFormatterMatchRegex,
1084
683
      SyntheticChildrenSP(new ScriptedSyntheticChildren(
1085
683
          stl_deref_flags,
1086
683
          "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1087
683
  cpp_category_sp->AddTypeSynthetic(
1088
683
      "^std::multiset<.+> >(( )?&)?$", eFormatterMatchRegex,
1089
683
      SyntheticChildrenSP(new ScriptedSyntheticChildren(
1090
683
          stl_deref_flags,
1091
683
          "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
1092
683
  cpp_category_sp->AddTypeSynthetic(
1093
683
      "^std::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex,
1094
683
      SyntheticChildrenSP(new ScriptedSyntheticChildren(
1095
683
          stl_deref_flags,
1096
683
          "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
1097
683
  cpp_category_sp->AddTypeSynthetic(
1098
683
      "^std::(__cxx11::)?list<.+>(( )?&)?$", eFormatterMatchRegex,
1099
683
      SyntheticChildrenSP(new ScriptedSyntheticChildren(
1100
683
          stl_deref_flags,
1101
683
          "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
1102
683
  cpp_category_sp->AddTypeSynthetic(
1103
683
      "^std::(__cxx11::)?forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1104
683
      SyntheticChildrenSP(new ScriptedSyntheticChildren(
1105
683
          stl_synth_flags,
1106
683
          "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
1107
1108
683
  stl_summary_flags.SetDontShowChildren(false);
1109
683
  stl_summary_flags.SetSkipPointers(false);
1110
683
  cpp_category_sp->AddTypeSummary("^std::bitset<.+>(( )?&)?$",
1111
683
                                  eFormatterMatchRegex,
1112
683
                                  TypeSummaryImplSP(new StringSummaryFormat(
1113
683
                                      stl_summary_flags, "size=${svar%#}")));
1114
683
  cpp_category_sp->AddTypeSummary("^std::vector<.+>(( )?&)?$",
1115
683
                                  eFormatterMatchRegex,
1116
683
                                  TypeSummaryImplSP(new StringSummaryFormat(
1117
683
                                      stl_summary_flags, "size=${svar%#}")));
1118
683
  cpp_category_sp->AddTypeSummary("^std::map<.+> >(( )?&)?$",
1119
683
                                  eFormatterMatchRegex,
1120
683
                                  TypeSummaryImplSP(new StringSummaryFormat(
1121
683
                                      stl_summary_flags, "size=${svar%#}")));
1122
683
  cpp_category_sp->AddTypeSummary("^std::set<.+> >(( )?&)?$",
1123
683
                                  eFormatterMatchRegex,
1124
683
                                  TypeSummaryImplSP(new StringSummaryFormat(
1125
683
                                      stl_summary_flags, "size=${svar%#}")));
1126
683
  cpp_category_sp->AddTypeSummary("^std::deque<.+>(( )?&)?$",
1127
683
                                  eFormatterMatchRegex,
1128
683
                                  TypeSummaryImplSP(new StringSummaryFormat(
1129
683
                                      stl_summary_flags, "size=${svar%#}")));
1130
683
  cpp_category_sp->AddTypeSummary("^std::multimap<.+> >(( )?&)?$",
1131
683
                                  eFormatterMatchRegex,
1132
683
                                  TypeSummaryImplSP(new StringSummaryFormat(
1133
683
                                      stl_summary_flags, "size=${svar%#}")));
1134
683
  cpp_category_sp->AddTypeSummary("^std::multiset<.+> >(( )?&)?$",
1135
683
                                  eFormatterMatchRegex,
1136
683
                                  TypeSummaryImplSP(new StringSummaryFormat(
1137
683
                                      stl_summary_flags, "size=${svar%#}")));
1138
683
  cpp_category_sp->AddTypeSummary("^std::unordered_(multi)?(map|set)<.+> >$",
1139
683
                                  eFormatterMatchRegex,
1140
683
                                  TypeSummaryImplSP(new StringSummaryFormat(
1141
683
                                      stl_summary_flags, "size=${svar%#}")));
1142
683
  cpp_category_sp->AddTypeSummary("^std::(__cxx11::)?list<.+>(( )?&)?$",
1143
683
                                  eFormatterMatchRegex,
1144
683
                                  TypeSummaryImplSP(new StringSummaryFormat(
1145
683
                                      stl_summary_flags, "size=${svar%#}")));
1146
683
  cpp_category_sp->AddTypeSummary(
1147
683
      "^std::(__cxx11::)?forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
1148
683
      TypeSummaryImplSP(new ScriptSummaryFormat(
1149
683
          stl_summary_flags,
1150
683
          "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
1151
1152
683
  AddCXXSynthetic(
1153
683
      cpp_category_sp,
1154
683
      lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator,
1155
683
      "std::vector iterator synthetic children",
1156
683
      "^__gnu_cxx::__normal_iterator<.+>$", stl_synth_flags, true);
1157
1158
683
  AddCXXSynthetic(
1159
683
      cpp_category_sp,
1160
683
      lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator,
1161
683
      "std::map iterator synthetic children", "^std::_Rb_tree_iterator<.+>$",
1162
683
      stl_synth_flags, true);
1163
1164
683
  AddCXXSynthetic(
1165
683
      cpp_category_sp,
1166
683
      lldb_private::formatters::LibStdcppUniquePtrSyntheticFrontEndCreator,
1167
683
      "std::unique_ptr synthetic children", "^std::unique_ptr<.+>(( )?&)?$",
1168
683
      stl_synth_flags, true);
1169
683
  AddCXXSynthetic(
1170
683
      cpp_category_sp,
1171
683
      lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator,
1172
683
      "std::shared_ptr synthetic children", "^std::shared_ptr<.+>(( )?&)?$",
1173
683
      stl_synth_flags, true);
1174
683
  AddCXXSynthetic(
1175
683
      cpp_category_sp,
1176
683
      lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator,
1177
683
      "std::weak_ptr synthetic children", "^std::weak_ptr<.+>(( )?&)?$",
1178
683
      stl_synth_flags, true);
1179
683
  AddCXXSynthetic(
1180
683
      cpp_category_sp,
1181
683
      lldb_private::formatters::LibStdcppTupleSyntheticFrontEndCreator,
1182
683
      "std::tuple synthetic children", "^std::tuple<.+>(( )?&)?$",
1183
683
      stl_synth_flags, true);
1184
1185
683
  static constexpr const char *const libstdcpp_std_coroutine_handle_regex =
1186
683
      "^std::coroutine_handle<.+>(( )?&)?$";
1187
683
  AddCXXSynthetic(
1188
683
      cpp_category_sp,
1189
683
      lldb_private::formatters::StdlibCoroutineHandleSyntheticFrontEndCreator,
1190
683
      "std::coroutine_handle synthetic children",
1191
683
      libstdcpp_std_coroutine_handle_regex, stl_deref_flags, true);
1192
1193
683
  AddCXXSynthetic(
1194
683
      cpp_category_sp,
1195
683
      lldb_private::formatters::LibStdcppBitsetSyntheticFrontEndCreator,
1196
683
      "std::bitset synthetic child", "^std::bitset<.+>(( )?&)?$",
1197
683
      stl_deref_flags, true);
1198
1199
683
  AddCXXSynthetic(
1200
683
      cpp_category_sp,
1201
683
      lldb_private::formatters::LibStdcppOptionalSyntheticFrontEndCreator,
1202
683
      "std::optional synthetic child", "^std::optional<.+>(( )?&)?$",
1203
683
      stl_deref_flags, true);
1204
1205
683
  AddCXXSummary(cpp_category_sp,
1206
683
                lldb_private::formatters::LibStdcppUniquePointerSummaryProvider,
1207
683
                "libstdc++ std::unique_ptr summary provider",
1208
683
                "^std::unique_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1209
683
  AddCXXSummary(cpp_category_sp,
1210
683
                lldb_private::formatters::LibStdcppSmartPointerSummaryProvider,
1211
683
                "libstdc++ std::shared_ptr summary provider",
1212
683
                "^std::shared_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1213
683
  AddCXXSummary(cpp_category_sp,
1214
683
                lldb_private::formatters::LibStdcppSmartPointerSummaryProvider,
1215
683
                "libstdc++ std::weak_ptr summary provider",
1216
683
                "^std::weak_ptr<.+>(( )?&)?$", stl_summary_flags, true);
1217
683
  AddCXXSummary(cpp_category_sp,
1218
683
                lldb_private::formatters::StdlibCoroutineHandleSummaryProvider,
1219
683
                "libstdc++ std::coroutine_handle summary provider",
1220
683
                libstdcpp_std_coroutine_handle_regex, stl_summary_flags, true);
1221
683
  AddCXXSummary(cpp_category_sp,
1222
683
                lldb_private::formatters::GenericOptionalSummaryProvider,
1223
683
                "libstd++ std::optional summary provider",
1224
683
                "^std::optional<.+>(( )?&)?$", stl_summary_flags, true);
1225
683
}
1226
1227
683
static void LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
1228
683
  if (!cpp_category_sp)
1229
0
    return;
1230
1231
683
  TypeSummaryImpl::Flags string_flags;
1232
683
  string_flags.SetCascades(true)
1233
683
      .SetSkipPointers(true)
1234
683
      .SetSkipReferences(false)
1235
683
      .SetDontShowChildren(true)
1236
683
      .SetDontShowValue(false)
1237
683
      .SetShowMembersOneLiner(false)
1238
683
      .SetHideItemNames(false);
1239
1240
683
  TypeSummaryImpl::Flags string_array_flags;
1241
683
  string_array_flags.SetCascades(true)
1242
683
      .SetSkipPointers(true)
1243
683
      .SetSkipReferences(false)
1244
683
      .SetDontShowChildren(true)
1245
683
      .SetDontShowValue(true)
1246
683
      .SetShowMembersOneLiner(false)
1247
683
      .SetHideItemNames(false);
1248
1249
683
  AddCXXSummary(cpp_category_sp,
1250
683
                lldb_private::formatters::Char8StringSummaryProvider,
1251
683
                "char8_t * summary provider", "char8_t *", string_flags);
1252
683
  AddCXXSummary(cpp_category_sp,
1253
683
                lldb_private::formatters::Char8StringSummaryProvider,
1254
683
                "char8_t [] summary provider", "char8_t ?\\[[0-9]+\\]",
1255
683
                string_array_flags, true);
1256
1257
683
  AddCXXSummary(cpp_category_sp,
1258
683
                lldb_private::formatters::Char16StringSummaryProvider,
1259
683
                "char16_t * summary provider", "char16_t *", string_flags);
1260
683
  AddCXXSummary(cpp_category_sp,
1261
683
                lldb_private::formatters::Char16StringSummaryProvider,
1262
683
                "char16_t [] summary provider", "char16_t ?\\[[0-9]+\\]",
1263
683
                string_array_flags, true);
1264
1265
683
  AddCXXSummary(cpp_category_sp,
1266
683
                lldb_private::formatters::Char32StringSummaryProvider,
1267
683
                "char32_t * summary provider", "char32_t *", string_flags);
1268
683
  AddCXXSummary(cpp_category_sp,
1269
683
                lldb_private::formatters::Char32StringSummaryProvider,
1270
683
                "char32_t [] summary provider", "char32_t ?\\[[0-9]+\\]",
1271
683
                string_array_flags, true);
1272
1273
683
  AddCXXSummary(cpp_category_sp,
1274
683
                lldb_private::formatters::WCharStringSummaryProvider,
1275
683
                "wchar_t * summary provider", "wchar_t *", string_flags);
1276
683
  AddCXXSummary(cpp_category_sp,
1277
683
                lldb_private::formatters::WCharStringSummaryProvider,
1278
683
                "wchar_t * summary provider", "wchar_t ?\\[[0-9]+\\]",
1279
683
                string_array_flags, true);
1280
1281
683
  AddCXXSummary(cpp_category_sp,
1282
683
                lldb_private::formatters::Char16StringSummaryProvider,
1283
683
                "unichar * summary provider", "unichar *", string_flags);
1284
1285
683
  TypeSummaryImpl::Flags widechar_flags;
1286
683
  widechar_flags.SetDontShowValue(true)
1287
683
      .SetSkipPointers(true)
1288
683
      .SetSkipReferences(false)
1289
683
      .SetCascades(true)
1290
683
      .SetDontShowChildren(true)
1291
683
      .SetHideItemNames(true)
1292
683
      .SetShowMembersOneLiner(false);
1293
1294
683
  AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char8SummaryProvider,
1295
683
                "char8_t summary provider", "char8_t", widechar_flags);
1296
683
  AddCXXSummary(cpp_category_sp,
1297
683
                lldb_private::formatters::Char16SummaryProvider,
1298
683
                "char16_t summary provider", "char16_t", widechar_flags);
1299
683
  AddCXXSummary(cpp_category_sp,
1300
683
                lldb_private::formatters::Char32SummaryProvider,
1301
683
                "char32_t summary provider", "char32_t", widechar_flags);
1302
683
  AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharSummaryProvider,
1303
683
                "wchar_t summary provider", "wchar_t", widechar_flags);
1304
1305
683
  AddCXXSummary(cpp_category_sp,
1306
683
                lldb_private::formatters::Char16SummaryProvider,
1307
683
                "unichar summary provider", "unichar", widechar_flags);
1308
683
}
1309
1310
98
std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() {
1311
98
  class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger {
1312
98
  public:
1313
98
    CompilerType AdjustForInclusion(CompilerType &candidate) override {
1314
32
      LanguageType lang_type(candidate.GetMinimumLanguage());
1315
32
      if (!Language::LanguageIsC(lang_type) &&
1316
32
          
!Language::LanguageIsCPlusPlus(lang_type)31
)
1317
24
        return CompilerType();
1318
8
      if (candidate.IsTypedefType())
1319
2
        return candidate.GetTypedefedType();
1320
6
      return candidate;
1321
8
    }
1322
98
  };
1323
1324
98
  return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger());
1325
98
}
1326
1327
683
lldb::TypeCategoryImplSP CPlusPlusLanguage::GetFormatters() {
1328
683
  static llvm::once_flag g_initialize;
1329
683
  static TypeCategoryImplSP g_category;
1330
1331
683
  llvm::call_once(g_initialize, [this]() -> void {
1332
683
    DataVisualization::Categories::GetCategory(ConstString(GetPluginName()),
1333
683
                                               g_category);
1334
683
    if (g_category) {
1335
683
      LoadLibStdcppFormatters(g_category);
1336
683
      LoadLibCxxFormatters(g_category);
1337
683
      LoadSystemFormatters(g_category);
1338
683
    }
1339
683
  });
1340
683
  return g_category;
1341
683
}
1342
1343
HardcodedFormatters::HardcodedSummaryFinder
1344
683
CPlusPlusLanguage::GetHardcodedSummaries() {
1345
683
  static llvm::once_flag g_initialize;
1346
683
  static ConstString g_vectortypes("VectorTypes");
1347
683
  static HardcodedFormatters::HardcodedSummaryFinder g_formatters;
1348
1349
683
  llvm::call_once(g_initialize, []() -> void {
1350
683
    g_formatters.push_back(
1351
683
        [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
1352
60.7k
           FormatManager &) -> TypeSummaryImpl::SharedPointer {
1353
60.7k
          static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
1354
60.7k
              new CXXFunctionSummaryFormat(
1355
60.7k
                  TypeSummaryImpl::Flags(),
1356
60.7k
                  lldb_private::formatters::CXXFunctionPointerSummaryProvider,
1357
60.7k
                  "Function pointer summary provider"));
1358
60.7k
          if (CompilerType CT = valobj.GetCompilerType();
1359
60.7k
              CT.IsFunctionPointerType() || 
CT.IsMemberFunctionPointerType()60.6k
) {
1360
102
            return formatter_sp;
1361
102
          }
1362
60.6k
          return nullptr;
1363
60.7k
        });
1364
683
    g_formatters.push_back(
1365
683
        [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
1366
60.6k
           FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer {
1367
60.6k
          static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
1368
60.6k
              new CXXFunctionSummaryFormat(
1369
60.6k
                  TypeSummaryImpl::Flags()
1370
60.6k
                      .SetCascades(true)
1371
60.6k
                      .SetDontShowChildren(true)
1372
60.6k
                      .SetHideItemNames(true)
1373
60.6k
                      .SetShowMembersOneLiner(true)
1374
60.6k
                      .SetSkipPointers(true)
1375
60.6k
                      .SetSkipReferences(false),
1376
60.6k
                  lldb_private::formatters::VectorTypeSummaryProvider,
1377
60.6k
                  "vector_type pointer summary provider"));
1378
60.6k
          if (valobj.GetCompilerType().IsVectorType()) {
1379
600
            if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
1380
600
              return formatter_sp;
1381
600
          }
1382
60.0k
          return nullptr;
1383
60.6k
        });
1384
683
    g_formatters.push_back(
1385
683
        [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
1386
60.0k
           FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer {
1387
60.0k
          static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
1388
60.0k
              new CXXFunctionSummaryFormat(
1389
60.0k
                  TypeSummaryImpl::Flags()
1390
60.0k
                      .SetCascades(true)
1391
60.0k
                      .SetDontShowChildren(true)
1392
60.0k
                      .SetHideItemNames(true)
1393
60.0k
                      .SetShowMembersOneLiner(true)
1394
60.0k
                      .SetSkipPointers(true)
1395
60.0k
                      .SetSkipReferences(false),
1396
60.0k
                  lldb_private::formatters::BlockPointerSummaryProvider,
1397
60.0k
                  "block pointer summary provider"));
1398
60.0k
          if (valobj.GetCompilerType().IsBlockPointerType()) {
1399
8
            return formatter_sp;
1400
8
          }
1401
60.0k
          return nullptr;
1402
60.0k
        });
1403
683
  });
1404
1405
683
  return g_formatters;
1406
683
}
1407
1408
HardcodedFormatters::HardcodedSyntheticFinder
1409
683
CPlusPlusLanguage::GetHardcodedSynthetics() {
1410
683
  static llvm::once_flag g_initialize;
1411
683
  static ConstString g_vectortypes("VectorTypes");
1412
683
  static HardcodedFormatters::HardcodedSyntheticFinder g_formatters;
1413
1414
683
  llvm::call_once(g_initialize, []() -> void {
1415
683
    g_formatters.push_back([](lldb_private::ValueObject &valobj,
1416
683
                              lldb::DynamicValueType, FormatManager &fmt_mgr)
1417
63.6k
                               -> SyntheticChildren::SharedPointer {
1418
63.6k
      static CXXSyntheticChildren::SharedPointer formatter_sp(
1419
63.6k
          new CXXSyntheticChildren(
1420
63.6k
              SyntheticChildren::Flags()
1421
63.6k
                  .SetCascades(true)
1422
63.6k
                  .SetSkipPointers(true)
1423
63.6k
                  .SetSkipReferences(true)
1424
63.6k
                  .SetNonCacheable(true),
1425
63.6k
              "vector_type synthetic children",
1426
63.6k
              lldb_private::formatters::VectorTypeSyntheticFrontEndCreator));
1427
63.6k
      if (valobj.GetCompilerType().IsVectorType()) {
1428
637
        if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled())
1429
637
          return formatter_sp;
1430
637
      }
1431
62.9k
      return nullptr;
1432
63.6k
    });
1433
683
    g_formatters.push_back([](lldb_private::ValueObject &valobj,
1434
683
                              lldb::DynamicValueType, FormatManager &fmt_mgr)
1435
62.9k
                               -> SyntheticChildren::SharedPointer {
1436
62.9k
      static CXXSyntheticChildren::SharedPointer formatter_sp(
1437
62.9k
          new CXXSyntheticChildren(
1438
62.9k
              SyntheticChildren::Flags()
1439
62.9k
                  .SetCascades(true)
1440
62.9k
                  .SetSkipPointers(true)
1441
62.9k
                  .SetSkipReferences(true)
1442
62.9k
                  .SetNonCacheable(true),
1443
62.9k
              "block pointer synthetic children",
1444
62.9k
              lldb_private::formatters::BlockPointerSyntheticFrontEndCreator));
1445
62.9k
      if (valobj.GetCompilerType().IsBlockPointerType()) {
1446
8
        return formatter_sp;
1447
8
      }
1448
62.9k
      return nullptr;
1449
62.9k
    });
1450
683
  });
1451
1452
683
  return g_formatters;
1453
683
}
1454
1455
8.19k
bool CPlusPlusLanguage::IsNilReference(ValueObject &valobj) {
1456
8.19k
  if (!Language::LanguageIsCPlusPlus(valobj.GetObjectRuntimeLanguage()) ||
1457
8.19k
      !valobj.IsPointerType())
1458
7.54k
    return false;
1459
654
  bool canReadValue = true;
1460
654
  bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0;
1461
654
  return canReadValue && isZero;
1462
8.19k
}
1463
1464
9.99k
bool CPlusPlusLanguage::IsSourceFile(llvm::StringRef file_path) const {
1465
9.99k
  const auto suffixes = {".cpp", ".cxx", ".c++", ".cc",  ".c",
1466
9.99k
                         ".h",   ".hh",  ".hpp", ".hxx", ".h++"};
1467
28.5k
  for (auto suffix : suffixes) {
1468
28.5k
    if (file_path.ends_with_insensitive(suffix))
1469
9.07k
      return true;
1470
28.5k
  }
1471
1472
  // Check if we're in a STL path (where the files usually have no extension
1473
  // that we could check for.
1474
920
  return file_path.contains("/usr/include/c++/");
1475
9.99k
}
1476
1477
bool CPlusPlusLanguage::GetFunctionDisplayName(
1478
    const SymbolContext *sc, const ExecutionContext *exe_ctx,
1479
2.40k
    FunctionNameRepresentation representation, Stream &s) {
1480
2.40k
  switch (representation) {
1481
2.26k
  case FunctionNameRepresentation::eNameWithArgs: {
1482
    // Print the function name with arguments in it
1483
2.26k
    if (sc->function) {
1484
2.14k
      ExecutionContextScope *exe_scope =
1485
2.14k
          exe_ctx ? exe_ctx->GetBestExecutionContextScope() : 
nullptr0
;
1486
2.14k
      const char *cstr = sc->function->GetName().AsCString(nullptr);
1487
2.14k
      if (cstr) {
1488
2.14k
        const InlineFunctionInfo *inline_info = nullptr;
1489
2.14k
        VariableListSP variable_list_sp;
1490
2.14k
        bool get_function_vars = true;
1491
2.14k
        if (sc->block) {
1492
2.14k
          Block *inline_block = sc->block->GetContainingInlinedBlock();
1493
1494
2.14k
          if (inline_block) {
1495
18
            get_function_vars = false;
1496
18
            inline_info = sc->block->GetInlinedFunctionInfo();
1497
18
            if (inline_info)
1498
18
              variable_list_sp = inline_block->GetBlockVariableList(true);
1499
18
          }
1500
2.14k
        }
1501
1502
2.14k
        if (get_function_vars) {
1503
2.12k
          variable_list_sp =
1504
2.12k
              sc->function->GetBlock(true).GetBlockVariableList(true);
1505
2.12k
        }
1506
1507
2.14k
        if (inline_info) {
1508
18
          s.PutCString(cstr);
1509
18
          s.PutCString(" [inlined] ");
1510
18
          cstr = inline_info->GetName().GetCString();
1511
18
        }
1512
1513
2.14k
        VariableList args;
1514
2.14k
        if (variable_list_sp)
1515
2.14k
          variable_list_sp->AppendVariablesWithScope(eValueTypeVariableArgument,
1516
2.14k
                                                     args);
1517
2.14k
        if (args.GetSize() > 0) {
1518
1.17k
          if (!PrettyPrintFunctionNameWithArgs(s, cstr, exe_scope, args))
1519
460
            return false;
1520
1.17k
        } else {
1521
968
          s.PutCString(cstr);
1522
968
        }
1523
1.68k
        return true;
1524
2.14k
      }
1525
2.14k
    } else 
if (123
sc->symbol123
) {
1526
123
      const char *cstr = sc->symbol->GetName().AsCString(nullptr);
1527
123
      if (cstr) {
1528
123
        s.PutCString(cstr);
1529
123
        return true;
1530
123
      }
1531
123
    }
1532
2.26k
  } 
break0
;
1533
137
  default:
1534
137
    return false;
1535
2.40k
  }
1536
1537
0
  return false;
1538
2.40k
}