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