diff options
author | Enrico Granata <egranata@apple.com> | 2015-11-07 02:06:57 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2015-11-07 02:06:57 +0000 |
commit | 7123e2b5d79b6ed18f56ebac1e8c8bc1a57ea23c (patch) | |
tree | 7cbfbd7a15cc2fdc98a4a3e736b0a7372253a154 /lldb/source | |
parent | ea1df7fe9fc363e7583f691431b54fdb658fe0a8 (diff) | |
download | bcm5719-llvm-7123e2b5d79b6ed18f56ebac1e8c8bc1a57ea23c.tar.gz bcm5719-llvm-7123e2b5d79b6ed18f56ebac1e8c8bc1a57ea23c.zip |
Add SBType::IsAnonymousType() and relative plumbing in the debugger internals
For language that support such a thing, this API allows to ask whether a type is anonymous (i.e. has been given no name)
Comes with test case
llvm-svn: 252390
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) { |