diff options
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/API/SBType.cpp | 8 | ||||
-rw-r--r-- | lldb/source/Symbol/ClangASTContext.cpp | 32 | ||||
-rw-r--r-- | lldb/source/Symbol/CompilerType.cpp | 8 | ||||
-rw-r--r-- | lldb/source/Symbol/TypeSystem.cpp | 6 |
4 files changed, 54 insertions, 0 deletions
diff --git a/lldb/source/API/SBType.cpp b/lldb/source/API/SBType.cpp index dcdbbc71d20..90a2e655172 100644 --- a/lldb/source/API/SBType.cpp +++ b/lldb/source/API/SBType.cpp @@ -264,6 +264,14 @@ SBType::IsTypedefType () return m_opaque_sp->GetCompilerType(true).IsTypedefType(); } +bool +SBType::IsAnonymousType () +{ + if (!IsValid()) + return false; + return m_opaque_sp->GetCompilerType(true).IsAnonymousType(); +} + lldb::SBType SBType::GetFunctionReturnType () { diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index 3ac73782e2e..11e587c1061 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -2585,6 +2585,38 @@ ClangASTContext::IsAggregateType (lldb::opaque_compiler_type_t type) } bool +ClangASTContext::IsAnonymousType (lldb::opaque_compiler_type_t type) +{ + clang::QualType qual_type (GetCanonicalQualType(type)); + + const clang::Type::TypeClass type_class = qual_type->getTypeClass(); + switch (type_class) + { + case clang::Type::Record: + { + if (const clang::RecordType *record_type = llvm::dyn_cast_or_null<clang::RecordType>(qual_type.getTypePtrOrNull())) + { + if (const clang::RecordDecl *record_decl = record_type->getDecl()) + { + return record_decl->isAnonymousStructOrUnion(); + } + } + break; + } + case clang::Type::Elaborated: + return IsAnonymousType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()); + case clang::Type::Typedef: + return IsAnonymousType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); + case clang::Type::Paren: + return IsAnonymousType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()); + default: + break; + } + // The clang type does have a value + return false; +} + +bool ClangASTContext::IsArrayType (lldb::opaque_compiler_type_t type, CompilerType *element_type_ptr, uint64_t *size, diff --git a/lldb/source/Symbol/CompilerType.cpp b/lldb/source/Symbol/CompilerType.cpp index 061539a0310..e7cbe63a8a3 100644 --- a/lldb/source/Symbol/CompilerType.cpp +++ b/lldb/source/Symbol/CompilerType.cpp @@ -64,6 +64,14 @@ CompilerType::IsAggregateType () const } bool +CompilerType::IsAnonymousType () const +{ + if (IsValid()) + return m_type_system->IsAnonymousType(m_type); + return false; +} + +bool CompilerType::IsArrayType (CompilerType *element_type_ptr, uint64_t *size, bool *is_incomplete) const diff --git a/lldb/source/Symbol/TypeSystem.cpp b/lldb/source/Symbol/TypeSystem.cpp index eb44b292603..5aa83b4b479 100644 --- a/lldb/source/Symbol/TypeSystem.cpp +++ b/lldb/source/Symbol/TypeSystem.cpp @@ -55,6 +55,12 @@ TypeSystem::CreateInstance (lldb::LanguageType language, Target *target) return lldb::TypeSystemSP(); } +bool +TypeSystem::IsAnonymousType (lldb::opaque_compiler_type_t type) +{ + return false; +} + CompilerType TypeSystem::GetLValueReferenceType (lldb::opaque_compiler_type_t type) { |