xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric //===-- CPlusPlusLanguage.h -------------------------------------*- C++ -*-===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #ifndef liblldb_CPlusPlusLanguage_h_
10*0b57cec5SDimitry Andric #define liblldb_CPlusPlusLanguage_h_
11*0b57cec5SDimitry Andric 
12*0b57cec5SDimitry Andric #include <set>
13*0b57cec5SDimitry Andric #include <vector>
14*0b57cec5SDimitry Andric 
15*0b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
16*0b57cec5SDimitry Andric 
17*0b57cec5SDimitry Andric #include "Plugins/Language/ClangCommon/ClangHighlighter.h"
18*0b57cec5SDimitry Andric #include "lldb/Target/Language.h"
19*0b57cec5SDimitry Andric #include "lldb/Utility/ConstString.h"
20*0b57cec5SDimitry Andric #include "lldb/lldb-private.h"
21*0b57cec5SDimitry Andric 
22*0b57cec5SDimitry Andric namespace lldb_private {
23*0b57cec5SDimitry Andric 
24*0b57cec5SDimitry Andric class CPlusPlusLanguage : public Language {
25*0b57cec5SDimitry Andric   ClangHighlighter m_highlighter;
26*0b57cec5SDimitry Andric 
27*0b57cec5SDimitry Andric public:
28*0b57cec5SDimitry Andric   class MethodName {
29*0b57cec5SDimitry Andric   public:
30*0b57cec5SDimitry Andric     MethodName()
31*0b57cec5SDimitry Andric         : m_full(), m_basename(), m_context(), m_arguments(), m_qualifiers(),
32*0b57cec5SDimitry Andric           m_parsed(false), m_parse_error(false) {}
33*0b57cec5SDimitry Andric 
34*0b57cec5SDimitry Andric     MethodName(ConstString s)
35*0b57cec5SDimitry Andric         : m_full(s), m_basename(), m_context(), m_arguments(), m_qualifiers(),
36*0b57cec5SDimitry Andric           m_parsed(false), m_parse_error(false) {}
37*0b57cec5SDimitry Andric 
38*0b57cec5SDimitry Andric     void Clear();
39*0b57cec5SDimitry Andric 
40*0b57cec5SDimitry Andric     bool IsValid() {
41*0b57cec5SDimitry Andric       if (!m_parsed)
42*0b57cec5SDimitry Andric         Parse();
43*0b57cec5SDimitry Andric       if (m_parse_error)
44*0b57cec5SDimitry Andric         return false;
45*0b57cec5SDimitry Andric       return (bool)m_full;
46*0b57cec5SDimitry Andric     }
47*0b57cec5SDimitry Andric 
48*0b57cec5SDimitry Andric     ConstString GetFullName() const { return m_full; }
49*0b57cec5SDimitry Andric 
50*0b57cec5SDimitry Andric     std::string GetScopeQualifiedName();
51*0b57cec5SDimitry Andric 
52*0b57cec5SDimitry Andric     llvm::StringRef GetBasename();
53*0b57cec5SDimitry Andric 
54*0b57cec5SDimitry Andric     llvm::StringRef GetContext();
55*0b57cec5SDimitry Andric 
56*0b57cec5SDimitry Andric     llvm::StringRef GetArguments();
57*0b57cec5SDimitry Andric 
58*0b57cec5SDimitry Andric     llvm::StringRef GetQualifiers();
59*0b57cec5SDimitry Andric 
60*0b57cec5SDimitry Andric   protected:
61*0b57cec5SDimitry Andric     void Parse();
62*0b57cec5SDimitry Andric     bool TrySimplifiedParse();
63*0b57cec5SDimitry Andric 
64*0b57cec5SDimitry Andric     ConstString m_full; // Full name:
65*0b57cec5SDimitry Andric                         // "lldb::SBTarget::GetBreakpointAtIndex(unsigned int)
66*0b57cec5SDimitry Andric                         // const"
67*0b57cec5SDimitry Andric     llvm::StringRef m_basename;   // Basename:     "GetBreakpointAtIndex"
68*0b57cec5SDimitry Andric     llvm::StringRef m_context;    // Decl context: "lldb::SBTarget"
69*0b57cec5SDimitry Andric     llvm::StringRef m_arguments;  // Arguments:    "(unsigned int)"
70*0b57cec5SDimitry Andric     llvm::StringRef m_qualifiers; // Qualifiers:   "const"
71*0b57cec5SDimitry Andric     bool m_parsed;
72*0b57cec5SDimitry Andric     bool m_parse_error;
73*0b57cec5SDimitry Andric   };
74*0b57cec5SDimitry Andric 
75*0b57cec5SDimitry Andric   CPlusPlusLanguage() = default;
76*0b57cec5SDimitry Andric 
77*0b57cec5SDimitry Andric   ~CPlusPlusLanguage() override = default;
78*0b57cec5SDimitry Andric 
79*0b57cec5SDimitry Andric   lldb::LanguageType GetLanguageType() const override {
80*0b57cec5SDimitry Andric     return lldb::eLanguageTypeC_plus_plus;
81*0b57cec5SDimitry Andric   }
82*0b57cec5SDimitry Andric 
83*0b57cec5SDimitry Andric   std::unique_ptr<TypeScavenger> GetTypeScavenger() override;
84*0b57cec5SDimitry Andric   lldb::TypeCategoryImplSP GetFormatters() override;
85*0b57cec5SDimitry Andric 
86*0b57cec5SDimitry Andric   HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override;
87*0b57cec5SDimitry Andric 
88*0b57cec5SDimitry Andric   HardcodedFormatters::HardcodedSyntheticFinder
89*0b57cec5SDimitry Andric   GetHardcodedSynthetics() override;
90*0b57cec5SDimitry Andric 
91*0b57cec5SDimitry Andric   bool IsSourceFile(llvm::StringRef file_path) const override;
92*0b57cec5SDimitry Andric 
93*0b57cec5SDimitry Andric   const Highlighter *GetHighlighter() const override { return &m_highlighter; }
94*0b57cec5SDimitry Andric 
95*0b57cec5SDimitry Andric   // Static Functions
96*0b57cec5SDimitry Andric   static void Initialize();
97*0b57cec5SDimitry Andric 
98*0b57cec5SDimitry Andric   static void Terminate();
99*0b57cec5SDimitry Andric 
100*0b57cec5SDimitry Andric   static lldb_private::Language *CreateInstance(lldb::LanguageType language);
101*0b57cec5SDimitry Andric 
102*0b57cec5SDimitry Andric   static lldb_private::ConstString GetPluginNameStatic();
103*0b57cec5SDimitry Andric 
104*0b57cec5SDimitry Andric   static bool IsCPPMangledName(const char *name);
105*0b57cec5SDimitry Andric 
106*0b57cec5SDimitry Andric   // Extract C++ context and identifier from a string using heuristic matching
107*0b57cec5SDimitry Andric   // (as opposed to
108*0b57cec5SDimitry Andric   // CPlusPlusLanguage::MethodName which has to have a fully qualified C++ name
109*0b57cec5SDimitry Andric   // with parens and arguments.
110*0b57cec5SDimitry Andric   // If the name is a lone C identifier (e.g. C) or a qualified C identifier
111*0b57cec5SDimitry Andric   // (e.g. A::B::C) it will return true,
112*0b57cec5SDimitry Andric   // and identifier will be the identifier (C and C respectively) and the
113*0b57cec5SDimitry Andric   // context will be "" and "A::B" respectively.
114*0b57cec5SDimitry Andric   // If the name fails the heuristic matching for a qualified or unqualified
115*0b57cec5SDimitry Andric   // C/C++ identifier, then it will return false
116*0b57cec5SDimitry Andric   // and identifier and context will be unchanged.
117*0b57cec5SDimitry Andric 
118*0b57cec5SDimitry Andric   static bool ExtractContextAndIdentifier(const char *name,
119*0b57cec5SDimitry Andric                                           llvm::StringRef &context,
120*0b57cec5SDimitry Andric                                           llvm::StringRef &identifier);
121*0b57cec5SDimitry Andric 
122*0b57cec5SDimitry Andric   // Given a mangled function name, calculates some alternative manglings since
123*0b57cec5SDimitry Andric   // the compiler mangling may not line up with the symbol we are expecting
124*0b57cec5SDimitry Andric   static uint32_t
125*0b57cec5SDimitry Andric   FindAlternateFunctionManglings(const ConstString mangled,
126*0b57cec5SDimitry Andric                                  std::set<ConstString> &candidates);
127*0b57cec5SDimitry Andric 
128*0b57cec5SDimitry Andric   // PluginInterface protocol
129*0b57cec5SDimitry Andric   ConstString GetPluginName() override;
130*0b57cec5SDimitry Andric 
131*0b57cec5SDimitry Andric   uint32_t GetPluginVersion() override;
132*0b57cec5SDimitry Andric };
133*0b57cec5SDimitry Andric 
134*0b57cec5SDimitry Andric } // namespace lldb_private
135*0b57cec5SDimitry Andric 
136*0b57cec5SDimitry Andric #endif // liblldb_CPlusPlusLanguage_h_
137