summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Target/Language.h45
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py1
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm22
-rw-r--r--lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp15
4 files changed, 69 insertions, 14 deletions
diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h
index edc5287919b..bcf840f93ed 100644
--- a/lldb/include/lldb/Target/Language.h
+++ b/lldb/include/lldb/Target/Language.h
@@ -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 {
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py b/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py
index 62f7766604c..b0f52923cc1 100644
--- a/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/TestTypeLookup.py
@@ -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'])
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm b/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm
index d522e0b16d7..f62e5cb5b8c 100644
--- a/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/type_lookup/main.mm
@@ -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);
diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
index 76a940ba4b7..526ace119d6 100644
--- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
+++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
@@ -994,10 +994,23 @@ std::unique_ptr<Language::TypeScavenger> ObjCLanguage::GetTypeScavenger() {
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,
OpenPOWER on IntegriCloud