Coverage Report

Created: 2022-01-18 06:27

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/Core/RichManglingContext.h
Line
Count
Source (jump to first uncovered line)
1
//===-- RichManglingContext.h -----------------------------------*- C++ -*-===//
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
#ifndef LLDB_CORE_RICHMANGLINGCONTEXT_H
10
#define LLDB_CORE_RICHMANGLINGCONTEXT_H
11
12
#include "lldb/lldb-forward.h"
13
#include "lldb/lldb-private.h"
14
15
#include "lldb/Utility/ConstString.h"
16
17
#include "llvm/ADT/Any.h"
18
#include "llvm/ADT/SmallString.h"
19
#include "llvm/Demangle/Demangle.h"
20
21
namespace lldb_private {
22
23
/// Uniform wrapper for access to rich mangling information from different
24
/// providers. See Mangled::DemangleWithRichManglingInfo()
25
class RichManglingContext {
26
public:
27
139k
  RichManglingContext() {
28
139k
    m_ipd_buf = static_cast<char *>(std::malloc(m_ipd_buf_size));
29
139k
    m_ipd_buf[0] = '\0';
30
139k
  }
31
32
  ~RichManglingContext();
33
34
  /// Use the ItaniumPartialDemangler to obtain rich mangling information from
35
  /// the given mangled name.
36
  bool FromItaniumName(ConstString mangled);
37
38
  /// Use the legacy language parser implementation to obtain rich mangling
39
  /// information from the given demangled name.
40
  bool FromCxxMethodName(ConstString demangled);
41
42
  /// If this symbol describes a constructor or destructor.
43
  bool IsCtorOrDtor() const;
44
45
  /// Get the base name of a function. This doesn't include trailing template
46
  /// arguments, ie "a::b<int>" gives "b". The result will overwrite the
47
  /// internal buffer. It can be obtained via GetBufferRef().
48
  void ParseFunctionBaseName();
49
50
  /// Get the context name for a function. For "a::b::c", this function returns
51
  /// "a::b". The result will overwrite the internal buffer. It can be obtained
52
  /// via GetBufferRef().
53
  void ParseFunctionDeclContextName();
54
55
  /// Get the entire demangled name. The result will overwrite the internal
56
  /// buffer. It can be obtained via GetBufferRef().
57
  void ParseFullName();
58
59
  /// Obtain a StringRef to the internal buffer that holds the result of the
60
  /// most recent ParseXy() operation. The next ParseXy() call invalidates it.
61
63.8M
  llvm::StringRef GetBufferRef() const {
62
63.8M
    assert(m_provider != None && "Initialize a provider first");
63
0
    return m_buffer;
64
63.8M
  }
65
66
private:
67
  enum InfoProvider { None, ItaniumPartialDemangler, PluginCxxLanguage };
68
69
  /// Selects the rich mangling info provider.
70
  InfoProvider m_provider = None;
71
72
  /// Reference to the buffer used for results of ParseXy() operations.
73
  llvm::StringRef m_buffer;
74
75
  /// Members for ItaniumPartialDemangler
76
  llvm::ItaniumPartialDemangler m_ipd;
77
  /// Note: m_ipd_buf is a raw pointer due to being resized by realloc via
78
  /// ItaniumPartialDemangler. It should be managed with malloc/free, not
79
  /// new/delete.
80
  char *m_ipd_buf;
81
  size_t m_ipd_buf_size = 2048;
82
83
  /// Members for PluginCxxLanguage
84
  /// Cannot forward declare inner class CPlusPlusLanguage::MethodName. The
85
  /// respective header is in Plugins and including it from here causes cyclic
86
  /// dependency. Instead keep a llvm::Any and cast it on-access in the cpp.
87
  llvm::Any m_cxx_method_parser;
88
89
  /// Clean up memory when using PluginCxxLanguage
90
  void ResetCxxMethodParser();
91
92
  /// Clean up memory and set a new info provider for this instance.
93
  void ResetProvider(InfoProvider new_provider);
94
95
  /// Uniform handling of string buffers for ItaniumPartialDemangler.
96
  void processIPDStrResult(char *ipd_res, size_t res_len);
97
98
  /// Cast the given parser to the given type. Ideally we would have a type
99
  /// trait to deduce \a ParserT from a given InfoProvider, but unfortunately we
100
  /// can't access CPlusPlusLanguage::MethodName from within the header.
101
10
  template <class ParserT> static ParserT *get(llvm::Any parser) {
102
10
    assert(parser.hasValue());
103
0
    assert(llvm::any_isa<ParserT *>(parser));
104
0
    return llvm::any_cast<ParserT *>(parser);
105
10
  }
106
};
107
108
} // namespace lldb_private
109
110
#endif