xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1061da546Spatrick //===-- CPlusPlusLanguage.h -------------------------------------*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_CPLUSPLUS_CPLUSPLUSLANGUAGE_H
10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_LANGUAGE_CPLUSPLUS_CPLUSPLUSLANGUAGE_H
11061da546Spatrick 
12061da546Spatrick #include <set>
13061da546Spatrick #include <vector>
14061da546Spatrick 
15061da546Spatrick #include "llvm/ADT/StringRef.h"
16061da546Spatrick 
17061da546Spatrick #include "Plugins/Language/ClangCommon/ClangHighlighter.h"
18061da546Spatrick #include "lldb/Target/Language.h"
19061da546Spatrick #include "lldb/Utility/ConstString.h"
20061da546Spatrick #include "lldb/lldb-private.h"
21061da546Spatrick 
22061da546Spatrick namespace lldb_private {
23061da546Spatrick 
24061da546Spatrick class CPlusPlusLanguage : public Language {
25061da546Spatrick   ClangHighlighter m_highlighter;
26061da546Spatrick 
27061da546Spatrick public:
28061da546Spatrick   class MethodName {
29061da546Spatrick   public:
MethodName()30061da546Spatrick     MethodName()
31be691f3bSpatrick         : m_full(), m_basename(), m_context(), m_arguments(), m_qualifiers() {}
32061da546Spatrick 
MethodName(ConstString s)33061da546Spatrick     MethodName(ConstString s)
34061da546Spatrick         : m_full(s), m_basename(), m_context(), m_arguments(), m_qualifiers(),
35061da546Spatrick           m_parsed(false), m_parse_error(false) {}
36061da546Spatrick 
37061da546Spatrick     void Clear();
38061da546Spatrick 
IsValid()39061da546Spatrick     bool IsValid() {
40061da546Spatrick       if (!m_parsed)
41061da546Spatrick         Parse();
42061da546Spatrick       if (m_parse_error)
43061da546Spatrick         return false;
44061da546Spatrick       return (bool)m_full;
45061da546Spatrick     }
46061da546Spatrick 
GetFullName()47061da546Spatrick     ConstString GetFullName() const { return m_full; }
48061da546Spatrick 
49061da546Spatrick     std::string GetScopeQualifiedName();
50061da546Spatrick 
51061da546Spatrick     llvm::StringRef GetBasename();
52061da546Spatrick 
53061da546Spatrick     llvm::StringRef GetContext();
54061da546Spatrick 
55061da546Spatrick     llvm::StringRef GetArguments();
56061da546Spatrick 
57061da546Spatrick     llvm::StringRef GetQualifiers();
58061da546Spatrick 
59*f6aab3d8Srobert     /// Returns the methods return-type.
60*f6aab3d8Srobert     ///
61*f6aab3d8Srobert     /// Currently returns an empty llvm::StringRef
62*f6aab3d8Srobert     /// if the return-type is a function pointer.
63*f6aab3d8Srobert     llvm::StringRef GetReturnType();
64*f6aab3d8Srobert 
65*f6aab3d8Srobert     bool ContainsPath(llvm::StringRef path);
66*f6aab3d8Srobert 
67*f6aab3d8Srobert   private:
68*f6aab3d8Srobert     /// Returns the Basename of this method without a template parameter
69*f6aab3d8Srobert     /// list, if any.
70*f6aab3d8Srobert     ///
71*f6aab3d8Srobert     // Examples:
72*f6aab3d8Srobert     //
73*f6aab3d8Srobert     //   +--------------------------------+---------+
74*f6aab3d8Srobert     //   | MethodName                     | Returns |
75*f6aab3d8Srobert     //   +--------------------------------+---------+
76*f6aab3d8Srobert     //   | void func()                    | func    |
77*f6aab3d8Srobert     //   | void func<int>()               | func    |
78*f6aab3d8Srobert     //   | void func<std::vector<int>>()  | func    |
79*f6aab3d8Srobert     //   +--------------------------------+---------+
80*f6aab3d8Srobert     llvm::StringRef GetBasenameNoTemplateParameters();
81*f6aab3d8Srobert 
82061da546Spatrick   protected:
83061da546Spatrick     void Parse();
84061da546Spatrick     bool TrySimplifiedParse();
85061da546Spatrick 
86061da546Spatrick     ConstString m_full; // Full name:
87*f6aab3d8Srobert                         // "size_t lldb::SBTarget::GetBreakpointAtIndex(unsigned
88*f6aab3d8Srobert                         // int) const"
89061da546Spatrick     llvm::StringRef m_basename;    // Basename:     "GetBreakpointAtIndex"
90061da546Spatrick     llvm::StringRef m_context;     // Decl context: "lldb::SBTarget"
91061da546Spatrick     llvm::StringRef m_arguments;   // Arguments:    "(unsigned int)"
92061da546Spatrick     llvm::StringRef m_qualifiers;  // Qualifiers:   "const"
93*f6aab3d8Srobert     llvm::StringRef m_return_type; // Return type:  "size_t"
94be691f3bSpatrick     bool m_parsed = false;
95be691f3bSpatrick     bool m_parse_error = false;
96061da546Spatrick   };
97061da546Spatrick 
98061da546Spatrick   CPlusPlusLanguage() = default;
99061da546Spatrick 
100061da546Spatrick   ~CPlusPlusLanguage() override = default;
101061da546Spatrick 
GetLanguageType()102061da546Spatrick   lldb::LanguageType GetLanguageType() const override {
103061da546Spatrick     return lldb::eLanguageTypeC_plus_plus;
104061da546Spatrick   }
105061da546Spatrick 
106061da546Spatrick   std::unique_ptr<TypeScavenger> GetTypeScavenger() override;
107061da546Spatrick   lldb::TypeCategoryImplSP GetFormatters() override;
108061da546Spatrick 
109061da546Spatrick   HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override;
110061da546Spatrick 
111061da546Spatrick   HardcodedFormatters::HardcodedSyntheticFinder
112061da546Spatrick   GetHardcodedSynthetics() override;
113061da546Spatrick 
114be691f3bSpatrick   bool IsNilReference(ValueObject &valobj) override;
115be691f3bSpatrick 
GetNilReferenceSummaryString()116be691f3bSpatrick   llvm::StringRef GetNilReferenceSummaryString() override { return "nullptr"; }
117be691f3bSpatrick 
118061da546Spatrick   bool IsSourceFile(llvm::StringRef file_path) const override;
119061da546Spatrick 
GetHighlighter()120061da546Spatrick   const Highlighter *GetHighlighter() const override { return &m_highlighter; }
121061da546Spatrick 
122061da546Spatrick   // Static Functions
123061da546Spatrick   static void Initialize();
124061da546Spatrick 
125061da546Spatrick   static void Terminate();
126061da546Spatrick 
127061da546Spatrick   static lldb_private::Language *CreateInstance(lldb::LanguageType language);
128061da546Spatrick 
GetPluginNameStatic()129*f6aab3d8Srobert   static llvm::StringRef GetPluginNameStatic() { return "cplusplus"; }
130061da546Spatrick 
131be691f3bSpatrick   bool SymbolNameFitsToLanguage(Mangled mangled) const override;
132be691f3bSpatrick 
133*f6aab3d8Srobert   bool DemangledNameContainsPath(llvm::StringRef path,
134*f6aab3d8Srobert                                  ConstString demangled) const override;
135*f6aab3d8Srobert 
136*f6aab3d8Srobert   ConstString
137*f6aab3d8Srobert   GetDemangledFunctionNameWithoutArguments(Mangled mangled) const override;
138*f6aab3d8Srobert 
139*f6aab3d8Srobert   bool GetFunctionDisplayName(const SymbolContext *sc,
140*f6aab3d8Srobert                               const ExecutionContext *exe_ctx,
141*f6aab3d8Srobert                               FunctionNameRepresentation representation,
142*f6aab3d8Srobert                               Stream &s) override;
143*f6aab3d8Srobert 
144061da546Spatrick   static bool IsCPPMangledName(llvm::StringRef name);
145061da546Spatrick 
146061da546Spatrick   // Extract C++ context and identifier from a string using heuristic matching
147061da546Spatrick   // (as opposed to
148061da546Spatrick   // CPlusPlusLanguage::MethodName which has to have a fully qualified C++ name
149061da546Spatrick   // with parens and arguments.
150061da546Spatrick   // If the name is a lone C identifier (e.g. C) or a qualified C identifier
151061da546Spatrick   // (e.g. A::B::C) it will return true,
152061da546Spatrick   // and identifier will be the identifier (C and C respectively) and the
153061da546Spatrick   // context will be "" and "A::B" respectively.
154061da546Spatrick   // If the name fails the heuristic matching for a qualified or unqualified
155061da546Spatrick   // C/C++ identifier, then it will return false
156061da546Spatrick   // and identifier and context will be unchanged.
157061da546Spatrick 
158061da546Spatrick   static bool ExtractContextAndIdentifier(const char *name,
159061da546Spatrick                                           llvm::StringRef &context,
160061da546Spatrick                                           llvm::StringRef &identifier);
161061da546Spatrick 
162*f6aab3d8Srobert   std::vector<ConstString>
163*f6aab3d8Srobert   GenerateAlternateFunctionManglings(const ConstString mangled) const override;
164*f6aab3d8Srobert 
165*f6aab3d8Srobert   ConstString FindBestAlternateFunctionMangledName(
166*f6aab3d8Srobert       const Mangled mangled, const SymbolContext &sym_ctx) const override;
167061da546Spatrick 
168061da546Spatrick   // PluginInterface protocol
GetPluginName()169*f6aab3d8Srobert   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
170061da546Spatrick };
171061da546Spatrick 
172061da546Spatrick } // namespace lldb_private
173061da546Spatrick 
174dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_LANGUAGE_CPLUSPLUS_CPLUSPLUSLANGUAGE_H
175