Author: enrico Date: Tue Nov 1 13:50:49 2016 New Revision: 285727 URL: http://llvm.org/viewvc/llvm-project?rev=285727&view=rev Log: Implement a general type scavenger that can dig types from debug info + a filtering mechanism to accept/reject results thusly obtained
Implement the C++ type lookup support in terms of this general scavenger The idea is that we may want other languages to do debug info based search (exclusively, or as an add-on to runtime/module based searching) and it makes sense to avoid duplicating this functionality Modified: lldb/trunk/include/lldb/Target/Language.h lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp lldb/trunk/source/Target/Language.cpp Modified: lldb/trunk/include/lldb/Target/Language.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Language.h?rev=285727&r1=285726&r2=285727&view=diff ============================================================================== --- lldb/trunk/include/lldb/Target/Language.h (original) +++ lldb/trunk/include/lldb/Target/Language.h Tue Nov 1 13:50:49 2016 @@ -57,6 +57,44 @@ public: ResultSet &results) = 0; }; + class ImageListTypeScavenger : public TypeScavenger { + class Result : public Language::TypeScavenger::Result { + public: + Result(CompilerType type) + : Language::TypeScavenger::Result(), m_compiler_type(type) {} + + bool IsValid() override { return m_compiler_type.IsValid(); } + + bool DumpToStream(Stream &stream, bool print_help_if_available) override { + if (IsValid()) { + m_compiler_type.DumpTypeDescription(&stream); + stream.EOL(); + return true; + } + return false; + } + + ~Result() override = default; + + private: + CompilerType m_compiler_type; + }; + + protected: + ImageListTypeScavenger() = default; + + ~ImageListTypeScavenger() override = default; + + // is this type something we should accept? it's usually going to be a + // filter by language + maybe some sugar tweaking + // returning an empty type means rejecting this candidate entirely; + // any other result will be accepted as a valid match + virtual CompilerType AdjustForInclusion(CompilerType &candidate) = 0; + + bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, + ResultSet &results) override; + }; + enum class FunctionNameRepresentation { eName, eNameWithArgs, Modified: lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp?rev=285727&r1=285726&r2=285727&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp (original) +++ lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp Tue Nov 1 13:50:49 2016 @@ -28,9 +28,6 @@ #include "lldb/DataFormatters/DataVisualization.h" #include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/DataFormatters/VectorType.h" -#include "lldb/Symbol/SymbolFile.h" -#include "lldb/Symbol/TypeList.h" -#include "lldb/Target/Target.h" #include "BlockPointer.h" #include "CxxStringTypes.h" @@ -922,73 +919,17 @@ static void LoadSystemFormatters(lldb::T } std::unique_ptr<Language::TypeScavenger> CPlusPlusLanguage::GetTypeScavenger() { - class CPlusPlusTypeScavenger : public Language::TypeScavenger { - private: - class CPlusPlusTypeScavengerResult : public Language::TypeScavenger::Result { - public: - CPlusPlusTypeScavengerResult(CompilerType type) - : Language::TypeScavenger::Result(), m_compiler_type(type) {} - - bool IsValid() override { return m_compiler_type.IsValid(); } - - bool DumpToStream(Stream &stream, bool print_help_if_available) override { - if (IsValid()) { - m_compiler_type.DumpTypeDescription(&stream); - stream.EOL(); - return true; - } - return false; - } - - ~CPlusPlusTypeScavengerResult() override = default; - - private: - CompilerType m_compiler_type; - }; - - protected: - CPlusPlusTypeScavenger() = default; - - ~CPlusPlusTypeScavenger() override = default; - - bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, - ResultSet &results) override { - bool result = false; - - Target *target = exe_scope->CalculateTarget().get(); - if (target) { - const auto &images(target->GetImages()); - SymbolContext null_sc; - ConstString cs_key(key); - llvm::DenseSet<SymbolFile*> searched_sym_files; - TypeList matches; - images.FindTypes(null_sc, - cs_key, - false, - UINT32_MAX, - searched_sym_files, - matches); - for (const auto& match : matches.Types()) { - if (match.get()) { - CompilerType compiler_type(match->GetFullCompilerType()); - LanguageType lang_type(compiler_type.GetMinimumLanguage()); - // other plugins will find types for other languages - here we only do C and C++ - if (!Language::LanguageIsC(lang_type) && !Language::LanguageIsCPlusPlus(lang_type)) - continue; - if (compiler_type.IsTypedefType()) - compiler_type = compiler_type.GetTypedefedType(); - std::unique_ptr<Language::TypeScavenger::Result> scavengeresult( - new CPlusPlusTypeScavengerResult(compiler_type)); - results.insert(std::move(scavengeresult)); - result = true; - } - } - } - - return result; + class CPlusPlusTypeScavenger : public Language::ImageListTypeScavenger { + public: + virtual CompilerType AdjustForInclusion(CompilerType &candidate) override { + LanguageType lang_type(candidate.GetMinimumLanguage()); + if (!Language::LanguageIsC(lang_type) && + !Language::LanguageIsCPlusPlus(lang_type)) + return CompilerType(); + if (candidate.IsTypedefType()) + return candidate.GetTypedefedType(); + return candidate; } - - friend class lldb_private::CPlusPlusLanguage; }; return std::unique_ptr<TypeScavenger>(new CPlusPlusTypeScavenger()); Modified: lldb/trunk/source/Target/Language.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Language.cpp?rev=285727&r1=285726&r2=285727&view=diff ============================================================================== --- lldb/trunk/source/Target/Language.cpp (original) +++ lldb/trunk/source/Target/Language.cpp Tue Nov 1 13:50:49 2016 @@ -16,6 +16,9 @@ #include "lldb/Core/PluginManager.h" #include "lldb/Core/Stream.h" +#include "lldb/Symbol/SymbolFile.h" +#include "lldb/Symbol/TypeList.h" +#include "lldb/Target/Target.h" using namespace lldb; using namespace lldb_private; @@ -341,6 +344,36 @@ size_t Language::TypeScavenger::Find(Exe return 0; } +bool Language::ImageListTypeScavenger::Find_Impl( + ExecutionContextScope *exe_scope, const char *key, ResultSet &results) { + bool result = false; + + Target *target = exe_scope->CalculateTarget().get(); + if (target) { + const auto &images(target->GetImages()); + SymbolContext null_sc; + ConstString cs_key(key); + llvm::DenseSet<SymbolFile *> searched_sym_files; + TypeList matches; + images.FindTypes(null_sc, cs_key, false, UINT32_MAX, searched_sym_files, + matches); + for (const auto &match : matches.Types()) { + if (match.get()) { + CompilerType compiler_type(match->GetFullCompilerType()); + compiler_type = AdjustForInclusion(compiler_type); + if (!compiler_type) + continue; + std::unique_ptr<Language::TypeScavenger::Result> scavengeresult( + new Result(compiler_type)); + results.insert(std::move(scavengeresult)); + result = true; + } + } + } + + return result; +} + bool Language::GetFormatterPrefixSuffix(ValueObject &valobj, ConstString type_hint, std::string &prefix, _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits