CPlusPlusLanguage.h revision 360784
1218885Sdim//===-- CPlusPlusLanguage.h -------------------------------------*- C++ -*-===// 2218885Sdim// 3218885Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4218885Sdim// See https://llvm.org/LICENSE.txt for license information. 5218885Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6218885Sdim// 7218885Sdim//===----------------------------------------------------------------------===// 8218885Sdim 9218885Sdim#ifndef liblldb_CPlusPlusLanguage_h_ 10218885Sdim#define liblldb_CPlusPlusLanguage_h_ 11218885Sdim 12218885Sdim#include <set> 13218885Sdim#include <vector> 14218885Sdim 15218885Sdim#include "llvm/ADT/StringRef.h" 16218885Sdim 17218885Sdim#include "Plugins/Language/ClangCommon/ClangHighlighter.h" 18218885Sdim#include "lldb/Target/Language.h" 19218885Sdim#include "lldb/Utility/ConstString.h" 20218885Sdim#include "lldb/lldb-private.h" 21218885Sdim 22218885Sdimnamespace lldb_private { 23218885Sdim 24218885Sdimclass CPlusPlusLanguage : public Language { 25218885Sdim ClangHighlighter m_highlighter; 26218885Sdim 27218885Sdimpublic: 28218885Sdim class MethodName { 29218885Sdim public: 30218885Sdim MethodName() 31218885Sdim : m_full(), m_basename(), m_context(), m_arguments(), m_qualifiers(), 32218885Sdim m_parsed(false), m_parse_error(false) {} 33218885Sdim 34218885Sdim MethodName(ConstString s) 35218885Sdim : m_full(s), m_basename(), m_context(), m_arguments(), m_qualifiers(), 36218885Sdim m_parsed(false), m_parse_error(false) {} 37218885Sdim 38218885Sdim void Clear(); 39218885Sdim 40218885Sdim bool IsValid() { 41218885Sdim if (!m_parsed) 42218885Sdim Parse(); 43218885Sdim if (m_parse_error) 44218885Sdim return false; 45218885Sdim return (bool)m_full; 46218885Sdim } 47218885Sdim 48218885Sdim ConstString GetFullName() const { return m_full; } 49218885Sdim 50218885Sdim std::string GetScopeQualifiedName(); 51218885Sdim 52218885Sdim llvm::StringRef GetBasename(); 53218885Sdim 54218885Sdim llvm::StringRef GetContext(); 55218885Sdim 56218885Sdim llvm::StringRef GetArguments(); 57218885Sdim 58218885Sdim llvm::StringRef GetQualifiers(); 59218885Sdim 60218885Sdim protected: 61218885Sdim void Parse(); 62218885Sdim bool TrySimplifiedParse(); 63218885Sdim 64218885Sdim ConstString m_full; // Full name: 65218885Sdim // "lldb::SBTarget::GetBreakpointAtIndex(unsigned int) 66218885Sdim // const" 67218885Sdim llvm::StringRef m_basename; // Basename: "GetBreakpointAtIndex" 68218885Sdim llvm::StringRef m_context; // Decl context: "lldb::SBTarget" 69218885Sdim llvm::StringRef m_arguments; // Arguments: "(unsigned int)" 70218885Sdim llvm::StringRef m_qualifiers; // Qualifiers: "const" 71218885Sdim bool m_parsed; 72218885Sdim bool m_parse_error; 73218885Sdim }; 74218885Sdim 75218885Sdim CPlusPlusLanguage() = default; 76218885Sdim 77218885Sdim ~CPlusPlusLanguage() override = default; 78218885Sdim 79218885Sdim lldb::LanguageType GetLanguageType() const override { 80218885Sdim return lldb::eLanguageTypeC_plus_plus; 81218885Sdim } 82218885Sdim 83218885Sdim std::unique_ptr<TypeScavenger> GetTypeScavenger() override; 84218885Sdim lldb::TypeCategoryImplSP GetFormatters() override; 85218885Sdim 86218885Sdim HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override; 87218885Sdim 88218885Sdim HardcodedFormatters::HardcodedSyntheticFinder 89218885Sdim GetHardcodedSynthetics() override; 90218885Sdim 91218885Sdim bool IsSourceFile(llvm::StringRef file_path) const override; 92218885Sdim 93218885Sdim const Highlighter *GetHighlighter() const override { return &m_highlighter; } 94218885Sdim 95218885Sdim // Static Functions 96218885Sdim static void Initialize(); 97218885Sdim 98218885Sdim static void Terminate(); 99218885Sdim 100218885Sdim static lldb_private::Language *CreateInstance(lldb::LanguageType language); 101218885Sdim 102249423Sdim static lldb_private::ConstString GetPluginNameStatic(); 103218885Sdim 104218885Sdim static bool IsCPPMangledName(llvm::StringRef name); 105218885Sdim 106218885Sdim // Extract C++ context and identifier from a string using heuristic matching 107218885Sdim // (as opposed to 108218885Sdim // CPlusPlusLanguage::MethodName which has to have a fully qualified C++ name 109218885Sdim // with parens and arguments. 110218885Sdim // If the name is a lone C identifier (e.g. C) or a qualified C identifier 111218885Sdim // (e.g. A::B::C) it will return true, 112218885Sdim // and identifier will be the identifier (C and C respectively) and the 113218885Sdim // context will be "" and "A::B" respectively. 114218885Sdim // If the name fails the heuristic matching for a qualified or unqualified 115218885Sdim // C/C++ identifier, then it will return false 116218885Sdim // and identifier and context will be unchanged. 117218885Sdim 118218885Sdim static bool ExtractContextAndIdentifier(const char *name, 119218885Sdim llvm::StringRef &context, 120218885Sdim llvm::StringRef &identifier); 121218885Sdim 122218885Sdim // Given a mangled function name, calculates some alternative manglings since 123218885Sdim // the compiler mangling may not line up with the symbol we are expecting 124218885Sdim static uint32_t 125218885Sdim FindAlternateFunctionManglings(const ConstString mangled, 126218885Sdim std::set<ConstString> &candidates); 127218885Sdim 128218885Sdim // PluginInterface protocol 129218885Sdim ConstString GetPluginName() override; 130218885Sdim 131218885Sdim uint32_t GetPluginVersion() override; 132218885Sdim}; 133218885Sdim 134218885Sdim} // namespace lldb_private 135218885Sdim 136218885Sdim#endif // liblldb_CPlusPlusLanguage_h_ 137218885Sdim