diff options
Diffstat (limited to 'lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp')
-rw-r--r-- | lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp | 128 |
1 files changed, 52 insertions, 76 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 4b045d1..89c2a52 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -62,9 +62,44 @@ void CPlusPlusLanguage::Terminate() { PluginManager::UnregisterPlugin(CreateInstance); } +std::unique_ptr<Language::MethodName> +CPlusPlusLanguage::GetMethodName(ConstString full_name) const { + std::unique_ptr<CPlusPlusLanguage::CPPMethodName> cpp_method = + std::make_unique<CPlusPlusLanguage::CPPMethodName>(full_name); + cpp_method->IsValid(); + return cpp_method; +} + +std::pair<FunctionNameType, llvm::StringRef> +CPlusPlusLanguage::GetFunctionNameInfo(ConstString name) const { + if (Mangled::IsMangledName(name.GetCString())) + return {eFunctionNameTypeFull, llvm::StringRef()}; + + FunctionNameType func_name_type = eFunctionNameTypeNone; + CPlusPlusLanguage::CPPMethodName method(name); + llvm::StringRef basename = method.GetBasename(); + if (basename.empty()) { + llvm::StringRef context; + func_name_type |= + (ExtractContextAndIdentifier(name.GetCString(), context, basename) + ? (eFunctionNameTypeMethod | eFunctionNameTypeBase) + : eFunctionNameTypeFull); + } else { + func_name_type |= (eFunctionNameTypeMethod | eFunctionNameTypeBase); + } + + if (!method.GetQualifiers().empty()) { + // There is a 'const' or other qualifier following the end of the function + // parens, this can't be a eFunctionNameTypeBase. + func_name_type &= ~eFunctionNameTypeBase; + } + + return {func_name_type, basename}; +} + bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const { const char *mangled_name = mangled.GetMangledName().GetCString(); - return mangled_name && CPlusPlusLanguage::IsCPPMangledName(mangled_name); + return mangled_name && Mangled::IsMangledName(mangled_name); } ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments( @@ -81,7 +116,7 @@ ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments( // eventually handle eSymbolTypeData, // we will want this back) { - CPlusPlusLanguage::MethodName cxx_method(demangled_name); + CPlusPlusLanguage::CPPMethodName cxx_method(demangled_name); if (!cxx_method.GetBasename().empty()) { std::string shortname; if (!cxx_method.GetContext().empty()) @@ -106,17 +141,6 @@ Language *CPlusPlusLanguage::CreateInstance(lldb::LanguageType language) { return nullptr; } -void CPlusPlusLanguage::MethodName::Clear() { - m_full.Clear(); - m_basename = llvm::StringRef(); - m_context = llvm::StringRef(); - m_arguments = llvm::StringRef(); - m_qualifiers = llvm::StringRef(); - m_return_type = llvm::StringRef(); - m_parsed = false; - m_parse_error = false; -} - static bool ReverseFindMatchingChars(const llvm::StringRef &s, const llvm::StringRef &left_right_chars, size_t &left_pos, size_t &right_pos, @@ -181,7 +205,7 @@ static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream, char const *full_name, ExecutionContextScope *exe_scope, VariableList const &args) { - CPlusPlusLanguage::MethodName cpp_method{ConstString(full_name)}; + CPlusPlusLanguage::CPPMethodName cpp_method{ConstString(full_name)}; if (!cpp_method.IsValid()) return false; @@ -208,7 +232,7 @@ static bool PrettyPrintFunctionNameWithArgs(Stream &out_stream, return true; } -bool CPlusPlusLanguage::MethodName::TrySimplifiedParse() { +bool CPlusPlusLanguage::CPPMethodName::TrySimplifiedParse() { // This method tries to parse simple method definitions which are presumably // most comman in user programs. Definitions that can be parsed by this // function don't have return types and templates in the name. @@ -251,7 +275,7 @@ bool CPlusPlusLanguage::MethodName::TrySimplifiedParse() { return false; } -void CPlusPlusLanguage::MethodName::Parse() { +void CPlusPlusLanguage::CPPMethodName::Parse() { if (!m_parsed && m_full) { if (TrySimplifiedParse()) { m_parse_error = false; @@ -268,55 +292,19 @@ void CPlusPlusLanguage::MethodName::Parse() { m_parse_error = true; } } + if (m_context.empty()) { + m_scope_qualified = std::string(m_basename); + } else { + m_scope_qualified = m_context; + m_scope_qualified += "::"; + m_scope_qualified += m_basename; + } m_parsed = true; } } -llvm::StringRef CPlusPlusLanguage::MethodName::GetBasename() { - if (!m_parsed) - Parse(); - return m_basename; -} - -llvm::StringRef CPlusPlusLanguage::MethodName::GetContext() { - if (!m_parsed) - Parse(); - return m_context; -} - -llvm::StringRef CPlusPlusLanguage::MethodName::GetArguments() { - if (!m_parsed) - Parse(); - return m_arguments; -} - -llvm::StringRef CPlusPlusLanguage::MethodName::GetQualifiers() { - if (!m_parsed) - Parse(); - return m_qualifiers; -} - -llvm::StringRef CPlusPlusLanguage::MethodName::GetReturnType() { - if (!m_parsed) - Parse(); - return m_return_type; -} - -std::string CPlusPlusLanguage::MethodName::GetScopeQualifiedName() { - if (!m_parsed) - Parse(); - if (m_context.empty()) - return std::string(m_basename); - - std::string res; - res += m_context; - res += "::"; - res += m_basename; - return res; -} - llvm::StringRef -CPlusPlusLanguage::MethodName::GetBasenameNoTemplateParameters() { +CPlusPlusLanguage::CPPMethodName::GetBasenameNoTemplateParameters() { llvm::StringRef basename = GetBasename(); size_t arg_start, arg_end; llvm::StringRef parens("<>", 2); @@ -326,7 +314,7 @@ CPlusPlusLanguage::MethodName::GetBasenameNoTemplateParameters() { return basename; } -bool CPlusPlusLanguage::MethodName::ContainsPath(llvm::StringRef path) { +bool CPlusPlusLanguage::CPPMethodName::ContainsPath(llvm::StringRef path) { if (!m_parsed) Parse(); @@ -375,21 +363,9 @@ bool CPlusPlusLanguage::MethodName::ContainsPath(llvm::StringRef path) { return false; } -bool CPlusPlusLanguage::IsCPPMangledName(llvm::StringRef name) { - // FIXME!! we should really run through all the known C++ Language plugins - // and ask each one if this is a C++ mangled name - - Mangled::ManglingScheme scheme = Mangled::GetManglingScheme(name); - - if (scheme == Mangled::eManglingSchemeNone) - return false; - - return true; -} - bool CPlusPlusLanguage::DemangledNameContainsPath(llvm::StringRef path, ConstString demangled) const { - MethodName demangled_name(demangled); + CPPMethodName demangled_name(demangled); return demangled_name.ContainsPath(path); } @@ -588,7 +564,7 @@ ConstString CPlusPlusLanguage::FindBestAlternateFunctionMangledName( if (!demangled) return ConstString(); - CPlusPlusLanguage::MethodName cpp_name(demangled); + CPlusPlusLanguage::CPPMethodName cpp_name(demangled); std::string scope_qualified_name = cpp_name.GetScopeQualifiedName(); if (!scope_qualified_name.size()) @@ -611,7 +587,7 @@ ConstString CPlusPlusLanguage::FindBestAlternateFunctionMangledName( Mangled mangled(alternate_mangled_name); ConstString demangled = mangled.GetDemangledName(); - CPlusPlusLanguage::MethodName alternate_cpp_name(demangled); + CPlusPlusLanguage::CPPMethodName alternate_cpp_name(demangled); if (!cpp_name.IsValid()) continue; |