diff options
-rw-r--r-- | lldb/include/lldb/API/SBType.h | 6 | ||||
-rw-r--r-- | lldb/include/lldb/Symbol/ClangASTType.h | 4 | ||||
-rw-r--r-- | lldb/scripts/Python/interface/SBType.i | 6 | ||||
-rw-r--r-- | lldb/source/API/SBType.cpp | 23 | ||||
-rw-r--r-- | lldb/source/Symbol/ClangASTType.cpp | 31 |
5 files changed, 69 insertions, 1 deletions
diff --git a/lldb/include/lldb/API/SBType.h b/lldb/include/lldb/API/SBType.h index 303ddff6dc0..7990fc0696a 100644 --- a/lldb/include/lldb/API/SBType.h +++ b/lldb/include/lldb/API/SBType.h @@ -153,6 +153,9 @@ public: IsArrayType (); bool + IsVectorType (); + + bool IsTypedefType (); lldb::SBType @@ -175,6 +178,9 @@ public: lldb::SBType GetArrayElementType (); + + lldb::SBType + GetVectorElementType (); lldb::SBType GetCanonicalType(); diff --git a/lldb/include/lldb/Symbol/ClangASTType.h b/lldb/include/lldb/Symbol/ClangASTType.h index 4011ff923a9..94c768780a0 100644 --- a/lldb/include/lldb/Symbol/ClangASTType.h +++ b/lldb/include/lldb/Symbol/ClangASTType.h @@ -97,6 +97,10 @@ public: bool *is_incomplete) const; bool + IsVectorType (ClangASTType *element_type, + uint64_t *size) const; + + bool IsArrayOfScalarType () const; bool diff --git a/lldb/scripts/Python/interface/SBType.i b/lldb/scripts/Python/interface/SBType.i index a9c230cc165..14bb11d2ee4 100644 --- a/lldb/scripts/Python/interface/SBType.i +++ b/lldb/scripts/Python/interface/SBType.i @@ -210,6 +210,9 @@ public: IsArrayType (); bool + IsVectorType (); + + bool IsTypedefType (); lldb::SBType @@ -235,6 +238,9 @@ public: lldb::SBType GetArrayElementType (); + + lldb::SBType + GetVectorElementType (); lldb::BasicType GetBasicType(); diff --git a/lldb/source/API/SBType.cpp b/lldb/source/API/SBType.cpp index 1f253804d4f..31a4eba8bf3 100644 --- a/lldb/source/API/SBType.cpp +++ b/lldb/source/API/SBType.cpp @@ -164,6 +164,14 @@ SBType::IsArrayType() } bool +SBType::IsVectorType() +{ + if (!IsValid()) + return false; + return m_opaque_sp->GetClangASTType(true).IsVectorType(nullptr, nullptr); +} + +bool SBType::IsReferenceType() { if (!IsValid()) @@ -220,7 +228,20 @@ SBType::GetArrayElementType() return SBType(TypeImplSP(new TypeImpl(m_opaque_sp->GetClangASTType(true).GetArrayElementType()))); } -bool +SBType +SBType::GetVectorElementType () +{ + SBType type_sb; + if (IsValid()) + { + ClangASTType vector_element_type; + if (m_opaque_sp->GetClangASTType(true).IsVectorType(&vector_element_type, nullptr)) + type_sb.SetSP(TypeImplSP(new TypeImpl(vector_element_type))); + } + return type_sb; +} + +bool SBType::IsFunctionType () { if (!IsValid()) diff --git a/lldb/source/Symbol/ClangASTType.cpp b/lldb/source/Symbol/ClangASTType.cpp index 6dc4063c109..eaff90ab8a0 100644 --- a/lldb/source/Symbol/ClangASTType.cpp +++ b/lldb/source/Symbol/ClangASTType.cpp @@ -290,6 +290,37 @@ ClangASTType::IsArrayType (ClangASTType *element_type_ptr, } bool +ClangASTType::IsVectorType (ClangASTType *element_type, + uint64_t *size) const +{ + if (IsValid()) + { + clang::QualType qual_type (GetCanonicalQualType()); + + const clang::Type::TypeClass type_class = qual_type->getTypeClass(); + switch (type_class) + { + case clang::Type::Vector: + { + const clang::VectorType *vector_type = qual_type->getAs<clang::VectorType>(); + if (vector_type) + { + if (size) + *size = vector_type->getNumElements(); + if (element_type) + *element_type = ClangASTType(m_ast, vector_type->getElementType().getAsOpaquePtr()); + } + return true; + } + break; + default: + break; + } + } + return false; +} + +bool ClangASTType::IsRuntimeGeneratedType () const { if (!IsValid()) |