1 //===-- CPlusPlusLanguage.h -------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef liblldb_CPlusPlusLanguage_h_ 11 #define liblldb_CPlusPlusLanguage_h_ 12 13 // C Includes 14 // C++ Includes 15 #include <vector> 16 17 // Other libraries and framework includes 18 #include "llvm/ADT/StringRef.h" 19 20 // Project includes 21 #include "lldb/Core/ConstString.h" 22 #include "lldb/Target/Language.h" 23 #include "lldb/lldb-private.h" 24 25 namespace lldb_private { 26 27 class CPlusPlusLanguage : public Language { 28 public: 29 class MethodName { 30 public: 31 enum Type { 32 eTypeInvalid, 33 eTypeUnknownMethod, 34 eTypeClassMethod, 35 eTypeInstanceMethod 36 }; 37 38 MethodName() 39 : m_full(), m_basename(), m_context(), m_arguments(), m_qualifiers(), 40 m_type(eTypeInvalid), m_parsed(false), m_parse_error(false) {} 41 42 MethodName(const ConstString &s) 43 : m_full(s), m_basename(), m_context(), m_arguments(), m_qualifiers(), 44 m_type(eTypeInvalid), m_parsed(false), m_parse_error(false) {} 45 46 void Clear(); 47 48 bool IsValid() { 49 if (!m_parsed) 50 Parse(); 51 if (m_parse_error) 52 return false; 53 if (m_type == eTypeInvalid) 54 return false; 55 return (bool)m_full; 56 } 57 58 Type GetType() const { return m_type; } 59 60 const ConstString &GetFullName() const { return m_full; } 61 62 std::string GetScopeQualifiedName(); 63 64 llvm::StringRef GetBasename(); 65 66 llvm::StringRef GetContext(); 67 68 llvm::StringRef GetArguments(); 69 70 llvm::StringRef GetQualifiers(); 71 72 protected: 73 void Parse(); 74 75 ConstString m_full; // Full name: 76 // "lldb::SBTarget::GetBreakpointAtIndex(unsigned int) 77 // const" 78 llvm::StringRef m_basename; // Basename: "GetBreakpointAtIndex" 79 llvm::StringRef m_context; // Decl context: "lldb::SBTarget" 80 llvm::StringRef m_arguments; // Arguments: "(unsigned int)" 81 llvm::StringRef m_qualifiers; // Qualifiers: "const" 82 Type m_type; 83 bool m_parsed; 84 bool m_parse_error; 85 }; 86 87 CPlusPlusLanguage() = default; 88 89 ~CPlusPlusLanguage() override = default; 90 91 lldb::LanguageType GetLanguageType() const override { 92 return lldb::eLanguageTypeC_plus_plus; 93 } 94 95 std::unique_ptr<TypeScavenger> GetTypeScavenger() override; 96 97 lldb::TypeCategoryImplSP GetFormatters() override; 98 99 HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override; 100 101 HardcodedFormatters::HardcodedSyntheticFinder 102 GetHardcodedSynthetics() override; 103 104 //------------------------------------------------------------------ 105 // Static Functions 106 //------------------------------------------------------------------ 107 static void Initialize(); 108 109 static void Terminate(); 110 111 static lldb_private::Language *CreateInstance(lldb::LanguageType language); 112 113 static lldb_private::ConstString GetPluginNameStatic(); 114 115 static bool IsCPPMangledName(const char *name); 116 117 // Extract C++ context and identifier from a string using heuristic matching 118 // (as opposed to 119 // CPlusPlusLanguage::MethodName which has to have a fully qualified C++ name 120 // with parens and arguments. 121 // If the name is a lone C identifier (e.g. C) or a qualified C identifier 122 // (e.g. A::B::C) it will return true, 123 // and identifier will be the identifier (C and C respectively) and the 124 // context will be "" and "A::B::" respectively. 125 // If the name fails the heuristic matching for a qualified or unqualified 126 // C/C++ identifier, then it will return false 127 // and identifier and context will be unchanged. 128 129 static bool ExtractContextAndIdentifier(const char *name, 130 llvm::StringRef &context, 131 llvm::StringRef &identifier); 132 133 // in some cases, compilers will output different names for one same type. 134 // when that happens, it might be impossible 135 // to construct SBType objects for a valid type, because the name that is 136 // available is not the same as the name that 137 // can be used as a search key in FindTypes(). the equivalents map here is 138 // meant to return possible alternative names 139 // for a type through which a search can be conducted. Currently, this is only 140 // enabled for C++ but can be extended 141 // to ObjC or other languages if necessary 142 static uint32_t FindEquivalentNames(ConstString type_name, 143 std::vector<ConstString> &equivalents); 144 145 //------------------------------------------------------------------ 146 // PluginInterface protocol 147 //------------------------------------------------------------------ 148 ConstString GetPluginName() override; 149 150 uint32_t GetPluginVersion() override; 151 }; 152 153 } // namespace lldb_private 154 155 #endif // liblldb_CPlusPlusLanguage_h_ 156