Author: enrico Date: Thu Nov 3 12:25:27 2016 New Revision: 285941 URL: http://llvm.org/viewvc/llvm-project?rev=285941&view=rev Log: Add support to the ObjC type scavenger for finding types via debug info
Modified: lldb/trunk/include/lldb/Target/Language.h lldb/trunk/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py lldb/trunk/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp Modified: lldb/trunk/include/lldb/Target/Language.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Language.h?rev=285941&r1=285940&r2=285941&view=diff ============================================================================== --- lldb/trunk/include/lldb/Target/Language.h (original) +++ lldb/trunk/include/lldb/Target/Language.h Thu Nov 3 12:25:27 2016 @@ -95,32 +95,51 @@ public: ResultSet &results) override; }; - template <typename TypeScavenger1, typename TypeScavenger2> + template <typename... ScavengerTypes> class EitherTypeScavenger : public TypeScavenger { + public: + EitherTypeScavenger() : TypeScavenger(), m_scavengers() { + for (std::shared_ptr<TypeScavenger> scavenger : { std::shared_ptr<TypeScavenger>(new ScavengerTypes())... }) { + if (scavenger) + m_scavengers.push_back(scavenger); + } + } + protected: bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, ResultSet &results) override { const bool append = false; - auto ts1 = TypeScavenger1(); - if (ts1.Find(exe_scope, key, results, append)) - return true; - auto ts2 = TypeScavenger2(); - if (ts2.Find(exe_scope, key, results, append)) - return true; + for (auto& scavenger : m_scavengers) { + if (scavenger && scavenger->Find(exe_scope, key, results, append)) + return true; + } return false; } + private: + std::vector<std::shared_ptr<TypeScavenger>> m_scavengers; }; - template <typename TypeScavenger1, typename TypeScavenger2> - class BothTypeScavenger : public TypeScavenger { + template <typename... ScavengerTypes> + class UnionTypeScavenger : public TypeScavenger { + public: + UnionTypeScavenger() : TypeScavenger(), m_scavengers() { + for (std::shared_ptr<TypeScavenger> scavenger : { std::shared_ptr<TypeScavenger>(new ScavengerTypes())... }) { + if (scavenger) + m_scavengers.push_back(scavenger); + } + } + protected: bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, ResultSet &results) override { const bool append = true; - auto ts1 = TypeScavenger1(); - bool success = ts1.Find(exe_scope, key, results, append); - auto ts2 = TypeScavenger2(); - success = ts2.Find(exe_scope, key, results, append) || success; + bool success = false; + for (auto& scavenger : m_scavengers) { + if (scavenger) + success = scavenger->Find(exe_scope, key, results, append) || success; + } return success; } + private: + std::vector<std::shared_ptr<TypeScavenger>> m_scavengers; }; enum class FunctionNameRepresentation { Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py?rev=285941&r1=285940&r2=285941&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py (original) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py Thu Nov 3 12:25:27 2016 @@ -52,3 +52,4 @@ class TypeLookupTestCase(TestBase): "no type was found matching 'PleaseDontBeARealTypeThatExists'"]) self.expect('type lookup MyCPPClass', substrs=['setF', 'float getF']) self.expect('type lookup MyClass', substrs=['setF', 'float getF']) + self.expect('type lookup MyObjCClass', substrs=['@interface MyObjCClass', 'int x', 'int y']) Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm?rev=285941&r1=285940&r2=285941&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm (original) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm Thu Nov 3 12:25:27 2016 @@ -28,6 +28,28 @@ private: typedef MyCPPClass MyClass; +@interface MyObjCClass : NSObject { + int x; +} +- (id)init; +- (int)read; +@end + +@implementation MyObjCClass { + int y; +} +- (id)init { + if (self = [super init]) { + self->x = 12; + self->y = 24; + } + return self; +} +- (int)read { + return self->x + self->y; +} +@end + int main (int argc, const char * argv[]) { MyClass my_cpp(3.1415); Modified: lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp?rev=285941&r1=285940&r2=285941&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp (original) +++ lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp Thu Nov 3 12:25:27 2016 @@ -994,10 +994,23 @@ std::unique_ptr<Language::TypeScavenger> friend class lldb_private::ObjCLanguage; }; + + class ObjCDebugInfoScavenger : public Language::ImageListTypeScavenger { + public: + virtual CompilerType AdjustForInclusion(CompilerType &candidate) override { + LanguageType lang_type(candidate.GetMinimumLanguage()); + if (!Language::LanguageIsObjC(lang_type)) + return CompilerType(); + if (candidate.IsTypedefType()) + return candidate.GetTypedefedType(); + return candidate; + } + }; return std::unique_ptr<TypeScavenger>( new Language::EitherTypeScavenger<ObjCModulesScavenger, - ObjCRuntimeScavenger>()); + ObjCRuntimeScavenger, + ObjCDebugInfoScavenger>()); } bool ObjCLanguage::GetFormatterPrefixSuffix(ValueObject &valobj, _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits