[Lldb-commits] [lldb] r285727 - Implement a general type scavenger that can dig types from debug info + a filtering mechanism to accept/reject results thusly obtained

Enrico Granata via lldb-commits lldb-commits at lists.llvm.org
Tue Nov 1 11:50:50 PDT 2016


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,




More information about the lldb-commits mailing list