10b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton//===-- ClangASTType.cpp ----------------------------------------*- C++ -*-===// 21674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// 31674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// The LLVM Compiler Infrastructure 41674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// 51674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// This file is distributed under the University of Illinois Open Source 61674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// License. See LICENSE.TXT for details. 71674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton// 81674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton//===----------------------------------------------------------------------===// 91674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h" 131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/ASTConsumer.h" 151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/ASTContext.h" 1652f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "clang/AST/Attr.h" 1752f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "clang/AST/CXXInheritance.h" 181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/Decl.h" 191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/DeclCXX.h" 20960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton#include "clang/AST/DeclObjC.h" 211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/DeclGroup.h" 2252f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "clang/AST/DeclTemplate.h" 231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/AST/RecordLayout.h" 245c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "clang/AST/Type.h" 251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/Basic/Builtins.h" 271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/Basic/IdentifierTable.h" 281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/Basic/LangOptions.h" 291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/Basic/SourceManager.h" 301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "clang/Basic/TargetInfo.h" 311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "llvm/Support/FormattedStream.h" 331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "llvm/Support/raw_ostream.h" 341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/ConstString.h" 361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/DataBufferHeap.h" 371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/DataExtractor.h" 38921fac021ef9f7e5d32de359e67d5ad28fcccc65Peter Collingbourne#include "lldb/Core/Debugger.h" 391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/Scalar.h" 401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/Stream.h" 411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Core/StreamString.h" 421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTContext.h" 43017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton#include "lldb/Symbol/ClangExternalASTSourceCommon.h" 4452f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "lldb/Symbol/VerifyDecl.h" 451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Target/ExecutionContext.h" 461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Target/Process.h" 471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 480b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton#include <mutex> 490b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton 50b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Claytonusing namespace lldb; 511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonusing namespace lldb_private; 5252f792329be5db8e38961350589e97e8f2823acdGreg Claytonusing namespace clang; 5352f792329be5db8e38961350589e97e8f2823acdGreg Claytonusing namespace llvm; 541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 5552f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic bool 5652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonGetCompleteQualType (ASTContext *ast, QualType qual_type, bool allow_completion = true) 571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 5852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 5952f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 6052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 6152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: 6252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::IncompleteArray: 6352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::VariableArray: 6452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 6552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ArrayType *array_type = dyn_cast<ArrayType>(qual_type.getTypePtr()); 6652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 6752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (array_type) 6852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetCompleteQualType (ast, array_type->getElementType(), allow_completion); 6952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 7052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 7152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 7252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 7352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Enum: 7452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 7552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TagType *tag_type = dyn_cast<TagType>(qual_type.getTypePtr()); 7652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_type) 7752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 7852f792329be5db8e38961350589e97e8f2823acdGreg Clayton TagDecl *tag_decl = tag_type->getDecl(); 7952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_decl) 8052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 8152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_decl->isCompleteDefinition()) 8252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 8352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 8452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!allow_completion) 8552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 8652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 8752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_decl->hasExternalLexicalStorage()) 8852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 8952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ast) 9052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 9152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ExternalASTSource *external_ast_source = ast->getExternalSource(); 9252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (external_ast_source) 9352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 9452f792329be5db8e38961350589e97e8f2823acdGreg Clayton external_ast_source->CompleteType(tag_decl); 9552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return !tag_type->isIncompleteType(); 9652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 9752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 9852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 9952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 10052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 10152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 10252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 10352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 10452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 10552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 10652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 10752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 10852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 10952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type); 11052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 11152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 11252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 11352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We currently can't complete objective C types through the newly added ASTContext 11452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // because it only supports TagDecl objects right now... 11552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 11652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 11752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl->getDefinition()) 11852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 11952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 12052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!allow_completion) 12152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 12252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 12352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl->hasExternalLexicalStorage()) 12452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 12552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ast) 12652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 12752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ExternalASTSource *external_ast_source = ast->getExternalSource(); 12852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (external_ast_source) 12952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 13052f792329be5db8e38961350589e97e8f2823acdGreg Clayton external_ast_source->CompleteType (class_interface_decl); 13152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return !objc_class_type->isIncompleteType(); 13252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 13352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 13452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 13552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 13652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 13752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 13852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 13952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 14052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 14152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 14252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion); 14352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 14452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 14552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetCompleteQualType (ast, cast<ElaboratedType>(qual_type)->getNamedType(), allow_completion); 14652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 14752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 14852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetCompleteQualType (ast, cast<ParenType>(qual_type)->desugar(), allow_completion); 14952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 15052f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 15152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 15252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 15352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 15452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 1551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} 1561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 15752f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic ObjCIvarDecl::AccessControl 15852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonConvertAccessTypeToObjCIvarAccessControl (AccessType access) 1591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 16052f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (access) 1611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 16252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eAccessNone: return ObjCIvarDecl::None; 16352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eAccessPublic: return ObjCIvarDecl::Public; 16452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eAccessPrivate: return ObjCIvarDecl::Private; 16552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eAccessProtected: return ObjCIvarDecl::Protected; 16652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case eAccessPackage: return ObjCIvarDecl::Package; 167b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton } 16852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ObjCIvarDecl::None; 169b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton} 1701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 17152f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 17252f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Tests 17352f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 1741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 17552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::ClangASTType (clang::ASTContext *ast, 17652f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::QualType qual_type) : 17752f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_type (qual_type.getAsOpaquePtr()), 17852f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_ast (ast) 179946618a80e17d210e6592e94d10a15ad592572baGreg Clayton{ 180946618a80e17d210e6592e94d10a15ad592572baGreg Clayton} 181b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton 18252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::~ClangASTType() 1835c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton{ 184b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton} 185b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton 18652f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 18752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Tests 18852f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 18952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 19052f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 19152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsAggregateType () const 192dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{ 19352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 19452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 19552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 19652f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 19752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 19852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 19952f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 20052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 20152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::IncompleteArray: 20252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::VariableArray: 20352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: 20452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ExtVector: 20552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Vector: 20652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 20752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 20852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 20952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 21052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 21152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsAggregateType(); 21252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 21352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsAggregateType(); 21452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 21552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<ParenType>(qual_type)->desugar()).IsAggregateType(); 21652f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 21752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 21852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 21952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // The clang type does have a value 22052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 221dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton} 222dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 22352f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 22452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsArrayType (ClangASTType *element_type_ptr, 22552f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint64_t *size, 22652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool *is_incomplete) const 227dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton{ 22852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 22952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 23052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 23152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 23252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 23352f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 23452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 23552f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 23652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 23752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 23852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: 23952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (element_type_ptr) 24052f792329be5db8e38961350589e97e8f2823acdGreg Clayton element_type_ptr->SetClangType (m_ast, cast<ConstantArrayType>(qual_type)->getElementType()); 24152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (size) 24252f792329be5db8e38961350589e97e8f2823acdGreg Clayton *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX); 24352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 24452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 24552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::IncompleteArray: 24652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (element_type_ptr) 24752f792329be5db8e38961350589e97e8f2823acdGreg Clayton element_type_ptr->SetClangType (m_ast, cast<IncompleteArrayType>(qual_type)->getElementType()); 24852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (size) 24952f792329be5db8e38961350589e97e8f2823acdGreg Clayton *size = 0; 25052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_incomplete) 25152f792329be5db8e38961350589e97e8f2823acdGreg Clayton *is_incomplete = true; 25252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 25352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 25452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::VariableArray: 25552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (element_type_ptr) 25652f792329be5db8e38961350589e97e8f2823acdGreg Clayton element_type_ptr->SetClangType (m_ast, cast<VariableArrayType>(qual_type)->getElementType()); 25752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (size) 25852f792329be5db8e38961350589e97e8f2823acdGreg Clayton *size = 0; 25952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 26052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 26152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedArray: 26252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (element_type_ptr) 26352f792329be5db8e38961350589e97e8f2823acdGreg Clayton element_type_ptr->SetClangType (m_ast, cast<DependentSizedArrayType>(qual_type)->getElementType()); 26452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (size) 26552f792329be5db8e38961350589e97e8f2823acdGreg Clayton *size = 0; 26652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 26752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 26852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 26952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsArrayType (element_type_ptr, 27052f792329be5db8e38961350589e97e8f2823acdGreg Clayton size, 27152f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_incomplete); 27252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 27352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsArrayType (element_type_ptr, 27452f792329be5db8e38961350589e97e8f2823acdGreg Clayton size, 27552f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_incomplete); 27652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 27752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsArrayType (element_type_ptr, 27852f792329be5db8e38961350589e97e8f2823acdGreg Clayton size, 27952f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_incomplete); 28052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 28152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 28252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (element_type_ptr) 28352f792329be5db8e38961350589e97e8f2823acdGreg Clayton element_type_ptr->Clear(); 28452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (size) 28552f792329be5db8e38961350589e97e8f2823acdGreg Clayton *size = 0; 28652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_incomplete) 28752f792329be5db8e38961350589e97e8f2823acdGreg Clayton *is_incomplete = false; 28852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 289dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton} 290dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 291dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 29252f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 29352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsCharType () const 294b302b2f50e079b11a12ebafc29104c198f4f15e4Greg Clayton{ 29552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 29652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 29752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetQualType().getUnqualifiedType()->isCharType(); 2985c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton} 299585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton 30052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 30152f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 30252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsCompleteType () const 303585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton{ 30452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 30552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 30652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool allow_completion = false; 30752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetCompleteQualType (m_ast, GetQualType(), allow_completion); 308585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton} 309585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton 31052f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 31152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsConst() const 312585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton{ 31352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetQualType().isConstQualified(); 314585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton} 315585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton 31652f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 31752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsCStringType (uint32_t &length) const 318915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 31952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_or_element_clang_type; 32052f792329be5db8e38961350589e97e8f2823acdGreg Clayton length = 0; 32152f792329be5db8e38961350589e97e8f2823acdGreg Clayton Flags type_flags (GetTypeInfo (&pointee_or_element_clang_type)); 32252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 32352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!pointee_or_element_clang_type.IsValid()) 32452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 32552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 32652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer)) 32752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 32852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_or_element_clang_type.IsCharType()) 32952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 33052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_flags.Test (eTypeIsArray)) 33152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 33252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We know the size of the array and it could be a C string 33352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // since it is an array of characters 33452f792329be5db8e38961350589e97e8f2823acdGreg Clayton length = cast<ConstantArrayType>(GetCanonicalQualType().getTypePtr())->getSize().getLimitedValue(); 33552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 33652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 33752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 33852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 33952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 34052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 341915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 342915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 34352f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 34452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsFunctionType (bool *is_variadic_ptr) const 345915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 34652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 347915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 34852f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 349915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 35052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isFunctionType()) 35152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 35252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_variadic_ptr) 35352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 35452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::FunctionProtoType *function_proto_type = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr()); 35552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (function_proto_type) 35652f792329be5db8e38961350589e97e8f2823acdGreg Clayton *is_variadic_ptr = function_proto_type->isVariadic(); 35752f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 35852f792329be5db8e38961350589e97e8f2823acdGreg Clayton *is_variadic_ptr = false; 35952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 36052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 36152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 362915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 36352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 36452f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 36552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 36652f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 36752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 36852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 36952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsFunctionType(); 37052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 37152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsFunctionType(); 37252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 37352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsFunctionType(); 37452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 37552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 37652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 37752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 37852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 37952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (reference_type) 38052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, reference_type->getPointeeType()).IsFunctionType(); 38152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 38252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 38352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 384915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 38552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 386915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata} 387915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 388915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 38952f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 39052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsFunctionPointerType () const 391915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{ 39252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 393915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata { 39452f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 39552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 39652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isFunctionPointerType()) 39752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 398915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata 39952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 40052f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 40152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 40252f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 40352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 40452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 40552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsFunctionPointerType(); 40652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 40752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsFunctionPointerType(); 40852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 40952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsFunctionPointerType(); 41052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 41152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 41252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 41352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 41452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 41552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (reference_type) 41652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, reference_type->getPointeeType()).IsFunctionPointerType(); 41752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 41852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 41952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 420915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata } 42152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 422b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata 423b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata} 424b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata 42552f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 42652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsIntegerType (bool &is_signed) const 427b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata{ 42852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 42952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 43052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 43152f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 43252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 43352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 43452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (builtin_type) 43552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 43652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (builtin_type->isInteger()) 43752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 43852f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_signed = builtin_type->isSignedInteger(); 43952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 44052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 44152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 44252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 44352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 444b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata} 445b6a4c565732b3a7b546ba2aa0e7aec3a4bb359a4Enrico Granata 44652f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 44752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsPointerType (ClangASTType *pointee_type) const 4481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 44952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 45052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 45152f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 45252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 45352f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 45452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 45552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 45652f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 45752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 45852f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 45952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 46052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCId: 46152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCClass: 46252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 46352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 46452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 46552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 46652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 46752f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType (m_ast, cast<ObjCObjectPointerType>(qual_type)->getPointeeType()); 46852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 46952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::BlockPointer: 47052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 47152f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType (m_ast, cast<BlockPointerType>(qual_type)->getPointeeType()); 47252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 47352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: 47452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 47552f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType (m_ast, cast<PointerType>(qual_type)->getPointeeType()); 47652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 47752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::MemberPointer: 47852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 47952f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType (m_ast, cast<MemberPointerType>(qual_type)->getPointeeType()); 48052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 48152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 48252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsPointerType(pointee_type); 48352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 48452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsPointerType(pointee_type); 48552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 48652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsPointerType(pointee_type); 48752f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 48852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 48952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 49052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 49152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 49252f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->Clear(); 49352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 4941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} 4951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 4961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 49777e67a51acb825d79d25be687c085833713d5205Greg Claytonbool 49852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsPointerOrReferenceType (ClangASTType *pointee_type) const 49977e67a51acb825d79d25be687c085833713d5205Greg Clayton{ 50052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 50177e67a51acb825d79d25be687c085833713d5205Greg Clayton { 50252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 50377e67a51acb825d79d25be687c085833713d5205Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 50477e67a51acb825d79d25be687c085833713d5205Greg Clayton switch (type_class) 50577e67a51acb825d79d25be687c085833713d5205Greg Clayton { 50652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 50752f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 50852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 50952f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 51052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 51152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCId: 51252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCClass: 51352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 51452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 51552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 51652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 51752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 51852f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType(m_ast, cast<ObjCObjectPointerType>(qual_type)->getPointeeType()); 51952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 52052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::BlockPointer: 52152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 52252f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType(m_ast, cast<BlockPointerType>(qual_type)->getPointeeType()); 52352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 52452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: 52552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 52652f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType(m_ast, cast<PointerType>(qual_type)->getPointeeType()); 52752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 52852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::MemberPointer: 52952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 53052f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType(m_ast, cast<MemberPointerType>(qual_type)->getPointeeType()); 53152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 53252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 53352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 53452f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar()); 53552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 53652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 53752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 53852f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar()); 53952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 54052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 54152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsPointerOrReferenceType(pointee_type); 54252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 54352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsPointerOrReferenceType(pointee_type); 54452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 54552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsPointerOrReferenceType(pointee_type); 54677e67a51acb825d79d25be687c085833713d5205Greg Clayton default: 54777e67a51acb825d79d25be687c085833713d5205Greg Clayton break; 54877e67a51acb825d79d25be687c085833713d5205Greg Clayton } 54977e67a51acb825d79d25be687c085833713d5205Greg Clayton } 55052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 55152f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->Clear(); 55277e67a51acb825d79d25be687c085833713d5205Greg Clayton return false; 55377e67a51acb825d79d25be687c085833713d5205Greg Clayton} 55477e67a51acb825d79d25be687c085833713d5205Greg Clayton 555d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton 55652f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 55752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsReferenceType (ClangASTType *pointee_type) const 55852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 55952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 56052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 56152f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 56252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 56352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 56452f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 56552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 56652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 56752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 56852f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar()); 56952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 57052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 57152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 57252f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar()); 57352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 57452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 57552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsReferenceType(pointee_type); 57652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 57752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsReferenceType(pointee_type); 57852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 57952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsReferenceType(pointee_type); 58052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 58152f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 58252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 58352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 58452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 58552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type) 58652f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_type->Clear(); 58752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 58852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 58952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 59052f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 59152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsFloatingPointType (uint32_t &count, bool &is_complex) const 59252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 59352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 59452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 59552f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 59652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 59752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 59852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 59952f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::BuiltinType::Kind kind = BT->getKind(); 60052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 60152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 60252f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = 1; 60352f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_complex = false; 60452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 60552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 60652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 60752f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 60852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 60952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ClangASTType (m_ast, CT->getElementType()).IsFloatingPointType (count, is_complex)) 61052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 61152f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = 2; 61252f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_complex = true; 61352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 61452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 61552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 61652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 61752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 61852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ClangASTType (m_ast, VT->getElementType()).IsFloatingPointType (count, is_complex)) 61952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 62052f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = VT->getNumElements(); 62152f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_complex = false; 62252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 62352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 62452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 62552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 62652f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = 0; 62752f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_complex = false; 62852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 62952f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 63052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 63152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 63252f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 63352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsDefined() const 63452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 63552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 63652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 63752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 63852f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetQualType()); 63952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TagType *tag_type = dyn_cast<TagType>(qual_type.getTypePtr()); 64052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_type) 64152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 64252f792329be5db8e38961350589e97e8f2823acdGreg Clayton TagDecl *tag_decl = tag_type->getDecl(); 64352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_decl) 64452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return tag_decl->isCompleteDefinition(); 64552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 64652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 64752f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 64852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 64952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type); 65052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 65152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 65252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 65352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 65452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return class_interface_decl->getDefinition() != NULL; 65552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 65652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 65752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 65852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 65952f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 66052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 66152f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 66252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsObjCClassType () const 66352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 66452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 66552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 66652f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 66752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 66852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectPointerType *obj_pointer_type = dyn_cast<ObjCObjectPointerType>(qual_type); 66952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 67052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (obj_pointer_type) 67152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return obj_pointer_type->isObjCClassType(); 67252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 67352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 67452f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 67552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 67652f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 67752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsObjCObjectOrInterfaceType () const 67852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 67952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 68052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetCanonicalQualType()->isObjCObjectOrInterfaceType(); 68152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 68252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 68352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 68452f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 68552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsPolymorphicClass () const 68652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 68752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 68852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 68952f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 69052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 69152f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 69252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 69352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 69452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 69552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 69652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 69752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl = record_type->getDecl(); 69852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (record_decl) 69952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 70052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 70152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 70252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return cxx_record_decl->isPolymorphic(); 70352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 70452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 70552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 70652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 70752f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 70852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 70952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 71052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 71152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 71252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 71352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 71452f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 71552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsPossibleDynamicType (ClangASTType *dynamic_pointee_type, 71652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool check_cplusplus, 71752f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool check_objc) const 71852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 71952f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType pointee_qual_type; 72052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (m_type) 72152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 72252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 72352f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool success = false; 72452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 72552f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 72652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 72752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 72852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (check_objc && cast<BuiltinType>(qual_type)->getKind() == BuiltinType::ObjCId) 72952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 73052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (dynamic_pointee_type) 73152f792329be5db8e38961350589e97e8f2823acdGreg Clayton dynamic_pointee_type->SetClangType(m_ast, m_type); 73252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 73352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 73452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 73552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 73652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 73752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (check_objc) 73852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 73952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (dynamic_pointee_type) 74052f792329be5db8e38961350589e97e8f2823acdGreg Clayton dynamic_pointee_type->SetClangType(m_ast, cast<ObjCObjectPointerType>(qual_type)->getPointeeType()); 74152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 74252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 74352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 74452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 74552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: 74652f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType(); 74752f792329be5db8e38961350589e97e8f2823acdGreg Clayton success = true; 74852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 74952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 75052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 75152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 75252f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType(); 75352f792329be5db8e38961350589e97e8f2823acdGreg Clayton success = true; 75452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 75552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 75652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 75752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, 75852f792329be5db8e38961350589e97e8f2823acdGreg Clayton cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsPossibleDynamicType (dynamic_pointee_type, 75952f792329be5db8e38961350589e97e8f2823acdGreg Clayton check_cplusplus, 76052f792329be5db8e38961350589e97e8f2823acdGreg Clayton check_objc); 76152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 76252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 76352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, 76452f792329be5db8e38961350589e97e8f2823acdGreg Clayton cast<ElaboratedType>(qual_type)->getNamedType()).IsPossibleDynamicType (dynamic_pointee_type, 76552f792329be5db8e38961350589e97e8f2823acdGreg Clayton check_cplusplus, 76652f792329be5db8e38961350589e97e8f2823acdGreg Clayton check_objc); 76752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 76852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 76952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, 77052f792329be5db8e38961350589e97e8f2823acdGreg Clayton cast<ParenType>(qual_type)->desugar()).IsPossibleDynamicType (dynamic_pointee_type, 77152f792329be5db8e38961350589e97e8f2823acdGreg Clayton check_cplusplus, 77252f792329be5db8e38961350589e97e8f2823acdGreg Clayton check_objc); 77352f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 77452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 77552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 77652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 77752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (success) 77852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 77952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Check to make sure what we are pointing too is a possible dynamic C++ type 78052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We currently accept any "void *" (in case we have a class that has been 78152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // watered down to an opaque pointer) and virtual C++ classes. 78252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass(); 78352f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (pointee_type_class) 78452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 78552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 78652f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (cast<BuiltinType>(pointee_qual_type)->getKind()) 78752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 78852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UnknownAny: 78952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Void: 79052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (dynamic_pointee_type) 79152f792329be5db8e38961350589e97e8f2823acdGreg Clayton dynamic_pointee_type->SetClangType(m_ast, pointee_qual_type); 79252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 79352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 79452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::NullPtr: 79552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Bool: 79652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char_U: 79752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UChar: 79852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::WChar_U: 79952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char16: 80052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char32: 80152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UShort: 80252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UInt: 80352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ULong: 80452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ULongLong: 80552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UInt128: 80652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char_S: 80752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::SChar: 80852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::WChar_S: 80952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Short: 81052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Int: 81152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Long: 81252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::LongLong: 81352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Int128: 81452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Float: 81552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Double: 81652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::LongDouble: 81752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Dependent: 81852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Overload: 81952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCId: 82052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCClass: 82152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCSel: 82252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::BoundMember: 82352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Half: 82452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ARCUnbridgedCast: 82552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::PseudoObject: 82652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::BuiltinFn: 82752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLEvent: 82852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage1d: 82952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage1dArray: 83052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage1dBuffer: 83152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage2d: 83252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage2dArray: 83352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage3d: 83452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLSampler: 83552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 83652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 83752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 83852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 83952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 84052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (check_cplusplus) 84152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 84252f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl(); 84352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 84452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 84552f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_complete = cxx_record_decl->isCompleteDefinition(); 84652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 84752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_complete) 84852f792329be5db8e38961350589e97e8f2823acdGreg Clayton success = cxx_record_decl->isDynamicClass(); 84952f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 85052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 85152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTMetadata *metadata = ClangASTContext::GetMetadata (m_ast, cxx_record_decl); 85252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (metadata) 85352f792329be5db8e38961350589e97e8f2823acdGreg Clayton success = metadata->GetIsDynamicCXXType(); 85452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 85552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 85652f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_complete = ClangASTType(m_ast, pointee_qual_type).GetCompleteType(); 85752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_complete) 85852f792329be5db8e38961350589e97e8f2823acdGreg Clayton success = cxx_record_decl->isDynamicClass(); 85952f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 86052f792329be5db8e38961350589e97e8f2823acdGreg Clayton success = false; 86152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 86252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 86352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 86452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (success) 86552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 86652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (dynamic_pointee_type) 86752f792329be5db8e38961350589e97e8f2823acdGreg Clayton dynamic_pointee_type->SetClangType(m_ast, pointee_qual_type); 86852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 86952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 87052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 87152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 87252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 87352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 87452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 87552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 87652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (check_objc) 87752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 87852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (dynamic_pointee_type) 87952f792329be5db8e38961350589e97e8f2823acdGreg Clayton dynamic_pointee_type->SetClangType(m_ast, pointee_qual_type); 88052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 88152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 88252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 88352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 88452f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 88552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 88652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 88752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 88852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 88952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (dynamic_pointee_type) 89052f792329be5db8e38961350589e97e8f2823acdGreg Clayton dynamic_pointee_type->Clear(); 89152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 89252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 89352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 89452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 89552f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 89652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsScalarType () const 89752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 89852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 89952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 90052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 90152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return (GetTypeInfo (NULL) & eTypeIsScalar) != 0; 90252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 90352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 90452f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 90552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsTypedefType () const 90652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 90752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 90852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 90952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetQualType()->getTypeClass() == clang::Type::Typedef; 91052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 91152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 91252f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 91352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsVoidType () const 91452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 91552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 91652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 91752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetCanonicalQualType()->isVoidType(); 91852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 91952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 92052f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 92152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsPointerToScalarType () const 92252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 92352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 92452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 92552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 92652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return IsPointerType() && GetPointeeType().IsScalarType(); 92752f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 92852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 92952f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 93052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsArrayOfScalarType () const 93152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 93252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType element_type; 93352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsArrayType(&element_type, NULL, NULL)) 93452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return element_type.IsScalarType(); 93552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 93652f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 93752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 93852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 93952f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 94052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetCXXClassName (std::string &class_name) const 94152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 94252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 94352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 94452f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 94552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 94652f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 94752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 94852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 94952f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_name.assign (cxx_record_decl->getIdentifier()->getNameStart()); 95052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 95152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 95252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 95352f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_name.clear(); 95452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 95552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 95652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 95752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 95852f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 95952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsCXXClassType () const 96052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 96152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 96252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 96352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 96452f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 96552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->getAsCXXRecordDecl() != NULL) 96652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 96752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 96852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 96952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 97052f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 97152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsBeingDefined () const 97252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 97352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 97452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 97552f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 97652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type); 97752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_type) 97852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return tag_type->isBeingDefined(); 97952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 98052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 98152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 98252f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 98352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsObjCObjectPointerType (ClangASTType *class_type_ptr) 98452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 98552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 98652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 98752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 98852f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 98952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 99052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isObjCObjectPointerType()) 99152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 99252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_type_ptr) 99352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 99452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!qual_type->isObjCClassType() && 99552f792329be5db8e38961350589e97e8f2823acdGreg Clayton !qual_type->isObjCIdType()) 99652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 99752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectPointerType *obj_pointer_type = dyn_cast<ObjCObjectPointerType>(qual_type); 99852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (obj_pointer_type == NULL) 99952f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_type_ptr->Clear(); 100052f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 100152f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_type_ptr->SetClangType (m_ast, QualType(obj_pointer_type->getInterfaceType(), 0)); 100252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 100352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 100452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 100552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 100652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_type_ptr) 100752f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_type_ptr->Clear(); 100852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 100952f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 101052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 101152f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 101252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetObjCClassName (std::string &class_name) 101352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 101452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 101552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 101652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 101752f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 101852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 101952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(qual_type); 102052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (object_type) 102152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 102252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCInterfaceDecl *interface = object_type->getInterface(); 102352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (interface) 102452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 102552f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_name = interface->getNameAsString(); 102652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 102752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 102852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 102952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 103052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 103152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 103252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 103352f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 103452f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Type Completion 103552f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 103652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 103752f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 103852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetCompleteType () const 103952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 104052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 104152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 104252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool allow_completion = true; 104352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetCompleteQualType (m_ast, GetQualType(), allow_completion); 104452f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 104552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 104652f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 104752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// AST related queries 104852f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 104952f792329be5db8e38961350589e97e8f2823acdGreg Claytonsize_t 105052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetPointerByteSize () const 105152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 105252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (m_ast) 105352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return m_ast->getTypeSize(m_ast->VoidPtrTy) / 8; 105452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 105552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 105652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 105752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonConstString 105852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetConstQualifiedTypeName () const 105952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 106052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetConstTypeName (); 106152f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 106252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 106352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonConstString 106452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetConstTypeName () const 106552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 106652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 106752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 106852f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string type_name (GetTypeName()); 106952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!type_name.empty()) 107052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ConstString (type_name.c_str()); 107152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 107252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ConstString("<invalid>"); 107352f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 107452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 107552f792329be5db8e38961350589e97e8f2823acdGreg Claytonstd::string 107652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypeName () const 107752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 107852f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string type_name; 107952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 108052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 108152f792329be5db8e38961350589e97e8f2823acdGreg Clayton PrintingPolicy printing_policy (m_ast->getPrintingPolicy()); 108252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetQualType()); 108352f792329be5db8e38961350589e97e8f2823acdGreg Clayton printing_policy.SuppressTagKeyword = true; 108452f792329be5db8e38961350589e97e8f2823acdGreg Clayton printing_policy.LangOpts.WChar = true; 108552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); 108652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (typedef_type) 108752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 108852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TypedefNameDecl *typedef_decl = typedef_type->getDecl(); 108952f792329be5db8e38961350589e97e8f2823acdGreg Clayton type_name = typedef_decl->getQualifiedNameAsString(printing_policy); 109052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 109152f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 109252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 109352f792329be5db8e38961350589e97e8f2823acdGreg Clayton type_name = qual_type.getAsString(printing_policy); 109452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 109552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 109652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return type_name; 109752f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 109852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 109952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 110052f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t 110152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypeInfo (ClangASTType *pointee_or_element_clang_type) const 110252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 110352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 110452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 110552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 110652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_or_element_clang_type) 110752f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_or_element_clang_type->Clear(); 110852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 110952f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetQualType()); 111052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 111152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 111252f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 111352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 111452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 111552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 111652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 111752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 111852f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue; 111952f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (builtin_type->getKind()) 112052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 112152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCId: 112252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCClass: 112352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_or_element_clang_type) 112452f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_or_element_clang_type->SetClangType(m_ast, m_ast->ObjCBuiltinClassTy); 112552f792329be5db8e38961350589e97e8f2823acdGreg Clayton builtin_type_flags |= eTypeIsPointer | eTypeIsObjC; 112652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 112752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 112852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCSel: 112952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_or_element_clang_type) 113052f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_or_element_clang_type->SetClangType(m_ast, m_ast->CharTy); 113152f792329be5db8e38961350589e97e8f2823acdGreg Clayton builtin_type_flags |= eTypeIsPointer | eTypeIsObjC; 113252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 113352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 113452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Bool: 113552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char_U: 113652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UChar: 113752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::WChar_U: 113852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char16: 113952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char32: 114052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UShort: 114152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UInt: 114252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ULong: 114352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ULongLong: 114452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UInt128: 114552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char_S: 114652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::SChar: 114752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::WChar_S: 114852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Short: 114952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Int: 115052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Long: 115152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::LongLong: 115252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Int128: 115352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Float: 115452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Double: 115552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::LongDouble: 115652f792329be5db8e38961350589e97e8f2823acdGreg Clayton builtin_type_flags |= eTypeIsScalar; 115752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (builtin_type->isInteger()) 115852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 115952f792329be5db8e38961350589e97e8f2823acdGreg Clayton builtin_type_flags |= eTypeIsInteger; 116052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (builtin_type->isSignedInteger()) 116152f792329be5db8e38961350589e97e8f2823acdGreg Clayton builtin_type_flags |= eTypeIsSigned; 116252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 116352f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (builtin_type->isFloatingPoint()) 116452f792329be5db8e38961350589e97e8f2823acdGreg Clayton builtin_type_flags |= eTypeIsFloat; 116552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 116652f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 116752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 116852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 116952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return builtin_type_flags; 117052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 117152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 117252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::BlockPointer: 117352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_or_element_clang_type) 117452f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_or_element_clang_type->SetClangType(m_ast, qual_type->getPointeeType()); 117552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock; 117652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 117752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Complex: 117852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 117952f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex; 118052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ComplexType *complex_type = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()); 118152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (complex_type) 118252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 118352f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType complex_element_type (complex_type->getElementType()); 118452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (complex_element_type->isIntegerType()) 118552f792329be5db8e38961350589e97e8f2823acdGreg Clayton complex_type_flags |= eTypeIsFloat; 118652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (complex_element_type->isFloatingType()) 118752f792329be5db8e38961350589e97e8f2823acdGreg Clayton complex_type_flags |= eTypeIsInteger; 118852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 118952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return complex_type_flags; 119052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 119152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 119252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 119352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: 119452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedArray: 119552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::IncompleteArray: 119652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::VariableArray: 119752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_or_element_clang_type) 119852f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_or_element_clang_type->SetClangType(m_ast, cast<ArrayType>(qual_type.getTypePtr())->getElementType()); 119952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eTypeHasChildren | eTypeIsArray; 120052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 120152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentName: return 0; 120252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector; 120352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; 120452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Decltype: return 0; 120552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 120652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Enum: 120752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_or_element_clang_type) 120852f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_or_element_clang_type->SetClangType(m_ast, cast<EnumType>(qual_type)->getDecl()->getIntegerType()); 120952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eTypeIsEnumeration | eTypeHasValue; 121052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 121152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 121252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type); 121352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 121452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type); 121552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 121652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue; 121752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue; 121852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::InjectedClassName: return 0; 121952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 122052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 122152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 122252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_or_element_clang_type) 122352f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_or_element_clang_type->SetClangType(m_ast, cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType()); 122452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eTypeHasChildren | eTypeIsReference | eTypeHasValue; 122552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 122652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue; 122752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 122852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 122952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_or_element_clang_type) 123052f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_or_element_clang_type->SetClangType(m_ast, qual_type->getPointeeType()); 123152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue; 123252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 123352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 123452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 123552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 123652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: 123752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_or_element_clang_type) 123852f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointee_or_element_clang_type->SetClangType(m_ast, qual_type->getPointeeType()); 123952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eTypeHasChildren | eTypeIsPointer | eTypeHasValue; 124052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 124152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 124252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->getAsCXXRecordDecl()) 124352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus; 124452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 124552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eTypeHasChildren | eTypeIsStructUnion; 124652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 124752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate; 124852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateTypeParm: return eTypeIsTemplate; 124952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateSpecialization: return eTypeIsTemplate; 125052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 125152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 125252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eTypeIsTypedef | ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetTypeInfo (pointee_or_element_clang_type); 125352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOfExpr: return 0; 125452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOf: return 0; 125552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::UnresolvedUsing: return 0; 125652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 125752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ExtVector: 125852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Vector: 125952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 126052f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector; 126152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const VectorType *vector_type = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()); 126252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (vector_type) 126352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 126452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (vector_type->isIntegerType()) 126552f792329be5db8e38961350589e97e8f2823acdGreg Clayton vector_type_flags |= eTypeIsFloat; 126652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (vector_type->isFloatingType()) 126752f792329be5db8e38961350589e97e8f2823acdGreg Clayton vector_type_flags |= eTypeIsInteger; 126852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 126952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return vector_type_flags; 127052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 127152f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: return 0; 127252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 127352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 127452f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 127552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 127652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 127752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 127852f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::LanguageType 127952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetMinimumLanguage () 128052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 128152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 128252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eLanguageTypeC; 128352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 128452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // If the type is a reference, then resolve it to what it refers to first: 128552f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType().getNonReferenceType()); 128652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isAnyPointerType()) 128752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 128852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isObjCObjectPointerType()) 128952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eLanguageTypeObjC; 129052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 129152f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType pointee_type (qual_type->getPointeeType()); 129252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type->getPointeeCXXRecordDecl() != NULL) 129352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eLanguageTypeC_plus_plus; 129452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type->isObjCObjectOrInterfaceType()) 129552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eLanguageTypeObjC; 129652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type->isObjCClassType()) 129752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eLanguageTypeObjC; 129852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type.getTypePtr() == m_ast->ObjCBuiltinIdTy.getTypePtr()) 129952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eLanguageTypeObjC; 130052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 130152f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 130252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 130352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 130452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eLanguageTypeObjC; 130552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->getAsCXXRecordDecl()) 130652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eLanguageTypeC_plus_plus; 130752f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (qual_type->getTypeClass()) 130852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 130952f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 131052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 131152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 131252f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (cast<BuiltinType>(qual_type)->getKind()) 131352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 131452f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 131552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Void: 131652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Bool: 131752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char_U: 131852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UChar: 131952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::WChar_U: 132052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char16: 132152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char32: 132252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UShort: 132352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UInt: 132452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ULong: 132552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ULongLong: 132652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UInt128: 132752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char_S: 132852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::SChar: 132952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::WChar_S: 133052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Short: 133152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Int: 133252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Long: 133352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::LongLong: 133452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Int128: 133552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Float: 133652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Double: 133752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::LongDouble: 133852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 133952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 134052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::NullPtr: 134152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eLanguageTypeC_plus_plus; 134252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 134352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCId: 134452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCClass: 134552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCSel: 134652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eLanguageTypeObjC; 134752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 134852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Dependent: 134952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Overload: 135052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::BoundMember: 135152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UnknownAny: 135252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 135352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 135452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 135552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 135652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage(); 135752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 135852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 135952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eLanguageTypeC; 136052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 136152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 136252f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::TypeClass 136352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypeClass () const 136452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 136552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 136652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eTypeClassInvalid; 136752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 136852f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetQualType()); 136952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 137052f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (qual_type->getTypeClass()) 1371d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton { 1372d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::UnaryTransform: break; 1373d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction; 1374d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::FunctionProto: return lldb::eTypeClassFunction; 1375d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::IncompleteArray: return lldb::eTypeClassArray; 1376d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::VariableArray: return lldb::eTypeClassArray; 1377d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::ConstantArray: return lldb::eTypeClassArray; 1378d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::DependentSizedArray: return lldb::eTypeClassArray; 1379d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector; 1380d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::ExtVector: return lldb::eTypeClassVector; 1381d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::Vector: return lldb::eTypeClassVector; 1382d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::Builtin: return lldb::eTypeClassBuiltin; 1383d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer; 1384d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer; 1385d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::Pointer: return lldb::eTypeClassPointer; 1386d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::LValueReference: return lldb::eTypeClassReference; 1387d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::RValueReference: return lldb::eTypeClassReference; 1388d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer; 1389d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::Complex: 1390d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton if (qual_type->isComplexType()) 139152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eTypeClassComplexFloat; 139252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 139352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eTypeClassComplexInteger; 139452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject; 139552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface; 139652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 139752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 139852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 139952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl = record_type->getDecl(); 140052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (record_decl->isUnion()) 140152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eTypeClassUnion; 140252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (record_decl->isStruct()) 140352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eTypeClassStruct; 140452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 140552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eTypeClassClass; 140652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 140752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 140852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Enum: return lldb::eTypeClassEnumeration; 140952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: return lldb::eTypeClassTypedef; 141052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::UnresolvedUsing: break; 141152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 141252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<ParenType>(qual_type)->desugar()).GetTypeClass(); 141352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 141452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetTypeClass(); 141552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 141652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Attributed: break; 141752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateTypeParm: break; 141852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::SubstTemplateTypeParm: break; 141952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::SubstTemplateTypeParmPack:break; 142052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Auto: break; 142152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::InjectedClassName: break; 142252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentName: break; 142352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentTemplateSpecialization: break; 142452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::PackExpansion: break; 142552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 142652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOfExpr: break; 142752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOf: break; 142852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Decltype: break; 142952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateSpecialization: break; 143052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Atomic: break; 143152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 143252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We don't know hot to display this type... 143352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eTypeClassOther; 143452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 143552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 143652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 143752f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid 143852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetClangType (clang::ASTContext *ast, clang::QualType qual_type) 143952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 144052f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_ast = ast; 144152f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_type = qual_type.getAsOpaquePtr(); 144252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 144352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 144452f792329be5db8e38961350589e97e8f2823acdGreg Claytonunsigned 144552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypeQualifiers() const 144652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 144752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 144852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetQualType().getQualifiers().getCVRQualifiers(); 144952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 145052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 145152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 145252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 145352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Creating related types 145452f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 145552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 145652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 145752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddConstModifier () const 145852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 145952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (m_type) 146052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 146152f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType result(GetQualType()); 146252f792329be5db8e38961350589e97e8f2823acdGreg Clayton result.addConst(); 146352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, result); 146452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 146552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 146652f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 146752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 146852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 146952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddRestrictModifier () const 147052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 147152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (m_type) 147252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 147352f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType result(GetQualType()); 147452f792329be5db8e38961350589e97e8f2823acdGreg Clayton result.getQualifiers().setRestrict (true); 147552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, result); 147652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 147752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 147852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 147952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 148052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 148152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddVolatileModifier () const 148252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 148352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (m_type) 148452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 148552f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType result(GetQualType()); 148652f792329be5db8e38961350589e97e8f2823acdGreg Clayton result.getQualifiers().setVolatile (true); 148752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, result); 148852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 148952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 149052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 149152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 149252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 149352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetArrayElementType (uint64_t& stride) const 149452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 149552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 149652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 149752f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 149852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 149952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType element_type (m_ast, qual_type.getTypePtr()->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified()); 150052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 150152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // TODO: the real stride will be >= this value.. find the real one! 150252f792329be5db8e38961350589e97e8f2823acdGreg Clayton stride = element_type.GetByteSize(); 150352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 150452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return element_type; 150552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 150652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 150752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 150852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 150952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 151052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 151152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetCanonicalType () const 151252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 151352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 151452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, GetCanonicalQualType()); 151552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 151652f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 151752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 151852f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic QualType 151952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonGetFullyUnqualifiedType_Impl (ASTContext *ast, QualType qual_type) 152052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 152152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isPointerType()) 152252f792329be5db8e38961350589e97e8f2823acdGreg Clayton qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType())); 152352f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 152452f792329be5db8e38961350589e97e8f2823acdGreg Clayton qual_type = qual_type.getUnqualifiedType(); 152552f792329be5db8e38961350589e97e8f2823acdGreg Clayton qual_type.removeLocalConst(); 152652f792329be5db8e38961350589e97e8f2823acdGreg Clayton qual_type.removeLocalRestrict(); 152752f792329be5db8e38961350589e97e8f2823acdGreg Clayton qual_type.removeLocalVolatile(); 152852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return qual_type; 152952f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 153052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 153152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 153252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFullyUnqualifiedType () const 153352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 153452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 153552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, GetFullyUnqualifiedType_Impl(m_ast, GetQualType())); 153652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 153752f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 153852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 153952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 154052f792329be5db8e38961350589e97e8f2823acdGreg Claytonint 154152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFunctionArgumentCount () const 154252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 154352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 154452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 154552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const FunctionProtoType* func = dyn_cast<FunctionProtoType>(GetCanonicalQualType()); 154652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (func) 154752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return func->getNumArgs(); 154852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 154952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return -1; 155052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 155152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 155252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 155352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFunctionArgumentTypeAtIndex (size_t idx) 155452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 155552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 155652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 155752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const FunctionProtoType* func = dyn_cast<FunctionProtoType>(GetCanonicalQualType()); 155852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (func) 155952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 156052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint32_t num_args = func->getNumArgs(); 156152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx < num_args) 156252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, func->getArgType(idx)); 156352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 156452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 156552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 156652f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 156752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 156852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 156952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFunctionReturnType () const 157052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 157152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 157252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 157352f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 157452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const FunctionProtoType* func = dyn_cast<FunctionProtoType>(qual_type.getTypePtr()); 157552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (func) 157652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, func->getResultType()); 157752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 157852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 157952f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 158052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 158152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 158252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 158352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetLValueReferenceType () const 158452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 158552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 158652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 158752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, m_ast->getLValueReferenceType(GetQualType())); 158852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 158952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 159052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 159152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 159252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 159352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetRValueReferenceType () const 159452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 159552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 159652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 159752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, m_ast->getRValueReferenceType(GetQualType())); 159852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 159952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 160052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 160152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 160252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 160352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNonReferenceType () const 160452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 160552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 160652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, GetQualType().getNonReferenceType()); 160752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 160852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 160952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 161052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 161152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::CreateTypedefType (const char *typedef_name, 161252f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::DeclContext *decl_ctx) const 161352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 161452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid() && typedef_name && typedef_name[0]) 161552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 161652f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetQualType()); 161752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (decl_ctx == NULL) 161852f792329be5db8e38961350589e97e8f2823acdGreg Clayton decl_ctx = m_ast->getTranslationUnitDecl(); 161952f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypedefDecl *decl = TypedefDecl::Create (*m_ast, 162052f792329be5db8e38961350589e97e8f2823acdGreg Clayton decl_ctx, 162152f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 162252f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 162352f792329be5db8e38961350589e97e8f2823acdGreg Clayton &m_ast->Idents.get(typedef_name), 162452f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_ast->getTrivialTypeSourceInfo(qual_type)); 162552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 162652f792329be5db8e38961350589e97e8f2823acdGreg Clayton decl->setAccess(AS_public); // TODO respect proper access specifier 162752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 162852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Get a uniqued QualType for the typedef decl type 162952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, m_ast->getTypedefType (decl)); 163052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 163152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 163252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 163352f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 163452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 163552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 163652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetPointeeType () const 163752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 163852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (m_type) 163952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 164052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetQualType()); 164152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, qual_type.getTypePtr()->getPointeeType()); 164252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 164352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 164452f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 164552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 164652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 164752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetPointerType () const 164852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 164952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 165052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 165152f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetQualType()); 165252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 165352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 165452f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 165552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 165652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 165752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 165852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, m_ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr()); 165952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 166052f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 166152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, m_ast->getPointerType(qual_type).getAsOpaquePtr()); 166252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 166352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 166452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 166552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 166652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 166752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 166852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypedefedType () const 166952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 167052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 167152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 167252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TypedefType *typedef_type = dyn_cast<TypedefType>(GetQualType()); 167352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (typedef_type) 167452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, typedef_type->getDecl()->getUnderlyingType()); 167552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 167652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 167752f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 167852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 167952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 168052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::RemoveFastQualifiers () const 168152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 168252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (m_type) 168352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 168452f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetQualType()); 168552f792329be5db8e38961350589e97e8f2823acdGreg Clayton qual_type.getQualifiers().removeFastQualifiers(); 168652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, qual_type); 168752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 168852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 168952f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 169052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 169152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 169252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 169352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Create related types using the current type's AST 169452f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 169552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 169652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 169752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetBasicTypeFromAST (lldb::BasicType basic_type) const 169852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 169952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 170052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTContext::GetBasicType(m_ast, basic_type); 170152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 170252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 170352f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 170452f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Exploring the type 170552f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 170652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 170752f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint64_t 170852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetBitSize () const 170952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 171052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType ()) 171152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 171252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 171352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint32_t bit_size = m_ast->getTypeSize (qual_type); 171452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bit_size == 0) 171552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 171652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isIncompleteArrayType()) 171752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return m_ast->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified()); 171852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 171952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isObjCObjectOrInterfaceType()) 172052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return bit_size + m_ast->getTypeSize(m_ast->ObjCBuiltinClassTy); 172152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return bit_size; 172252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 172352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 172452f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 172552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 172652f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint64_t 172752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetByteSize () const 172852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 172952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return (GetBitSize () + 7) / 8; 173052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 173152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 173252f792329be5db8e38961350589e97e8f2823acdGreg Claytonsize_t 173352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTypeBitAlign () const 173452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 173552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType ()) 173652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return m_ast->getTypeAlign(GetQualType()); 173752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 173852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 173952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 174052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 174152f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::Encoding 174252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetEncoding (uint64_t &count) const 174352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 174452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 174552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eEncodingInvalid; 174652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 174752f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = 1; 174852f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 174952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 175052f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (qual_type->getTypeClass()) 175152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 175252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::UnaryTransform: 175352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 175452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 175552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::FunctionNoProto: 175652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::FunctionProto: 175752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 175852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 175952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::IncompleteArray: 176052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::VariableArray: 176152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 176252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 176352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: 176452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 176552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 176652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ExtVector: 176752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Vector: 176852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // TODO: Set this to more than one??? 176952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 177052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 177152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 177252f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (cast<BuiltinType>(qual_type)->getKind()) 177352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 177452f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: assert(0 && "Unknown builtin type!"); 177552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Void: 177652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 177752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 177852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Bool: 177952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char_S: 178052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::SChar: 178152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::WChar_S: 178252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char16: 178352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char32: 178452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Short: 178552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Int: 178652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Long: 178752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::LongLong: 178852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Int128: return lldb::eEncodingSint; 178952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 179052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char_U: 179152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UChar: 179252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::WChar_U: 179352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UShort: 179452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UInt: 179552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ULong: 179652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ULongLong: 179752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UInt128: return lldb::eEncodingUint; 179852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 179952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Float: 180052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Double: 180152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::LongDouble: return lldb::eEncodingIEEE754; 180252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 180352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCClass: 180452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCId: 180552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCSel: return lldb::eEncodingUint; 180652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 180752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::NullPtr: return lldb::eEncodingUint; 180852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 180952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 181052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // All pointer types are represented as unsigned integer encodings. 181152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We may nee to add a eEncodingPointer if we ever need to know the 181252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // difference 181352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 181452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::BlockPointer: 181552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: 181652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 181752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 181852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::MemberPointer: return lldb::eEncodingUint; 181952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Complex: 182052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 182152f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::Encoding encoding = lldb::eEncodingIEEE754; 182252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isComplexType()) 182352f792329be5db8e38961350589e97e8f2823acdGreg Clayton encoding = lldb::eEncodingIEEE754; 182452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 182552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 182652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ComplexType *complex_type = qual_type->getAsComplexIntegerType(); 182752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (complex_type) 182852f792329be5db8e38961350589e97e8f2823acdGreg Clayton encoding = ClangASTType(m_ast, complex_type->getElementType()).GetEncoding(count); 182952f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 183052f792329be5db8e38961350589e97e8f2823acdGreg Clayton encoding = lldb::eEncodingSint; 183152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 183252f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = 2; 183352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return encoding; 183452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 183552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 183652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: break; 183752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: break; 183852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Enum: return lldb::eEncodingSint; 183952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 184052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count); 184152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 184252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 184352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count); 184452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 184552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 184652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, cast<ParenType>(qual_type)->desugar()).GetEncoding(count); 184752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 184852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedArray: 184952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedExtVector: 185052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::UnresolvedUsing: 185152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Attributed: 185252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateTypeParm: 185352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::SubstTemplateTypeParm: 185452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::SubstTemplateTypeParmPack: 185552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Auto: 185652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::InjectedClassName: 185752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentName: 185852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentTemplateSpecialization: 185952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::PackExpansion: 186052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 186152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 186252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOfExpr: 186352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOf: 186452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Decltype: 186552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateSpecialization: 186652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Atomic: 186752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 186852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 186952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 187052f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = 0; 187152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eEncodingInvalid; 187252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 187352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 187452f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::Format 187552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFormat () const 187652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 187752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 187852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eFormatDefault; 187952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 188052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 188152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 188252f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (qual_type->getTypeClass()) 188352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 188452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::UnaryTransform: 188552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 188652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 188752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::FunctionNoProto: 188852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::FunctionProto: 188952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 189052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 189152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::IncompleteArray: 189252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::VariableArray: 189352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 189452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 189552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: 189652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eFormatVoid; // no value 189752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 189852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ExtVector: 189952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Vector: 190052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 190152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 190252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 190352f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (cast<BuiltinType>(qual_type)->getKind()) 190452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 190552f792329be5db8e38961350589e97e8f2823acdGreg Clayton //default: assert(0 && "Unknown builtin type!"); 190652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UnknownAny: 190752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Void: 190852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::BoundMember: 190952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 191052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 191152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Bool: return lldb::eFormatBoolean; 191252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char_S: 191352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::SChar: 191452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::WChar_S: 191552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char_U: 191652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UChar: 191752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::WChar_U: return lldb::eFormatChar; 191852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char16: return lldb::eFormatUnicode16; 191952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Char32: return lldb::eFormatUnicode32; 192052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UShort: return lldb::eFormatUnsigned; 192152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Short: return lldb::eFormatDecimal; 192252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UInt: return lldb::eFormatUnsigned; 192352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Int: return lldb::eFormatDecimal; 192452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ULong: return lldb::eFormatUnsigned; 192552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Long: return lldb::eFormatDecimal; 192652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ULongLong: return lldb::eFormatUnsigned; 192752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::LongLong: return lldb::eFormatDecimal; 192852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::UInt128: return lldb::eFormatUnsigned; 192952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Int128: return lldb::eFormatDecimal; 193052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Float: return lldb::eFormatFloat; 193152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Double: return lldb::eFormatFloat; 193252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::LongDouble: return lldb::eFormatFloat; 193352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::NullPtr: 193452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Overload: 193552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Dependent: 193652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCId: 193752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCClass: 193852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCSel: 193952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::Half: 194052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ARCUnbridgedCast: 194152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::PseudoObject: 194252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::BuiltinFn: 194352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLEvent: 194452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage1d: 194552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage1dArray: 194652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage1dBuffer: 194752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage2d: 194852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage2dArray: 194952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLImage3d: 195052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::OCLSampler: 195152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eFormatHex; 195252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 195352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 195452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: return lldb::eFormatHex; 195552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::BlockPointer: return lldb::eFormatHex; 195652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: return lldb::eFormatHex; 195752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 195852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: return lldb::eFormatHex; 195952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::MemberPointer: break; 196052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Complex: 196152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 196252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (qual_type->isComplexType()) 196352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eFormatComplex; 196452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 196552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eFormatComplexInteger; 196652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 196752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: break; 196852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: break; 196952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Enum: return lldb::eFormatEnum; 197052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 197152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat(); 197252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Auto: 197352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<AutoType>(qual_type)->desugar()).GetFormat(); 197452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 197552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetFormat(); 197652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 197752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetFormat(); 197852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedArray: 197952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedExtVector: 198052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::UnresolvedUsing: 198152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Attributed: 198252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateTypeParm: 198352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::SubstTemplateTypeParm: 198452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::SubstTemplateTypeParmPack: 198552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::InjectedClassName: 198652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentName: 198752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentTemplateSpecialization: 198852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::PackExpansion: 198952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 199052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 199152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOfExpr: 199252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOf: 199352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Decltype: 199452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateSpecialization: 199552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Atomic: 199652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 199752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 199852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We don't know hot to display this type... 199952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return lldb::eFormatBytes; 200052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 200152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 200252f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic bool 200352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 200452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 200552f792329be5db8e38961350589e97e8f2823acdGreg Clayton while (class_interface_decl) 200652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 200752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl->ivar_size() > 0) 200852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 200952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 201052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (check_superclass) 201152f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl = class_interface_decl->getSuperClass(); 201252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 201352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 201452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 201552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 201652f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 201752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 201852f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t 201952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumChildren (bool omit_empty_base_classes) const 202052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 202152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 202252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 202352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 202452f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t num_children = 0; 202552f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetQualType()); 202652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 202752f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 202852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 202952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 203052f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (cast<BuiltinType>(qual_type)->getKind()) 203152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 203252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCId: // child is Class 203352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case BuiltinType::ObjCClass: // child is Class 203452f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = 1; 203552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 203652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 203752f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 203852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 203952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 204052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 204152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 204252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Complex: return 0; 204352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 204452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 204552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteQualType (m_ast, qual_type)) 204652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 204752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 204852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl = record_type->getDecl(); 204952f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert(record_decl); 205052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 205152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 205252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 205352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (omit_empty_base_classes) 205452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 205552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Check each base classes to see if it or any of its 205652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // base classes contain any fields. This can help 205752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // limit the noise in variable views by not having to 205852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // show base classes that contain no members. 205952f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 206052f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 206152f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_class != base_class_end; 206252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++base_class) 206352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 206452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 206552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 206652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Skip empty base classes 206752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ClangASTContext::RecordHasFields(base_class_decl) == false) 206852f792329be5db8e38961350589e97e8f2823acdGreg Clayton continue; 206952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 207052f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children++; 207152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 207252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 207352f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 207452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 207552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Include all base classes 207652f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children += cxx_record_decl->getNumBases(); 207752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 207852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 207952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 208052f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field, field_end; 208152f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 208252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++num_children; 208352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 208452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 208552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 208652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 208752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 208852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteQualType (m_ast, qual_type)) 208952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 209052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 209152f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert (objc_class_type); 209252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 209352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 209452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 209552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 209652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 209752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 209852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 209952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 210052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (superclass_interface_decl) 210152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 210252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (omit_empty_base_classes) 210352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 210452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ObjCDeclHasIVars (superclass_interface_decl, true)) 210552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++num_children; 210652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 210752f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 210852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++num_children; 210952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 211052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 211152f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children += class_interface_decl->ivar_size(); 211252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 211352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 211452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 211552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 211652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 211752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 211852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 211952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 212052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType pointee_type = pointer_type->getPointeeType(); 212152f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t num_pointee_children = ClangASTType (m_ast,pointee_type).GetNumChildren (omit_empty_base_classes); 212252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // If this type points to a simple type, then it has 1 child 212352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (num_pointee_children == 0) 212452f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = 1; 212552f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 212652f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = num_pointee_children; 212752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 212852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 212952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 213052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Vector: 213152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ExtVector: 213252f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = cast<VectorType>(qual_type.getTypePtr())->getNumElements(); 213352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 213452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 213552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: 213652f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 213752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 213852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 213952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: 214052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 214152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 214252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType pointee_type (pointer_type->getPointeeType()); 214352f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t num_pointee_children = ClangASTType (m_ast,pointee_type).GetNumChildren (omit_empty_base_classes); 214452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (num_pointee_children == 0) 214552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 214652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We have a pointer to a pointee type that claims it has no children. 214752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We will want to look at 214852f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = ClangASTType (m_ast, pointee_type).GetNumPointeeChildren(); 214952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 215052f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 215152f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = num_pointee_children; 215252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 215352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 215452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 215552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 215652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 215752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 215852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 215952f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType pointee_type = reference_type->getPointeeType(); 216052f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t num_pointee_children = ClangASTType (m_ast, pointee_type).GetNumChildren (omit_empty_base_classes); 216152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // If this type points to a simple type, then it has 1 child 216252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (num_pointee_children == 0) 216352f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = 1; 216452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 216552f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = num_pointee_children; 216652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 216752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 216852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 216952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 217052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 217152f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes); 217252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 217352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 217452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 217552f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes); 217652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 217752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 217852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 217952f792329be5db8e38961350589e97e8f2823acdGreg Clayton num_children = ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes); 218052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 218152f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 218252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 218352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 218452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return num_children; 218552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 218652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 218752f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::BasicType 218852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetBasicTypeEnumeration () const 218952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 219052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 219152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 219252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetQualType()); 219352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 219452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_class == clang::Type::Builtin) 219552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 219652f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 219752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 219852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Void: return eBasicTypeVoid; 219952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Bool: return eBasicTypeBool; 220052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char_S: return eBasicTypeSignedChar; 220152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar; 220252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char16: return eBasicTypeChar16; 220352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char32: return eBasicTypeChar32; 220452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar; 220552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::SChar: return eBasicTypeSignedChar; 220652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar; 220752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar; 220852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Short: return eBasicTypeShort; 220952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort; 221052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Int: return eBasicTypeInt; 221152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt; 221252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Long: return eBasicTypeLong; 221352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong; 221452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::LongLong: return eBasicTypeLongLong; 221552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong; 221652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Int128: return eBasicTypeInt128; 221752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128; 221852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 221952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Half: return eBasicTypeHalf; 222052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Float: return eBasicTypeFloat; 222152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Double: return eBasicTypeDouble; 222252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble; 222352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 222452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr; 222552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCId: return eBasicTypeObjCID; 222652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass; 222752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel; 222852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Dependent: 222952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Overload: 223052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::BoundMember: 223152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::PseudoObject: 223252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UnknownAny: 223352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::BuiltinFn: 223452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ARCUnbridgedCast: 223552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLEvent: 223652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage1d: 223752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage1dArray: 223852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage1dBuffer: 223952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage2d: 224052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage2dArray: 224152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage3d: 224252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLSampler: 224352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eBasicTypeOther; 224452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 224552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 224652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 224752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return eBasicTypeInvalid; 224852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 224952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 225052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 225152f792329be5db8e38961350589e97e8f2823acdGreg Clayton#pragma mark Aggregate Types 225252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 225352f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t 225452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumDirectBaseClasses () const 225552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 225652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 225752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 225852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 225952f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t count = 0; 226052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 226152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 226252f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 226352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 226452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 226552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 226652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 226752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 226852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 226952f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = cxx_record_decl->getNumBases(); 227052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 227152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 227252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 227352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 227452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 227552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 227652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType(); 227752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 227852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 227952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl(); 228052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl && class_interface_decl->getSuperClass()) 228152f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = 1; 228252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 228352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 228452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 228552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 228652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 228752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 228852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 228952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 229052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType(); 229152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 229252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 229352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 229452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 229552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl && class_interface_decl->getSuperClass()) 229652f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = 1; 229752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 229852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 229952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 230052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 230152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 230252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 230352f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumDirectBaseClasses (); 230452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 230552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 230652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 230752f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumDirectBaseClasses (); 230852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 230952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 231052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 231152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumDirectBaseClasses (); 231252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 231352f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 231452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 231552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 231652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return count; 231752f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 231852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 231952f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t 232052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumVirtualBaseClasses () const 232152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 232252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 232352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 232452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 232552f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t count = 0; 232652f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 232752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 232852f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 232952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 233052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 233152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 233252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 233352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 233452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 233552f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = cxx_record_decl->getNumVBases(); 233652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 233752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 233852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 233952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 234052f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumVirtualBaseClasses(); 234152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 234252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 234352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 234452f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumVirtualBaseClasses(); 234552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 234652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 234752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 234852f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumVirtualBaseClasses(); 234952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 235052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 235152f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 235252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 235352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 235452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return count; 235552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 235652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 235752f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t 235852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumFields () const 235952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 236052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 236152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 236252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 236352f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t count = 0; 236452f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 236552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 236652f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 236752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 236852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 236952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 237052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 237152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr()); 237252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (record_type) 237352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 237452f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl *record_decl = record_type->getDecl(); 237552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (record_decl) 237652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 237752f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t field_idx = 0; 237852f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field, field_end; 237952f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 238052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++field_idx; 238152f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = field_idx; 238252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 238352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 238452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 238552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 238652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 238752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 238852f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields(); 238952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 239052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 239152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 239252f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumFields(); 239352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 239452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 239552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 239652f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumFields(); 239752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 239852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 239952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 240052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 240152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 240252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType(); 240352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 240452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 240552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl(); 240652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 240752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 240852f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = class_interface_decl->ivar_size(); 240952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 241052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 241152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 241252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 241352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 241452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 241552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 241652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 241752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 241852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 241952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 242052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 242152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 242252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 242352f792329be5db8e38961350589e97e8f2823acdGreg Clayton count = class_interface_decl->ivar_size(); 242452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 242552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 242652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 242752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 242852f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 242952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 243052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 243152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return count; 243252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 243352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 243452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 243552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetDirectBaseClassAtIndex (size_t idx, uint32_t *bit_offset_ptr) const 243652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 243752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 243852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 243952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 244052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 244152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 244252f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 244352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 244452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 244552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 244652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 244752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 244852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 244952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 245052f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t curr_idx = 0; 245152f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 245252f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 245352f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_class != base_class_end; 245452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++base_class, ++curr_idx) 245552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 245652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (curr_idx == idx) 245752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 245852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bit_offset_ptr) 245952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 246052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(cxx_record_decl); 246152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 246252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (base_class->isVirtual()) 246352f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; 246452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 246552f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; 246652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 246752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, base_class->getType()); 246852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 246952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 247052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 247152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 247252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 247352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 247452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 247552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx == 0 && GetCompleteType()) 247652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 247752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType(); 247852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 247952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 248052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl(); 248152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 248252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 248352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 248452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (superclass_interface_decl) 248552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 248652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bit_offset_ptr) 248752f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bit_offset_ptr = 0; 248852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl)); 248952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 249052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 249152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 249252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 249352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 249452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 249552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 249652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 249752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx == 0 && GetCompleteType()) 249852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 249952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType(); 250052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 250152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 250252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 250352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 250452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 250552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 250652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 250752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (superclass_interface_decl) 250852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 250952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bit_offset_ptr) 251052f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bit_offset_ptr = 0; 251152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl)); 251252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 251352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 251452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 251552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 251652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 251752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 251852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 251952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 252052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetDirectBaseClassAtIndex (idx, bit_offset_ptr); 252152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 252252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 252352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetDirectBaseClassAtIndex (idx, bit_offset_ptr); 252452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 252552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 252652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetDirectBaseClassAtIndex (idx, bit_offset_ptr); 252752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 252852f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 252952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 253052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 253152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 253252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 253352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 253452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 253552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetVirtualBaseClassAtIndex (size_t idx, uint32_t *bit_offset_ptr) const 253652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 253752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 253852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 253952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 254052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 254152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 254252f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 254352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 254452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 254552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 254652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 254752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 254852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 254952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 255052f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t curr_idx = 0; 255152f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 255252f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end(); 255352f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_class != base_class_end; 255452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++base_class, ++curr_idx) 255552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 255652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (curr_idx == idx) 255752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 255852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bit_offset_ptr) 255952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 256052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(cxx_record_decl); 256152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 256252f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; 256352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 256452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 256552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, base_class->getType()); 256652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 256752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 256852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 256952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 257052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 257152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 257252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 257352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetVirtualBaseClassAtIndex (idx, bit_offset_ptr); 257452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 257552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 257652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetVirtualBaseClassAtIndex (idx, bit_offset_ptr); 257752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 257852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 257952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetVirtualBaseClassAtIndex (idx, bit_offset_ptr); 258052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 258152f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 258252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 258352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 258452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 258552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 258652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 258752f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic clang_type_t 258852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonGetObjCFieldAtIndex (clang::ASTContext *ast, 258952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl, 259052f792329be5db8e38961350589e97e8f2823acdGreg Clayton size_t idx, 259152f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string& name, 259252f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint64_t *bit_offset_ptr, 259352f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t *bitfield_bit_size_ptr, 259452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool *is_bitfield_ptr) 259552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 259652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 259752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 259852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx < (class_interface_decl->ivar_size())) 259952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 260052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 260152f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t ivar_idx = 0; 260252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 260352f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx) 260452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 260552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ivar_idx == idx) 260652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 260752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 260852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 260952f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType ivar_qual_type(ivar_decl->getType()); 261052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 261152f792329be5db8e38961350589e97e8f2823acdGreg Clayton name.assign(ivar_decl->getNameAsString()); 261252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 261352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bit_offset_ptr) 261452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 261552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl); 261652f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx); 261752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 261852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 261952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool is_bitfield = ivar_pos->isBitField(); 262052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 262152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bitfield_bit_size_ptr) 262252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 262352f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bitfield_bit_size_ptr = 0; 262452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 262552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_bitfield && ast) 262652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 262752f792329be5db8e38961350589e97e8f2823acdGreg Clayton Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth(); 262852f792329be5db8e38961350589e97e8f2823acdGreg Clayton llvm::APSInt bitfield_apsint; 262952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast)) 263052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 263152f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue(); 263252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 263352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 263452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 263552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_bitfield_ptr) 263652f792329be5db8e38961350589e97e8f2823acdGreg Clayton *is_bitfield_ptr = is_bitfield; 263752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 263852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ivar_qual_type.getAsOpaquePtr(); 263952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 264052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 264152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 264252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 264352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 264452f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 264552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 264652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 264752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetFieldAtIndex (size_t idx, 264852f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string& name, 264952f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint64_t *bit_offset_ptr, 265052f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t *bitfield_bit_size_ptr, 265152f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool *is_bitfield_ptr) const 265252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 265352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 265452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 265552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 265652f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 265752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 265852f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 265952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 266052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 266152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 266252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 266352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 266452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl = record_type->getDecl(); 266552f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t field_idx = 0; 266652f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field, field_end; 266752f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx) 266852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 266952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx == field_idx) 267052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 267152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Print the member type if requested 267252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Print the member name and equal sign 267352f792329be5db8e38961350589e97e8f2823acdGreg Clayton name.assign(field->getNameAsString()); 267452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 267552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Figure out the type byte size (field_type_info.first) and 267652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // alignment (field_type_info.second) from the AST context. 267752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bit_offset_ptr) 267852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 267952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(record_decl); 268052f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bit_offset_ptr = record_layout.getFieldOffset (field_idx); 268152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 268252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 268352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool is_bitfield = field->isBitField(); 268452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 268552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bitfield_bit_size_ptr) 268652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 268752f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bitfield_bit_size_ptr = 0; 268852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 268952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_bitfield) 269052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 269152f792329be5db8e38961350589e97e8f2823acdGreg Clayton Expr *bitfield_bit_size_expr = field->getBitWidth(); 269252f792329be5db8e38961350589e97e8f2823acdGreg Clayton llvm::APSInt bitfield_apsint; 269352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *m_ast)) 269452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 269552f792329be5db8e38961350589e97e8f2823acdGreg Clayton *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue(); 269652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 269752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 269852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 269952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_bitfield_ptr) 270052f792329be5db8e38961350589e97e8f2823acdGreg Clayton *is_bitfield_ptr = is_bitfield; 270152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 270252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, field->getType()); 270352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 270452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 270552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 270652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 270752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 270852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 270952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 271052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 271152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType(); 271252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 271352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 271452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl(); 271552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, GetObjCFieldAtIndex(m_ast, class_interface_decl, idx, name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr)); 271652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 271752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 271852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 271952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 272052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 272152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 272252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 272352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 272452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 272552f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert (objc_class_type); 272652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 272752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 272852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 272952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, GetObjCFieldAtIndex(m_ast, class_interface_decl, idx, name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr)); 273052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 273152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 273252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 273352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 273452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 273552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 273652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()). 273752f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetFieldAtIndex (idx, 273852f792329be5db8e38961350589e97e8f2823acdGreg Clayton name, 273952f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_offset_ptr, 274052f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_size_ptr, 274152f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_bitfield_ptr); 274252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 274352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 274452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()). 274552f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetFieldAtIndex (idx, 274652f792329be5db8e38961350589e97e8f2823acdGreg Clayton name, 274752f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_offset_ptr, 274852f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_size_ptr, 274952f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_bitfield_ptr); 275052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 275152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 275252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()). 275352f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetFieldAtIndex (idx, 275452f792329be5db8e38961350589e97e8f2823acdGreg Clayton name, 275552f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_offset_ptr, 275652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_size_ptr, 275752f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_bitfield_ptr); 275852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 275952f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 276052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 276152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 276252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 276352f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 276452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 276552f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t 276652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetIndexOfFieldWithName (const char* name, 276752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType* field_clang_type_ptr, 276852f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint64_t *bit_offset_ptr, 276952f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t *bitfield_bit_size_ptr, 277052f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool *is_bitfield_ptr) const 277152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 277252f792329be5db8e38961350589e97e8f2823acdGreg Clayton unsigned count = GetNumFields(); 277352f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string field_name; 277452f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (unsigned index = 0; index < count; index++) 277552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 277652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType field_clang_type (GetFieldAtIndex(index, field_name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr)); 277752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (strcmp(field_name.c_str(), name) == 0) 277852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 277952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (field_clang_type_ptr) 278052f792329be5db8e38961350589e97e8f2823acdGreg Clayton *field_clang_type_ptr = field_clang_type; 278152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return index; 278252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 278352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 278452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return UINT32_MAX; 278552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 278652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 278752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// If a pointer to a pointee type (the clang_type arg) says that it has no 278852f792329be5db8e38961350589e97e8f2823acdGreg Clayton// children, then we either need to trust it, or override it and return a 278952f792329be5db8e38961350589e97e8f2823acdGreg Clayton// different result. For example, an "int *" has one child that is an integer, 279052f792329be5db8e38961350589e97e8f2823acdGreg Clayton// but a function pointer doesn't have any children. Likewise if a Record type 279152f792329be5db8e38961350589e97e8f2823acdGreg Clayton// claims it has no children, then there really is nothing to show. 279252f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t 279352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumPointeeChildren () const 279452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 279552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 279652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 279752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 279852f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 279952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 280052f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 280152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 280252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 280352f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (cast<clang::BuiltinType>(qual_type)->getKind()) 280452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 280552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UnknownAny: 280652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Void: 280752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::NullPtr: 280852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLEvent: 280952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage1d: 281052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage1dArray: 281152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage1dBuffer: 281252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage2d: 281352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage2dArray: 281452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLImage3d: 281552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::OCLSampler: 281652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 281752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Bool: 281852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char_U: 281952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UChar: 282052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::WChar_U: 282152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char16: 282252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char32: 282352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UShort: 282452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UInt: 282552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ULong: 282652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ULongLong: 282752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::UInt128: 282852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Char_S: 282952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::SChar: 283052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::WChar_S: 283152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Short: 283252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Int: 283352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Long: 283452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::LongLong: 283552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Int128: 283652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Float: 283752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Double: 283852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::LongDouble: 283952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Dependent: 284052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Overload: 284152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCId: 284252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCClass: 284352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCSel: 284452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::BoundMember: 284552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::Half: 284652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ARCUnbridgedCast: 284752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::PseudoObject: 284852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::BuiltinFn: 284952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 1; 285052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 285152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 285252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 285352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Complex: return 1; 285452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: return 1; 285552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them 285652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: return 1; 285752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: return 1; 285852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::MemberPointer: return 0; 285952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: return 0; 286052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::IncompleteArray: return 0; 286152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::VariableArray: return 0; 286252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedArray: return 0; 286352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedExtVector: return 0; 286452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Vector: return 0; 286552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ExtVector: return 0; 286652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children... 286752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children... 286852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::UnresolvedUsing: return 0; 286952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumPointeeChildren (); 287052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumPointeeChildren (); 287152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumPointeeChildren (); 287252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOfExpr: return 0; 287352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOf: return 0; 287452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Decltype: return 0; 287552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: return 0; 287652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Enum: return 1; 287752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateTypeParm: return 1; 287852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::SubstTemplateTypeParm: return 1; 287952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateSpecialization: return 1; 288052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::InjectedClassName: return 0; 288152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentName: return 1; 288252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentTemplateSpecialization: return 1; 288352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: return 0; 288452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: return 0; 288552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: return 1; 288652f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 288752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 288852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 288952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 289052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 289152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 289252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 289352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 289452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetChildClangTypeAtIndex (ExecutionContext *exe_ctx, 289552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const char *parent_name, 289652f792329be5db8e38961350589e97e8f2823acdGreg Clayton size_t idx, 289752f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool transparent_pointers, 289852f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool omit_empty_base_classes, 289952f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool ignore_array_bounds, 290052f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string& child_name, 290152f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t &child_byte_size, 290252f792329be5db8e38961350589e97e8f2823acdGreg Clayton int32_t &child_byte_offset, 290352f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t &child_bitfield_bit_size, 290452f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t &child_bitfield_bit_offset, 290552f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool &child_is_base_class, 290652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool &child_is_deref_of_parent) const 290752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 290852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 290952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 291052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 291152f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType parent_qual_type(GetCanonicalQualType()); 291252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 291352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_size = 0; 291452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset = 0; 291552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class = false; 291652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 291752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool idx_is_valid = idx < GetNumChildren (omit_empty_base_classes); 291852f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t bit_offset; 291952f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (parent_type_class) 292052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 292152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: 292252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx_is_valid) 292352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 292452f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 292552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 292652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCId: 292752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::BuiltinType::ObjCClass: 292852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name = "isa"; 292952f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size = m_ast->getTypeSize(m_ast->ObjCBuiltinClassTy) / CHAR_BIT; 293052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, m_ast->ObjCBuiltinClassTy); 293152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 293252f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 293352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 293452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 293552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 293652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 293752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 293852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 293952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx_is_valid && GetCompleteType()) 294052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 294152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 294252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl = record_type->getDecl(); 294352f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert(record_decl); 294452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(record_decl); 294552f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t child_idx = 0; 294652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 294752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 294852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 294952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 295052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We might have base classes to print out first 295152f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 295252f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 295352f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_class != base_class_end; 295452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++base_class) 295552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 295652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *base_class_decl = NULL; 295752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 295852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Skip empty base classes 295952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (omit_empty_base_classes) 296052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 296152f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 296252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ClangASTContext::RecordHasFields(base_class_decl) == false) 296352f792329be5db8e38961350589e97e8f2823acdGreg Clayton continue; 296452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 296552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 296652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx == child_idx) 296752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 296852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (base_class_decl == NULL) 296952f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 297052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 297152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 297252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (base_class->isVirtual()) 297352f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; 297452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 297552f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; 297652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 297752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Base classes should be a multiple of 8 bits in size 297852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = bit_offset/8; 297952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType base_class_clang_type(m_ast, base_class->getType()); 298052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name = base_class_clang_type.GetTypeName(); 298152f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(); 298252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 298352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Base classes bit sizes should be a multiple of 8 bits in size 298452f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert (base_class_clang_type_bit_size % 8 == 0); 298552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size = base_class_clang_type_bit_size / 8; 298652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class = true; 298752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return base_class_clang_type; 298852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 298952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We don't increment the child index in the for loop since we might 299052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // be skipping empty base classes 299152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++child_idx; 299252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 299352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 299452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Make sure index is in range... 299552f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t field_idx = 0; 299652f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field, field_end; 299752f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 299852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 299952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx == child_idx) 300052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 300152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Print the member type if requested 300252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Print the member name and equal sign 300352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name.assign(field->getNameAsString().c_str()); 300452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 300552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Figure out the type byte size (field_type_info.first) and 300652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // alignment (field_type_info.second) from the AST context. 300752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType field_clang_type (m_ast, field->getType()); 300852f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert(field_idx < record_layout.getFieldCount()); 300952f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size = field_clang_type.GetByteSize(); 301052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 301152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Figure out the field offset within the current struct/union/class type 301252f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_offset = record_layout.getFieldOffset (field_idx); 301352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = bit_offset / 8; 301452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ClangASTContext::FieldIsBitfield (m_ast, *field, child_bitfield_bit_size)) 301552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset = bit_offset % 8; 301652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 301752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return field_clang_type; 301852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 301952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 302052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 302152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 302252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 302352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 302452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 302552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx_is_valid && GetCompleteType()) 302652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 302752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 302852f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert (objc_class_type); 302952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 303052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 303152f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t child_idx = 0; 303252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 303352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 303452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 303552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 303652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 303752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ASTRecordLayout &interface_layout = m_ast->getASTObjCInterfaceLayout(class_interface_decl); 303852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 303952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (superclass_interface_decl) 304052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 304152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (omit_empty_base_classes) 304252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 304352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType base_class_clang_type (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl)); 304452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0) 304552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 304652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx == 0) 304752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 304852f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType ivar_qual_type(m_ast->getObjCInterfaceType(superclass_interface_decl)); 304952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 305052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 305152f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 305252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 305352f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::pair<uint64_t, unsigned> ivar_type_info = m_ast->getTypeInfo(ivar_qual_type.getTypePtr()); 305452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 305552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size = ivar_type_info.first / 8; 305652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = 0; 305752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class = true; 305852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 305952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, ivar_qual_type); 306052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 306152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 306252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++child_idx; 306352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 306452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 306552f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 306652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++child_idx; 306752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 306852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 306952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint32_t superclass_idx = child_idx; 307052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 307152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx < (child_idx + class_interface_decl->ivar_size())) 307252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 307352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 307452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 307552f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 307652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 307752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (child_idx == idx) 307852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 307952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCIvarDecl* ivar_decl = *ivar_pos; 308052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 308152f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType ivar_qual_type(ivar_decl->getType()); 308252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 308352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name.assign(ivar_decl->getNameAsString().c_str()); 308452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 308552f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::pair<uint64_t, unsigned> ivar_type_info = m_ast->getTypeInfo(ivar_qual_type.getTypePtr()); 308652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 308752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size = ivar_type_info.first / 8; 308852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 308952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Figure out the field offset within the current struct/union/class type 309052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since 309152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // that doesn't account for the space taken up by unbacked properties, or from 309252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // the changing size of base classes that are newer than this class. 309352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // So if we have a process around that we can ask about this object, do so. 309452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = LLDB_INVALID_IVAR_OFFSET; 309552f792329be5db8e38961350589e97e8f2823acdGreg Clayton Process *process = NULL; 309652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (exe_ctx) 309752f792329be5db8e38961350589e97e8f2823acdGreg Clayton process = exe_ctx->GetProcessPtr(); 309852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (process) 309952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 310052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime(); 310152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_runtime != NULL) 310252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 310352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType parent_ast_type (m_ast, parent_qual_type); 310452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str()); 310552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 310652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 310752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 310852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Setting this to UINT32_MAX to make sure we don't compute it twice... 310952f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_offset = UINT32_MAX; 311052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 311152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET) 311252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 311352f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 311452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = bit_offset / 8; 311552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 311652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 311752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset 311852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // of a bitfield within its containing object. So regardless of where we get the byte 311952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // offset from, we still need to get the bit offset for bitfields from the layout. 312052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 312152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ClangASTContext::FieldIsBitfield (m_ast, ivar_decl, child_bitfield_bit_size)) 312252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 312352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bit_offset == UINT32_MAX) 312452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 312552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 312652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset = bit_offset % 8; 312752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 312852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, ivar_qual_type); 312952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 313052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++child_idx; 313152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 313252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 313352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 313452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 313552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 313652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 313752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 313852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 313952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx_is_valid) 314052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 314152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_clang_type (GetPointeeType()); 314252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 314352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (transparent_pointers && pointee_clang_type.IsAggregateType()) 314452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 314552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_deref_of_parent = false; 314652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool tmp_child_is_deref_of_parent = false; 314752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx, 314852f792329be5db8e38961350589e97e8f2823acdGreg Clayton parent_name, 314952f792329be5db8e38961350589e97e8f2823acdGreg Clayton idx, 315052f792329be5db8e38961350589e97e8f2823acdGreg Clayton transparent_pointers, 315152f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 315252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ignore_array_bounds, 315352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name, 315452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size, 315552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset, 315652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_size, 315752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset, 315852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class, 315952f792329be5db8e38961350589e97e8f2823acdGreg Clayton tmp_child_is_deref_of_parent); 316052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 316152f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 316252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 316352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_deref_of_parent = true; 316452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (parent_name) 316552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 316652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name.assign(1, '*'); 316752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name += parent_name; 316852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 316952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 317052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We have a pointer to an simple type 317152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx == 0 && pointee_clang_type.GetCompleteType()) 317252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 317352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size = pointee_clang_type.GetByteSize(); 317452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = 0; 317552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_clang_type; 317652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 317752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 317852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 317952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 318052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 318152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Vector: 318252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ExtVector: 318352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx_is_valid) 318452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 318552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const VectorType *array = cast<VectorType>(parent_qual_type.getTypePtr()); 318652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (array) 318752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 318852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType element_type (m_ast, array->getElementType()); 318952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (element_type.GetCompleteType()) 319052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 319152f792329be5db8e38961350589e97e8f2823acdGreg Clayton char element_name[64]; 319252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ::snprintf (element_name, sizeof (element_name), "[%zu]", idx); 319352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name.assign(element_name); 319452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size = element_type.GetByteSize(); 319552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = (int32_t)idx * (int32_t)child_byte_size; 319652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return element_type; 319752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 319852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 319952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 320052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 320152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 320252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: 320352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::IncompleteArray: 320452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ignore_array_bounds || idx_is_valid) 320552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 320652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ArrayType *array = cast<ArrayType>(parent_qual_type.getTypePtr()); 320752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (array) 320852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 320952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType element_type (m_ast, array->getElementType()); 321052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (element_type.GetCompleteType()) 321152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 321252f792329be5db8e38961350589e97e8f2823acdGreg Clayton char element_name[64]; 321352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ::snprintf (element_name, sizeof (element_name), "[%zu]", idx); 321452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name.assign(element_name); 321552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size = element_type.GetByteSize(); 321652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = (int32_t)idx * (int32_t)child_byte_size; 321752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return element_type; 321852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 321952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 322052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 322152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 322252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 322352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 322452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: 322552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx_is_valid) 322652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 322752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_clang_type (GetPointeeType()); 322852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 322952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Don't dereference "void *" pointers 323052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_clang_type.IsVoidType()) 323152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 323252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 323352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (transparent_pointers && pointee_clang_type.IsAggregateType ()) 323452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 323552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_deref_of_parent = false; 323652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool tmp_child_is_deref_of_parent = false; 323752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx, 323852f792329be5db8e38961350589e97e8f2823acdGreg Clayton parent_name, 323952f792329be5db8e38961350589e97e8f2823acdGreg Clayton idx, 324052f792329be5db8e38961350589e97e8f2823acdGreg Clayton transparent_pointers, 324152f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 324252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ignore_array_bounds, 324352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name, 324452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size, 324552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset, 324652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_size, 324752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset, 324852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class, 324952f792329be5db8e38961350589e97e8f2823acdGreg Clayton tmp_child_is_deref_of_parent); 325052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 325152f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 325252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 325352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_deref_of_parent = true; 325452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 325552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (parent_name) 325652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 325752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name.assign(1, '*'); 325852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name += parent_name; 325952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 326052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 326152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We have a pointer to an simple type 326252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx == 0) 326352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 326452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size = pointee_clang_type.GetByteSize(); 326552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = 0; 326652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_clang_type; 326752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 326852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 326952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 327052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 327152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 327252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 327352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 327452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx_is_valid) 327552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 327652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr()); 327752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_clang_type (m_ast, reference_type->getPointeeType()); 327852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (transparent_pointers && pointee_clang_type.IsAggregateType ()) 327952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 328052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_deref_of_parent = false; 328152f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool tmp_child_is_deref_of_parent = false; 328252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx, 328352f792329be5db8e38961350589e97e8f2823acdGreg Clayton parent_name, 328452f792329be5db8e38961350589e97e8f2823acdGreg Clayton idx, 328552f792329be5db8e38961350589e97e8f2823acdGreg Clayton transparent_pointers, 328652f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 328752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ignore_array_bounds, 328852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name, 328952f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size, 329052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset, 329152f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_size, 329252f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset, 329352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class, 329452f792329be5db8e38961350589e97e8f2823acdGreg Clayton tmp_child_is_deref_of_parent); 329552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 329652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 329752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 329852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (parent_name) 329952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 330052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name.assign(1, '&'); 330152f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name += parent_name; 330252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 330352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 330452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We have a pointer to an simple type 330552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (idx == 0) 330652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 330752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size = pointee_clang_type.GetByteSize(); 330852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset = 0; 330952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_clang_type; 331052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 331152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 331252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 331352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 331452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 331552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 331652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 331752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType typedefed_clang_type (m_ast, cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType()); 331852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return typedefed_clang_type.GetChildClangTypeAtIndex (exe_ctx, 331952f792329be5db8e38961350589e97e8f2823acdGreg Clayton parent_name, 332052f792329be5db8e38961350589e97e8f2823acdGreg Clayton idx, 332152f792329be5db8e38961350589e97e8f2823acdGreg Clayton transparent_pointers, 332252f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 332352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ignore_array_bounds, 332452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name, 332552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size, 332652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset, 332752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_size, 332852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset, 332952f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class, 333052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_deref_of_parent); 333152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 333252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 333352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 333452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 333552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 333652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType elaborated_clang_type (m_ast, cast<ElaboratedType>(parent_qual_type)->getNamedType()); 333752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return elaborated_clang_type.GetChildClangTypeAtIndex (exe_ctx, 333852f792329be5db8e38961350589e97e8f2823acdGreg Clayton parent_name, 333952f792329be5db8e38961350589e97e8f2823acdGreg Clayton idx, 334052f792329be5db8e38961350589e97e8f2823acdGreg Clayton transparent_pointers, 334152f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 334252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ignore_array_bounds, 334352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name, 334452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size, 334552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset, 334652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_size, 334752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset, 334852f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class, 334952f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_deref_of_parent); 335052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 335152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 335252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 335352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 335452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType paren_clang_type (m_ast, llvm::cast<clang::ParenType>(parent_qual_type)->desugar()); 335552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return paren_clang_type.GetChildClangTypeAtIndex (exe_ctx, 335652f792329be5db8e38961350589e97e8f2823acdGreg Clayton parent_name, 335752f792329be5db8e38961350589e97e8f2823acdGreg Clayton idx, 335852f792329be5db8e38961350589e97e8f2823acdGreg Clayton transparent_pointers, 335952f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 336052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ignore_array_bounds, 336152f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_name, 336252f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_size, 336352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_byte_offset, 336452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_size, 336552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_bitfield_bit_offset, 336652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_base_class, 336752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_is_deref_of_parent); 336852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 336952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 337052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 337152f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 337252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 337352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 337452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 337552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 337652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 337752f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic inline bool 337852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonBaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 337952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 338052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false; 338152f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 338252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 338352f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic uint32_t 338452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonGetIndexForRecordBase 338552f792329be5db8e38961350589e97e8f2823acdGreg Clayton( 338652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl, 338752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXBaseSpecifier *base_spec, 338852f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool omit_empty_base_classes 338952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ) 339052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 339152f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t child_idx = 0; 339252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 339352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 339452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 339552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // const char *super_name = record_decl->getNameAsCString(); 339652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 339752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 339852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 339952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 340052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 340152f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 340252f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 340352f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_class != base_class_end; 340452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++base_class) 340552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 340652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (omit_empty_base_classes) 340752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 340852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (BaseSpecifierIsEmpty (base_class)) 340952f792329be5db8e38961350589e97e8f2823acdGreg Clayton continue; 341052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 341152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 341252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 341352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_idx, 341452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 341552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 341652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 341752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (base_class == base_spec) 341852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return child_idx; 341952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++child_idx; 342052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 342152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 342252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 342352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return UINT32_MAX; 342452f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 342552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 342652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 342752f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic uint32_t 342852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonGetIndexForRecordChild (const RecordDecl *record_decl, 342952f792329be5db8e38961350589e97e8f2823acdGreg Clayton NamedDecl *canonical_decl, 343052f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool omit_empty_base_classes) 343152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 343252f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t child_idx = ClangASTContext::GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), 343352f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes); 343452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 343552f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field, field_end; 343652f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 343752f792329be5db8e38961350589e97e8f2823acdGreg Clayton field != field_end; 343852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++field, ++child_idx) 343952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 344052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (field->getCanonicalDecl() == canonical_decl) 344152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return child_idx; 344252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 344352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 344452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return UINT32_MAX; 344552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 344652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 344752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Look for a child member (doesn't include base classes, but it does include 344852f792329be5db8e38961350589e97e8f2823acdGreg Clayton// their members) in the type hierarchy. Returns an index path into "clang_type" 344952f792329be5db8e38961350589e97e8f2823acdGreg Clayton// on how to reach the appropriate member. 345052f792329be5db8e38961350589e97e8f2823acdGreg Clayton// 345152f792329be5db8e38961350589e97e8f2823acdGreg Clayton// class A 345252f792329be5db8e38961350589e97e8f2823acdGreg Clayton// { 345352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// public: 345452f792329be5db8e38961350589e97e8f2823acdGreg Clayton// int m_a; 345552f792329be5db8e38961350589e97e8f2823acdGreg Clayton// int m_b; 345652f792329be5db8e38961350589e97e8f2823acdGreg Clayton// }; 345752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// 345852f792329be5db8e38961350589e97e8f2823acdGreg Clayton// class B 345952f792329be5db8e38961350589e97e8f2823acdGreg Clayton// { 346052f792329be5db8e38961350589e97e8f2823acdGreg Clayton// }; 346152f792329be5db8e38961350589e97e8f2823acdGreg Clayton// 346252f792329be5db8e38961350589e97e8f2823acdGreg Clayton// class C : 346352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// public B, 346452f792329be5db8e38961350589e97e8f2823acdGreg Clayton// public A 346552f792329be5db8e38961350589e97e8f2823acdGreg Clayton// { 346652f792329be5db8e38961350589e97e8f2823acdGreg Clayton// }; 346752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// 346852f792329be5db8e38961350589e97e8f2823acdGreg Clayton// If we have a clang type that describes "class C", and we wanted to looked 346952f792329be5db8e38961350589e97e8f2823acdGreg Clayton// "m_b" in it: 347052f792329be5db8e38961350589e97e8f2823acdGreg Clayton// 347152f792329be5db8e38961350589e97e8f2823acdGreg Clayton// With omit_empty_base_classes == false we would get an integer array back with: 347252f792329be5db8e38961350589e97e8f2823acdGreg Clayton// { 1, 1 } 347352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// The first index 1 is the child index for "class A" within class C 347452f792329be5db8e38961350589e97e8f2823acdGreg Clayton// The second index 1 is the child index for "m_b" within class A 347552f792329be5db8e38961350589e97e8f2823acdGreg Clayton// 347652f792329be5db8e38961350589e97e8f2823acdGreg Clayton// With omit_empty_base_classes == true we would get an integer array back with: 347752f792329be5db8e38961350589e97e8f2823acdGreg Clayton// { 0, 1 } 347852f792329be5db8e38961350589e97e8f2823acdGreg Clayton// The first index 0 is the child index for "class A" within class C (since class B doesn't have any members it doesn't count) 347952f792329be5db8e38961350589e97e8f2823acdGreg Clayton// The second index 1 is the child index for "m_b" within class A 348052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 348152f792329be5db8e38961350589e97e8f2823acdGreg Claytonsize_t 348252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetIndexOfChildMemberWithName (const char *name, 348352f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool omit_empty_base_classes, 348452f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::vector<uint32_t>& child_indexes) const 348552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 348652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid() && name && name[0]) 348752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 348852f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 348952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 349052f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 349152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 349252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 349352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType ()) 349452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 349552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 349652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl = record_type->getDecl(); 349752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 349852f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert(record_decl); 349952f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t child_idx = 0; 350052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 350152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 350252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 350352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Try and find a field that matches NAME 350452f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field, field_end; 350552f792329be5db8e38961350589e97e8f2823acdGreg Clayton StringRef name_sref(name); 350652f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 350752f792329be5db8e38961350589e97e8f2823acdGreg Clayton field != field_end; 350852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++field, ++child_idx) 350952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 351052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (field->getName().equals (name_sref)) 351152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 351252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We have to add on the number of base classes to this index! 351352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 351452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return child_indexes.size(); 351552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 351652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 351752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 351852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 351952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 352052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *parent_record_decl = cxx_record_decl; 352152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 352252f792329be5db8e38961350589e97e8f2823acdGreg Clayton //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 352352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 352452f792329be5db8e38961350589e97e8f2823acdGreg Clayton //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 352552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Didn't find things easily, lets let clang do its thang... 352652f792329be5db8e38961350589e97e8f2823acdGreg Clayton IdentifierInfo & ident_ref = m_ast->Idents.get(name_sref); 352752f792329be5db8e38961350589e97e8f2823acdGreg Clayton DeclarationName decl_name(&ident_ref); 352852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 352952f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXBasePaths paths; 353052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 353152f792329be5db8e38961350589e97e8f2823acdGreg Clayton decl_name.getAsOpaquePtr(), 353252f792329be5db8e38961350589e97e8f2823acdGreg Clayton paths)) 353352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 353452f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 353552f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (path = paths.begin(); path != path_end; ++path) 353652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 353752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const size_t num_path_elements = path->size(); 353852f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (size_t e=0; e<num_path_elements; ++e) 353952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 354052f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXBasePathElement elem = (*path)[e]; 354152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 354252f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 354352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (child_idx == UINT32_MAX) 354452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 354552f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes.clear(); 354652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 354752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 354852f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 354952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 355052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes.push_back (child_idx); 355152f792329be5db8e38961350589e97e8f2823acdGreg Clayton parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 355252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 355352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 355452f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (NamedDecl *path_decl : path->Decls) 355552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 355652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes); 355752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (child_idx == UINT32_MAX) 355852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 355952f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes.clear(); 356052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 356152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 356252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 356352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 356452f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes.push_back (child_idx); 356552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 356652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 356752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 356852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return child_indexes.size(); 356952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 357052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 357152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 357252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 357352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 357452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 357552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 357652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 357752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType ()) 357852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 357952f792329be5db8e38961350589e97e8f2823acdGreg Clayton StringRef name_sref(name); 358052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 358152f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert (objc_class_type); 358252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 358352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 358452f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t child_idx = 0; 358552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 358652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 358752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 358852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 358952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 359052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 359152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 359252f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 359352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 359452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 359552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 359652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ivar_decl->getName().equals (name_sref)) 359752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 359852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 359952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 360052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++child_idx; 360152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 360252f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes.push_back (child_idx); 360352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return child_indexes.size(); 360452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 360552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 360652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 360752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (superclass_interface_decl) 360852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 360952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // The super class index is always zero for ObjC classes, 361052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // so we push it onto the child indexes in case we find 361152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // an ivar in our superclass... 361252f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes.push_back (0); 361352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 361452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType superclass_clang_type (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl)); 361552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (superclass_clang_type.GetIndexOfChildMemberWithName (name, 361652f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 361752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes)) 361852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 361952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We did find an ivar in a superclass so just 362052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // return the results! 362152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return child_indexes.size(); 362252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 362352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 362452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // We didn't find an ivar matching "name" in our 362552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // superclass, pop the superclass zero index that 362652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // we pushed on above. 362752f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes.pop_back(); 362852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 362952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 363052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 363152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 363252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 363352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 363452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 363552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 363652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType objc_object_clang_type (m_ast, cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType()); 363752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return objc_object_clang_type.GetIndexOfChildMemberWithName (name, 363852f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 363952f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes); 364052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 364152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 364252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 364352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 364452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: 364552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 364652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 364752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // const uint64_t element_count = array->getSize().getLimitedValue(); 364852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 364952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // if (idx < element_count) 365052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // { 365152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 365252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 365352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // char element_name[32]; 365452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 365552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 365652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_name.assign(element_name); 365752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // assert(field_type_info.first % 8 == 0); 365852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_byte_size = field_type_info.first / 8; 365952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_byte_offset = idx * child_byte_size; 366052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // return array->getElementType().getAsOpaquePtr(); 366152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // } 366252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 366352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 366452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 366552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // case clang::Type::MemberPointerType: 366652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // { 366752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 366852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // QualType pointee_type = mem_ptr_type->getPointeeType(); 366952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 367052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 367152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // { 367252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // return GetIndexOfChildWithName (ast, 367352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // mem_ptr_type->getPointeeType().getAsOpaquePtr(), 367452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // name); 367552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // } 367652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // } 367752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // break; 367852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 367952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 368052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 368152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 368252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 368352f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType pointee_type(reference_type->getPointeeType()); 368452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_clang_type (m_ast, pointee_type); 368552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 368652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_clang_type.IsAggregateType ()) 368752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 368852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_clang_type.GetIndexOfChildMemberWithName (name, 368952f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 369052f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes); 369152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 369252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 369352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 369452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 369552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: 369652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 369752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_clang_type (GetPointeeType()); 369852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 369952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_clang_type.IsAggregateType ()) 370052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 370152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_clang_type.GetIndexOfChildMemberWithName (name, 370252f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 370352f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes); 370452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 370552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 370652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 370752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 370852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 370952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name, 371052f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 371152f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes); 371252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 371352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 371452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name, 371552f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 371652f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes); 371752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 371852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 371952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name, 372052f792329be5db8e38961350589e97e8f2823acdGreg Clayton omit_empty_base_classes, 372152f792329be5db8e38961350589e97e8f2823acdGreg Clayton child_indexes); 372252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 372352f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 372452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 372552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 372652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 372752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 372852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 372952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 373052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 373152f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Get the index of the child of "clang_type" whose name matches. This function 373252f792329be5db8e38961350589e97e8f2823acdGreg Clayton// doesn't descend into the children, but only looks one level deep and name 373352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// matches can include base class names. 373452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 373552f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t 373652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetIndexOfChildWithName (const char *name, bool omit_empty_base_classes) const 373752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 373852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid() && name && name[0]) 373952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 374052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 374152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 374252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 374352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 374452f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 374552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 374652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 374752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType ()) 374852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 374952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 375052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl = record_type->getDecl(); 375152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 375252f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert(record_decl); 375352f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t child_idx = 0; 375452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 375552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 375652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 375752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 375852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 375952f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 376052f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 376152f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_class != base_class_end; 376252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++base_class) 376352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 376452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Skip empty base classes 376552f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 376652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false) 376752f792329be5db8e38961350589e97e8f2823acdGreg Clayton continue; 376852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 376952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType base_class_clang_type (m_ast, base_class->getType()); 377052f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string base_class_type_name (base_class_clang_type.GetTypeName()); 377152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (base_class_type_name.compare (name) == 0) 377252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return child_idx; 377352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++child_idx; 377452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 377552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 377652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 377752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Try and find a field that matches NAME 377852f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field, field_end; 377952f792329be5db8e38961350589e97e8f2823acdGreg Clayton StringRef name_sref(name); 378052f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 378152f792329be5db8e38961350589e97e8f2823acdGreg Clayton field != field_end; 378252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++field, ++child_idx) 378352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 378452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (field->getName().equals (name_sref)) 378552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return child_idx; 378652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 378752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 378852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 378952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 379052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 379152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 379252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 379352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType()) 379452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 379552f792329be5db8e38961350589e97e8f2823acdGreg Clayton StringRef name_sref(name); 379652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 379752f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert (objc_class_type); 379852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 379952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 380052f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t child_idx = 0; 380152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 380252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 380352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 380452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 380552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 380652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 380752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 380852f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 380952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 381052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCIvarDecl* ivar_decl = *ivar_pos; 381152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 381252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ivar_decl->getName().equals (name_sref)) 381352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 381452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if ((!omit_empty_base_classes && superclass_interface_decl) || 381552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 381652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++child_idx; 381752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 381852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return child_idx; 381952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 382052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 382152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 382252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (superclass_interface_decl) 382352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 382452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (superclass_interface_decl->getName().equals (name_sref)) 382552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 382652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 382752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 382852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 382952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 383052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 383152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 383252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: 383352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 383452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_clang_type (m_ast, cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType()); 383552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes); 383652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 383752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 383852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 383952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: 384052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 384152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 384252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // const uint64_t element_count = array->getSize().getLimitedValue(); 384352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 384452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // if (idx < element_count) 384552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // { 384652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 384752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 384852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // char element_name[32]; 384952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 385052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 385152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_name.assign(element_name); 385252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // assert(field_type_info.first % 8 == 0); 385352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_byte_size = field_type_info.first / 8; 385452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_byte_offset = idx * child_byte_size; 385552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // return array->getElementType().getAsOpaquePtr(); 385652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // } 385752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 385852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 385952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 386052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // case clang::Type::MemberPointerType: 386152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // { 386252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 386352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // QualType pointee_type = mem_ptr_type->getPointeeType(); 386452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 386552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 386652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // { 386752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // return GetIndexOfChildWithName (ast, 386852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // mem_ptr_type->getPointeeType().getAsOpaquePtr(), 386952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // name); 387052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // } 387152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // } 387252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // break; 387352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 387452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: 387552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: 387652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 387752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 387852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_type (m_ast, reference_type->getPointeeType()); 387952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 388052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type.IsAggregateType ()) 388152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 388252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes); 388352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 388452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 388552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 388652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 388752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: 388852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 388952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 389052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_type (m_ast, pointer_type->getPointeeType()); 389152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 389252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type.IsAggregateType ()) 389352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 389452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes); 389552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 389652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 389752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 389852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // if (parent_name) 389952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // { 390052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_name.assign(1, '*'); 390152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_name += parent_name; 390252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // } 390352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // 390452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // // We have a pointer to an simple type 390552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // if (idx == 0) 390652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // { 390752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 390852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // assert(clang_type_info.first % 8 == 0); 390952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_byte_size = clang_type_info.first / 8; 391052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // child_byte_offset = 0; 391152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // return pointee_type.getAsOpaquePtr(); 391252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // } 391352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 391452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 391552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 391652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 391752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 391852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes); 391952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 392052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 392152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes); 392252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 392352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 392452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes); 392552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 392652f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 392752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 392852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 392952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 393052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return UINT32_MAX; 393152f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 393252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 393352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 393452f792329be5db8e38961350589e97e8f2823acdGreg Claytonsize_t 393552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetNumTemplateArguments () const 393652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 393752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 393852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 393952f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 394052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 394152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 394252f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 394352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 394452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 394552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType ()) 394652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 394752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 394852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 394952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 395052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl); 395152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (template_decl) 395252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return template_decl->getTemplateArgs().size(); 395352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 395452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 395552f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 395652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 395752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 395852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumTemplateArguments(); 395952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 396052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 396152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumTemplateArguments(); 396252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 396352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 396452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetNumTemplateArguments(); 396552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 396652f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 396752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 396852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 396952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 397052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 397152f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 397252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 397352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 397452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetTemplateArgument (size_t arg_idx, lldb::TemplateArgumentKind &kind) const 397552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 397652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 397752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 397852f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 397952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 398052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 398152f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 398252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 398352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 398452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType ()) 398552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 398652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 398752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 398852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 398952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl); 399052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (template_decl && arg_idx < template_decl->getTemplateArgs().size()) 399152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 399252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx]; 399352f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (template_arg.getKind()) 399452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 399552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::TemplateArgument::Null: 399652f792329be5db8e38961350589e97e8f2823acdGreg Clayton kind = eTemplateArgumentKindNull; 399752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 399852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 399952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::TemplateArgument::Type: 400052f792329be5db8e38961350589e97e8f2823acdGreg Clayton kind = eTemplateArgumentKindType; 400152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, template_arg.getAsType()); 400252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 400352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::TemplateArgument::Declaration: 400452f792329be5db8e38961350589e97e8f2823acdGreg Clayton kind = eTemplateArgumentKindDeclaration; 400552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 400652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 400752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::TemplateArgument::Integral: 400852f792329be5db8e38961350589e97e8f2823acdGreg Clayton kind = eTemplateArgumentKindIntegral; 400952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(m_ast, template_arg.getIntegralType()); 401052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 401152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::TemplateArgument::Template: 401252f792329be5db8e38961350589e97e8f2823acdGreg Clayton kind = eTemplateArgumentKindTemplate; 401352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 401452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 401552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::TemplateArgument::TemplateExpansion: 401652f792329be5db8e38961350589e97e8f2823acdGreg Clayton kind = eTemplateArgumentKindTemplateExpansion; 401752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 401852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 401952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::TemplateArgument::Expression: 402052f792329be5db8e38961350589e97e8f2823acdGreg Clayton kind = eTemplateArgumentKindExpression; 402152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 402252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 402352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::TemplateArgument::Pack: 402452f792329be5db8e38961350589e97e8f2823acdGreg Clayton kind = eTemplateArgumentKindPack; 402552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 402652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 402752f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 402852f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert (!"Unhandled TemplateArgument::ArgKind"); 402952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 403052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 403152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 403252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 403352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 403452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 403552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 403652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 403752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetTemplateArgument (arg_idx, kind); 403852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 403952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 404052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetTemplateArgument (arg_idx, kind); 404152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 404252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 404352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetTemplateArgument (arg_idx, kind); 404452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 404552f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 404652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 404752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 404852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 404952f792329be5db8e38961350589e97e8f2823acdGreg Clayton kind = eTemplateArgumentKindNull; 405052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (); 405152f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 405252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 405352f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic bool 405452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind) 405552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 405652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (name == NULL || name[0] == '\0') 405752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 405852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 405952f792329be5db8e38961350589e97e8f2823acdGreg Clayton#define OPERATOR_PREFIX "operator" 406052f792329be5db8e38961350589e97e8f2823acdGreg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1) 406152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 406252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const char *post_op_name = NULL; 406352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 406452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool no_space = true; 406552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 406652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH)) 406752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 406852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 406952f792329be5db8e38961350589e97e8f2823acdGreg Clayton post_op_name = name + OPERATOR_PREFIX_LENGTH; 407052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 407152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[0] == ' ') 407252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 407352f792329be5db8e38961350589e97e8f2823acdGreg Clayton post_op_name++; 407452f792329be5db8e38961350589e97e8f2823acdGreg Clayton no_space = false; 407552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 407652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 407752f792329be5db8e38961350589e97e8f2823acdGreg Clayton#undef OPERATOR_PREFIX 407852f792329be5db8e38961350589e97e8f2823acdGreg Clayton#undef OPERATOR_PREFIX_LENGTH 407952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 408052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // This is an operator, set the overloaded operator kind to invalid 408152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // in case this is a conversion operator... 408252f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = NUM_OVERLOADED_OPERATORS; 408352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 408452f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (post_op_name[0]) 408552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 408652f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 408752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (no_space) 408852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 408952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 409052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case 'n': 409152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (no_space) 409252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 409352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (strcmp (post_op_name, "new") == 0) 409452f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_New; 409552f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (strcmp (post_op_name, "new[]") == 0) 409652f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Array_New; 409752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 409852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 409952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case 'd': 410052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (no_space) 410152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 410252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (strcmp (post_op_name, "delete") == 0) 410352f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Delete; 410452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (strcmp (post_op_name, "delete[]") == 0) 410552f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Array_Delete; 410652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 410752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 410852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '+': 410952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 411052f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Plus; 411152f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[2] == '\0') 411252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 411352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '=') 411452f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_PlusEqual; 411552f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[1] == '+') 411652f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_PlusPlus; 411752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 411852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 411952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 412052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '-': 412152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 412252f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Minus; 412352f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[2] == '\0') 412452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 412552f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (post_op_name[1]) 412652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 412752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '=': op_kind = OO_MinusEqual; break; 412852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '-': op_kind = OO_MinusMinus; break; 412952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '>': op_kind = OO_Arrow; break; 413052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 413152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 413252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[3] == '\0') 413352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 413452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[2] == '*') 413552f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_ArrowStar; break; 413652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 413752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 413852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 413952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '*': 414052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 414152f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Star; 414252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 414352f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_StarEqual; 414452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 414552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 414652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '/': 414752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 414852f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Slash; 414952f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 415052f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_SlashEqual; 415152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 415252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 415352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '%': 415452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 415552f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Percent; 415652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 415752f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_PercentEqual; 415852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 415952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 416052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 416152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '^': 416252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 416352f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Caret; 416452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 416552f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_CaretEqual; 416652f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 416752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 416852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '&': 416952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 417052f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Amp; 417152f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[2] == '\0') 417252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 417352f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (post_op_name[1]) 417452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 417552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '=': op_kind = OO_AmpEqual; break; 417652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '&': op_kind = OO_AmpAmp; break; 417752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 417852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 417952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 418052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 418152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '|': 418252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 418352f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Pipe; 418452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[2] == '\0') 418552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 418652f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (post_op_name[1]) 418752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 418852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '=': op_kind = OO_PipeEqual; break; 418952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '|': op_kind = OO_PipePipe; break; 419052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 419152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 419252f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 419352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 419452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '~': 419552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 419652f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Tilde; 419752f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 419852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 419952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '!': 420052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 420152f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Exclaim; 420252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 420352f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_ExclaimEqual; 420452f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 420552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 420652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '=': 420752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 420852f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Equal; 420952f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 421052f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_EqualEqual; 421152f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 421252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 421352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '<': 421452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 421552f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Less; 421652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[2] == '\0') 421752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 421852f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (post_op_name[1]) 421952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 422052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '<': op_kind = OO_LessLess; break; 422152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '=': op_kind = OO_LessEqual; break; 422252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 422352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 422452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[3] == '\0') 422552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 422652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[2] == '=') 422752f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_LessLessEqual; 422852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 422952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 423052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 423152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '>': 423252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 423352f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Greater; 423452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[2] == '\0') 423552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 423652f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (post_op_name[1]) 423752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 423852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '>': op_kind = OO_GreaterGreater; break; 423952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '=': op_kind = OO_GreaterEqual; break; 424052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 424152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 424252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (post_op_name[1] == '>' && 424352f792329be5db8e38961350589e97e8f2823acdGreg Clayton post_op_name[2] == '=' && 424452f792329be5db8e38961350589e97e8f2823acdGreg Clayton post_op_name[3] == '\0') 424552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 424652f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_GreaterGreaterEqual; 424752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 424852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 424952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 425052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case ',': 425152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == '\0') 425252f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Comma; 425352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 425452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 425552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '(': 425652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == ')' && post_op_name[2] == '\0') 425752f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Call; 425852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 425952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 426052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case '[': 426152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (post_op_name[1] == ']' && post_op_name[2] == '\0') 426252f792329be5db8e38961350589e97e8f2823acdGreg Clayton op_kind = OO_Subscript; 426352f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 426452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 426552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 426652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 426752f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 426852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 426952f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic inline bool 427052f792329be5db8e38961350589e97e8f2823acdGreg Claytoncheck_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params) 427152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 427252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Special-case call since it can take any number of operands 427352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if(op_kind == OO_Call) 427452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 427552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 427652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // The parameter count doens't include "this" 427752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (num_params == 0) 427852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return unary; 427952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (num_params == 1) 428052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return binary; 428152f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 428252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 428352f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 428452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 428552f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::RecordDecl * 428652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetAsRecordDecl () const 428752f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 428852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = dyn_cast<RecordType>(GetCanonicalQualType()); 428952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (record_type) 429052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return record_type->getDecl(); 429152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 429252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 429352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 429452f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::CXXRecordDecl * 429552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetAsCXXRecordDecl () const 429652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 429752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return GetCanonicalQualType()->getAsCXXRecordDecl(); 429852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 429952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 430052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonObjCInterfaceDecl * 430152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetAsObjCInterfaceDecl () const 430252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 430352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(GetCanonicalQualType()); 430452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 430552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return objc_class_type->getInterface(); 430652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 430752f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 430852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 430952f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::FieldDecl * 431052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddFieldToRecordType (const char *name, 431152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &field_clang_type, 431252f792329be5db8e38961350589e97e8f2823acdGreg Clayton AccessType access, 431352f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t bitfield_bit_size) 431452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 431552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid() || !field_clang_type.IsValid()) 431652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 431752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 431852f792329be5db8e38961350589e97e8f2823acdGreg Clayton FieldDecl *field = NULL; 431952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 432052f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::Expr *bit_width = NULL; 432152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bitfield_bit_size != 0) 432252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 432352f792329be5db8e38961350589e97e8f2823acdGreg Clayton APInt bitfield_bit_size_apint(m_ast->getTypeSize(m_ast->IntTy), bitfield_bit_size); 432452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_width = new (*m_ast)IntegerLiteral (*m_ast, bitfield_bit_size_apint, m_ast->IntTy, SourceLocation()); 432552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 432652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 432752f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl *record_decl = GetAsRecordDecl (); 432852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (record_decl) 432952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 433052f792329be5db8e38961350589e97e8f2823acdGreg Clayton field = FieldDecl::Create (*m_ast, 433152f792329be5db8e38961350589e97e8f2823acdGreg Clayton record_decl, 433252f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 433352f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 433452f792329be5db8e38961350589e97e8f2823acdGreg Clayton name ? &m_ast->Idents.get(name) : NULL, // Identifier 433552f792329be5db8e38961350589e97e8f2823acdGreg Clayton field_clang_type.GetQualType(), // Field type 433652f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // TInfo * 433752f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_width, // BitWidth 433852f792329be5db8e38961350589e97e8f2823acdGreg Clayton false, // Mutable 433952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ICIS_NoInit); // HasInit 434052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 434152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!name) 434252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 434352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Determine whether this field corresponds to an anonymous 434452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // struct or union. 434552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (const TagType *TagT = field->getType()->getAs<TagType>()) { 434652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (RecordDecl *Rec = dyn_cast<RecordDecl>(TagT->getDecl())) 434752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!Rec->getDeclName()) { 434852f792329be5db8e38961350589e97e8f2823acdGreg Clayton Rec->setAnonymousStructOrUnion(true); 434952f792329be5db8e38961350589e97e8f2823acdGreg Clayton field->setImplicit(); 435052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 435152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 435252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 435352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 435452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 435552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (field) 435652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 435752f792329be5db8e38961350589e97e8f2823acdGreg Clayton field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access)); 435852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 435952f792329be5db8e38961350589e97e8f2823acdGreg Clayton record_decl->addDecl(field); 436052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 436152f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG 436252f792329be5db8e38961350589e97e8f2823acdGreg Clayton VerifyDecl(field); 436352f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif 436452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 436552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 436652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 436752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 436852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (); 436952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 437052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 437152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 437252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool is_synthesized = false; 437352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 437452f792329be5db8e38961350589e97e8f2823acdGreg Clayton field_clang_type.GetCompleteType(); 437552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 437652f792329be5db8e38961350589e97e8f2823acdGreg Clayton field = ObjCIvarDecl::Create (*m_ast, 437752f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl, 437852f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 437952f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 438052f792329be5db8e38961350589e97e8f2823acdGreg Clayton name ? &m_ast->Idents.get(name) : NULL, // Identifier 438152f792329be5db8e38961350589e97e8f2823acdGreg Clayton field_clang_type.GetQualType(), // Field type 438252f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // TypeSourceInfo * 438352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ConvertAccessTypeToObjCIvarAccessControl (access), 438452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_width, 438552f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_synthesized); 438652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 438752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (field) 438852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 438952f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl->addDecl(field); 439052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 439152f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG 439252f792329be5db8e38961350589e97e8f2823acdGreg Clayton VerifyDecl(field); 439352f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif 439452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 439552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 439652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 439752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return field; 439852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 439952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 440052f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid 440152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::BuildIndirectFields () 440252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 440352f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl *record_decl = GetAsRecordDecl(); 440452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 440552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!record_decl) 440652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return; 440752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 440852f792329be5db8e38961350589e97e8f2823acdGreg Clayton typedef llvm::SmallVector <IndirectFieldDecl *, 1> IndirectFieldVector; 440952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 441052f792329be5db8e38961350589e97e8f2823acdGreg Clayton IndirectFieldVector indirect_fields; 441152f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field_pos; 441252f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field_end_pos = record_decl->field_end(); 441352f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator last_field_pos = field_end_pos; 441452f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++) 441552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 441652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (field_pos->isAnonymousStructOrUnion()) 441752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 441852f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType field_qual_type = field_pos->getType(); 441952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 442052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *field_record_type = field_qual_type->getAs<RecordType>(); 442152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 442252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!field_record_type) 442352f792329be5db8e38961350589e97e8f2823acdGreg Clayton continue; 442452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 442552f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl *field_record_decl = field_record_type->getDecl(); 442652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 442752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!field_record_decl) 442852f792329be5db8e38961350589e97e8f2823acdGreg Clayton continue; 442952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 443052f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end(); 443152f792329be5db8e38961350589e97e8f2823acdGreg Clayton di != de; 443252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++di) 443352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 443452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (FieldDecl *nested_field_decl = dyn_cast<FieldDecl>(*di)) 443552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 443652f792329be5db8e38961350589e97e8f2823acdGreg Clayton NamedDecl **chain = new (*m_ast) NamedDecl*[2]; 443752f792329be5db8e38961350589e97e8f2823acdGreg Clayton chain[0] = *field_pos; 443852f792329be5db8e38961350589e97e8f2823acdGreg Clayton chain[1] = nested_field_decl; 443952f792329be5db8e38961350589e97e8f2823acdGreg Clayton IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*m_ast, 444052f792329be5db8e38961350589e97e8f2823acdGreg Clayton record_decl, 444152f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 444252f792329be5db8e38961350589e97e8f2823acdGreg Clayton nested_field_decl->getIdentifier(), 444352f792329be5db8e38961350589e97e8f2823acdGreg Clayton nested_field_decl->getType(), 444452f792329be5db8e38961350589e97e8f2823acdGreg Clayton chain, 444552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 2); 444652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 444752f792329be5db8e38961350589e97e8f2823acdGreg Clayton indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(), 444852f792329be5db8e38961350589e97e8f2823acdGreg Clayton nested_field_decl->getAccess())); 444952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 445052f792329be5db8e38961350589e97e8f2823acdGreg Clayton indirect_fields.push_back(indirect_field); 445152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 445252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (IndirectFieldDecl *nested_indirect_field_decl = dyn_cast<IndirectFieldDecl>(*di)) 445352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 445452f792329be5db8e38961350589e97e8f2823acdGreg Clayton int nested_chain_size = nested_indirect_field_decl->getChainingSize(); 445552f792329be5db8e38961350589e97e8f2823acdGreg Clayton NamedDecl **chain = new (*m_ast) NamedDecl*[nested_chain_size + 1]; 445652f792329be5db8e38961350589e97e8f2823acdGreg Clayton chain[0] = *field_pos; 445752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 445852f792329be5db8e38961350589e97e8f2823acdGreg Clayton int chain_index = 1; 445952f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(), 446052f792329be5db8e38961350589e97e8f2823acdGreg Clayton nce = nested_indirect_field_decl->chain_end(); 446152f792329be5db8e38961350589e97e8f2823acdGreg Clayton nci < nce; 446252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++nci) 446352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 446452f792329be5db8e38961350589e97e8f2823acdGreg Clayton chain[chain_index] = *nci; 446552f792329be5db8e38961350589e97e8f2823acdGreg Clayton chain_index++; 446652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 446752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 446852f792329be5db8e38961350589e97e8f2823acdGreg Clayton IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*m_ast, 446952f792329be5db8e38961350589e97e8f2823acdGreg Clayton record_decl, 447052f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 447152f792329be5db8e38961350589e97e8f2823acdGreg Clayton nested_indirect_field_decl->getIdentifier(), 447252f792329be5db8e38961350589e97e8f2823acdGreg Clayton nested_indirect_field_decl->getType(), 447352f792329be5db8e38961350589e97e8f2823acdGreg Clayton chain, 447452f792329be5db8e38961350589e97e8f2823acdGreg Clayton nested_chain_size + 1); 447552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 447652f792329be5db8e38961350589e97e8f2823acdGreg Clayton indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(), 447752f792329be5db8e38961350589e97e8f2823acdGreg Clayton nested_indirect_field_decl->getAccess())); 447852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 447952f792329be5db8e38961350589e97e8f2823acdGreg Clayton indirect_fields.push_back(indirect_field); 448052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 448152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 448252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 448352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 448452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 448552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Check the last field to see if it has an incomplete array type as its 448652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // last member and if it does, the tell the record decl about it 448752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (last_field_pos != field_end_pos) 448852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 448952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (last_field_pos->getType()->isIncompleteArrayType()) 449052f792329be5db8e38961350589e97e8f2823acdGreg Clayton record_decl->hasFlexibleArrayMember(); 449152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 449252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 449352f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end(); 449452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ifi < ife; 449552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++ifi) 449652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 449752f792329be5db8e38961350589e97e8f2823acdGreg Clayton record_decl->addDecl(*ifi); 449852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 449952f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 450052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 450152f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::VarDecl * 450252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddVariableToRecordType (const char *name, 450352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &var_type, 450452f792329be5db8e38961350589e97e8f2823acdGreg Clayton AccessType access) 450552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 450652f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::VarDecl *var_decl = NULL; 450752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 450852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid() || !var_type.IsValid()) 450952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 451052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 451152f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl *record_decl = GetAsRecordDecl (); 451252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (record_decl) 451352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 451452f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_decl = VarDecl::Create (*m_ast, // ASTContext & 451552f792329be5db8e38961350589e97e8f2823acdGreg Clayton record_decl, // DeclContext * 451652f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), // SourceLocation StartLoc 451752f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), // SourceLocation IdLoc 451852f792329be5db8e38961350589e97e8f2823acdGreg Clayton name ? &m_ast->Idents.get(name) : NULL, // IdentifierInfo * 451952f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_type.GetQualType(), // Variable QualType 452052f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // TypeSourceInfo * 452152f792329be5db8e38961350589e97e8f2823acdGreg Clayton SC_Static); // StorageClass 452252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (var_decl) 452352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 452452f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access)); 452552f792329be5db8e38961350589e97e8f2823acdGreg Clayton record_decl->addDecl(var_decl); 452652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 452752f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG 452852f792329be5db8e38961350589e97e8f2823acdGreg Clayton VerifyDecl(var_decl); 452952f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif 453052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 453152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 453252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return var_decl; 453352f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 453452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 453552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 453652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonCXXMethodDecl * 453752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddMethodToCXXRecordType (const char *name, 453852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &method_clang_type, 453952f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::AccessType access, 454052f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_virtual, 454152f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_static, 454252f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_inline, 454352f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_explicit, 454452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_attr_used, 454552f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_artificial) 454652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 454752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid() || !method_clang_type.IsValid() || name == NULL || name[0] == '\0') 454852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 454952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 455052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType record_qual_type(GetCanonicalQualType()); 455152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 455252f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl(); 455352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 455452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl == NULL) 455552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 455652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 455752f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType method_qual_type (method_clang_type.GetQualType()); 455852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 455952f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXMethodDecl *cxx_method_decl = NULL; 456052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 456152f792329be5db8e38961350589e97e8f2823acdGreg Clayton DeclarationName decl_name (&m_ast->Idents.get(name)); 456252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 456352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::FunctionType *function_type = dyn_cast<FunctionType>(method_qual_type.getTypePtr()); 456452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 456552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (function_type == NULL) 456652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 456752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 456852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_type)); 456952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 457052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!method_function_prototype) 457152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 457252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 457352f792329be5db8e38961350589e97e8f2823acdGreg Clayton unsigned int num_params = method_function_prototype->getNumArgs(); 457452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 457552f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXDestructorDecl *cxx_dtor_decl(NULL); 457652f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXConstructorDecl *cxx_ctor_decl(NULL); 457752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 457852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_artificial) 457952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; // skip everything artificial 458052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 458152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (name[0] == '~') 458252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 458352f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_dtor_decl = CXXDestructorDecl::Create (*m_ast, 458452f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl, 458552f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 458652f792329be5db8e38961350589e97e8f2823acdGreg Clayton DeclarationNameInfo (m_ast->DeclarationNames.getCXXDestructorName (m_ast->getCanonicalType (record_qual_type)), SourceLocation()), 458752f792329be5db8e38961350589e97e8f2823acdGreg Clayton method_qual_type, 458852f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, 458952f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_inline, 459052f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_artificial); 459152f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl = cxx_dtor_decl; 459252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 459352f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (decl_name == cxx_record_decl->getDeclName()) 459452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 459552f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_ctor_decl = CXXConstructorDecl::Create (*m_ast, 459652f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl, 459752f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 459852f792329be5db8e38961350589e97e8f2823acdGreg Clayton DeclarationNameInfo (m_ast->DeclarationNames.getCXXConstructorName (m_ast->getCanonicalType (record_qual_type)), SourceLocation()), 459952f792329be5db8e38961350589e97e8f2823acdGreg Clayton method_qual_type, 460052f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // TypeSourceInfo * 460152f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_explicit, 460252f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_inline, 460352f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_artificial, 460452f792329be5db8e38961350589e97e8f2823acdGreg Clayton false /*is_constexpr*/); 460552f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl = cxx_ctor_decl; 460652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 460752f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 460852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 460952f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::StorageClass SC = is_static ? SC_Static : SC_None; 461052f792329be5db8e38961350589e97e8f2823acdGreg Clayton OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS; 461152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 461252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsOperator (name, op_kind)) 461352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 461452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (op_kind != NUM_OVERLOADED_OPERATORS) 461552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 461652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Check the number of operator parameters. Sometimes we have 461752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // seen bad DWARF that doesn't correctly describe operators and 461852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // if we try to create a methed and add it to the class, clang 461952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // will assert and crash, so we need to make sure things are 462052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // acceptable. 462152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params)) 462252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 462352f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl = CXXMethodDecl::Create (*m_ast, 462452f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl, 462552f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 462652f792329be5db8e38961350589e97e8f2823acdGreg Clayton DeclarationNameInfo (m_ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()), 462752f792329be5db8e38961350589e97e8f2823acdGreg Clayton method_qual_type, 462852f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // TypeSourceInfo * 462952f792329be5db8e38961350589e97e8f2823acdGreg Clayton SC, 463052f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_inline, 463152f792329be5db8e38961350589e97e8f2823acdGreg Clayton false /*is_constexpr*/, 463252f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation()); 463352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 463452f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (num_params == 0) 463552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 463652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Conversion operators don't take params... 463752f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl = CXXConversionDecl::Create (*m_ast, 463852f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl, 463952f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 464052f792329be5db8e38961350589e97e8f2823acdGreg Clayton DeclarationNameInfo (m_ast->DeclarationNames.getCXXConversionFunctionName (m_ast->getCanonicalType (function_type->getResultType())), SourceLocation()), 464152f792329be5db8e38961350589e97e8f2823acdGreg Clayton method_qual_type, 464252f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // TypeSourceInfo * 464352f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_inline, 464452f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_explicit, 464552f792329be5db8e38961350589e97e8f2823acdGreg Clayton false /*is_constexpr*/, 464652f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation()); 464752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 464852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 464952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 465052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_method_decl == NULL) 465152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 465252f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl = CXXMethodDecl::Create (*m_ast, 465352f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl, 465452f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 465552f792329be5db8e38961350589e97e8f2823acdGreg Clayton DeclarationNameInfo (decl_name, SourceLocation()), 465652f792329be5db8e38961350589e97e8f2823acdGreg Clayton method_qual_type, 465752f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // TypeSourceInfo * 465852f792329be5db8e38961350589e97e8f2823acdGreg Clayton SC, 465952f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_inline, 466052f792329be5db8e38961350589e97e8f2823acdGreg Clayton false /*is_constexpr*/, 466152f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation()); 466252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 466352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 466452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 466552f792329be5db8e38961350589e97e8f2823acdGreg Clayton AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access); 466652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 466752f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl->setAccess (access_specifier); 466852f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl->setVirtualAsWritten (is_virtual); 466952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 467052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_attr_used) 467152f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl->addAttr(::new (*m_ast) UsedAttr(SourceRange(), *m_ast)); 467252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 467352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Populate the method decl with parameter decls 467452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 467552f792329be5db8e38961350589e97e8f2823acdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 467652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 467752f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (unsigned param_index = 0; 467852f792329be5db8e38961350589e97e8f2823acdGreg Clayton param_index < num_params; 467952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++param_index) 468052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 468152f792329be5db8e38961350589e97e8f2823acdGreg Clayton params.push_back (ParmVarDecl::Create (*m_ast, 468252f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl, 468352f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 468452f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 468552f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // anonymous 468652f792329be5db8e38961350589e97e8f2823acdGreg Clayton method_function_prototype->getArgType(param_index), 468752f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, 468852f792329be5db8e38961350589e97e8f2823acdGreg Clayton SC_None, 468952f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL)); 469052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 469152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 469252f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl->setParams (ArrayRef<ParmVarDecl*>(params)); 469352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 469452f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl->addDecl (cxx_method_decl); 469552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 469652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Sometimes the debug info will mention a constructor (default/copy/move), 469752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // destructor, or assignment operator (copy/move) but there won't be any 469852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // version of this in the code. So we check if the function was artificially 469952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // generated and if it is trivial and this lets the compiler/backend know 470052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // that it can inline the IR for these when it needs to and we can avoid a 470152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // "missing function" error when running expressions. 470252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 470352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (is_artificial) 470452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 470552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_ctor_decl && 470652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) || 470752f792329be5db8e38961350589e97e8f2823acdGreg Clayton (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) || 470852f792329be5db8e38961350589e97e8f2823acdGreg Clayton (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) )) 470952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 471052f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_ctor_decl->setDefaulted(); 471152f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_ctor_decl->setTrivial(true); 471252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 471352f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (cxx_dtor_decl) 471452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 471552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl->hasTrivialDestructor()) 471652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 471752f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_dtor_decl->setDefaulted(); 471852f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_dtor_decl->setTrivial(true); 471952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 472052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 472152f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) || 472252f792329be5db8e38961350589e97e8f2823acdGreg Clayton (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment())) 472352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 472452f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl->setDefaulted(); 472552f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_method_decl->setTrivial(true); 472652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 472752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 472852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 472952f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG 473052f792329be5db8e38961350589e97e8f2823acdGreg Clayton VerifyDecl(cxx_method_decl); 473152f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif 473252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 473352f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic()); 473452f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate()); 473552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD()); 473652f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty()); 473752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract()); 473852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor()); 473952f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor()); 474052f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment()); 474152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor()); 474252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return cxx_method_decl; 474352f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 474452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 474552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 474652f792329be5db8e38961350589e97e8f2823acdGreg Clayton#pragma mark C++ Base Classes 474752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 474852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonCXXBaseSpecifier * 474952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::CreateBaseClassSpecifier (AccessType access, bool is_virtual, bool base_of_class) 475052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 475152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 475252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return new CXXBaseSpecifier (SourceRange(), 475352f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_virtual, 475452f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_of_class, 475552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTContext::ConvertAccessTypeToAccessSpecifier (access), 475652f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_ast->getTrivialTypeSourceInfo (GetQualType()), 475752f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation()); 475852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 475952f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 476052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 476152f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid 476252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 476352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 476452f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (unsigned i=0; i<num_base_classes; ++i) 476552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 476652f792329be5db8e38961350589e97e8f2823acdGreg Clayton delete base_classes[i]; 476752f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_classes[i] = NULL; 476852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 476952f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 477052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 477152f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 477252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetBaseClassesForClassType (CXXBaseSpecifier const * const *base_classes, 477352f792329be5db8e38961350589e97e8f2823acdGreg Clayton unsigned num_base_classes) 477452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 477552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 477652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 477752f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(); 477852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 477952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 478052f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl->setBases(base_classes, num_base_classes); 478152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 478252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 478352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 478452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 478552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 478652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 478752f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 478852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetObjCSuperClass (const ClangASTType &superclass_clang_type) 478952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 479052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid() && superclass_clang_type.IsValid()) 479152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 479252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (); 479352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *super_interface_decl = superclass_clang_type.GetAsObjCInterfaceDecl (); 479452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl && super_interface_decl) 479552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 479652f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl->setSuperClass(super_interface_decl); 479752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 479852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 479952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 480052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 480152f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 480252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 480352f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 480452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddObjCClassProperty (const char *property_name, 480552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &property_clang_type, 480652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCIvarDecl *ivar_decl, 480752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const char *property_setter_name, 480852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const char *property_getter_name, 480952f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t property_attributes, 481052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTMetadata *metadata) 481152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 481252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid() || !property_clang_type.IsValid() || property_name == NULL || property_name[0] == '\0') 481352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 481452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 481552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (); 481652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 481752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 481852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 481952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType property_clang_type_to_access; 482052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 482152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (property_clang_type.IsValid()) 482252f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_clang_type_to_access = property_clang_type; 482352f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (ivar_decl) 482452f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_clang_type_to_access = ClangASTType (m_ast, ivar_decl->getType()); 482552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 482652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl && property_clang_type_to_access.IsValid()) 482752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 482852f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::TypeSourceInfo *prop_type_source; 482952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ivar_decl) 483052f792329be5db8e38961350589e97e8f2823acdGreg Clayton prop_type_source = m_ast->getTrivialTypeSourceInfo (ivar_decl->getType()); 4831d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton else 483252f792329be5db8e38961350589e97e8f2823acdGreg Clayton prop_type_source = m_ast->getTrivialTypeSourceInfo (property_clang_type.GetQualType()); 483352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 483452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCPropertyDecl *property_decl = ObjCPropertyDecl::Create (*m_ast, 483552f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl, 483652f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), // Source Location 483752f792329be5db8e38961350589e97e8f2823acdGreg Clayton &m_ast->Idents.get(property_name), 483852f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), //Source Location for AT 483952f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), //Source location for ( 484052f792329be5db8e38961350589e97e8f2823acdGreg Clayton prop_type_source); 484152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 484252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (property_decl) 4843d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton { 484452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (metadata) 484552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTContext::SetMetadata(m_ast, property_decl, *metadata); 484652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 484752f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl->addDecl (property_decl); 484852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 484952f792329be5db8e38961350589e97e8f2823acdGreg Clayton Selector setter_sel, getter_sel; 485052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 485152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (property_setter_name != NULL) 485252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 485352f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1); 485452f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::IdentifierInfo *setter_ident = &m_ast->Idents.get(property_setter_no_colon.c_str()); 485552f792329be5db8e38961350589e97e8f2823acdGreg Clayton setter_sel = m_ast->Selectors.getSelector(1, &setter_ident); 485652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 485752f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (!(property_attributes & DW_APPLE_PROPERTY_readonly)) 485852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 485952f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string setter_sel_string("set"); 486052f792329be5db8e38961350589e97e8f2823acdGreg Clayton setter_sel_string.push_back(::toupper(property_name[0])); 486152f792329be5db8e38961350589e97e8f2823acdGreg Clayton setter_sel_string.append(&property_name[1]); 486252f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::IdentifierInfo *setter_ident = &m_ast->Idents.get(setter_sel_string.c_str()); 486352f792329be5db8e38961350589e97e8f2823acdGreg Clayton setter_sel = m_ast->Selectors.getSelector(1, &setter_ident); 486452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 486552f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setSetterName(setter_sel); 486652f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter); 486752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 486852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (property_getter_name != NULL) 486952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 487052f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::IdentifierInfo *getter_ident = &m_ast->Idents.get(property_getter_name); 487152f792329be5db8e38961350589e97e8f2823acdGreg Clayton getter_sel = m_ast->Selectors.getSelector(0, &getter_ident); 487252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 4873d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton else 487452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 487552f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::IdentifierInfo *getter_ident = &m_ast->Idents.get(property_name); 487652f792329be5db8e38961350589e97e8f2823acdGreg Clayton getter_sel = m_ast->Selectors.getSelector(0, &getter_ident); 487752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 487852f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setGetterName(getter_sel); 487952f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter); 488052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 488152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ivar_decl) 488252f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setPropertyIvarDecl (ivar_decl); 488352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 488452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (property_attributes & DW_APPLE_PROPERTY_readonly) 488552f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly); 488652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (property_attributes & DW_APPLE_PROPERTY_readwrite) 488752f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite); 488852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (property_attributes & DW_APPLE_PROPERTY_assign) 488952f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign); 489052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (property_attributes & DW_APPLE_PROPERTY_retain) 489152f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain); 489252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (property_attributes & DW_APPLE_PROPERTY_copy) 489352f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy); 489452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (property_attributes & DW_APPLE_PROPERTY_nonatomic) 489552f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic); 489652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 489752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel)) 489852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 489952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool isInstance = true; 490052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool isVariadic = false; 490152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool isSynthesized = false; 490252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool isImplicitlyDeclared = true; 490352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool isDefined = false; 490452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None; 490552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool HasRelatedResultType = false; 490652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 490752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCMethodDecl *getter = ObjCMethodDecl::Create (*m_ast, 490852f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 490952f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 491052f792329be5db8e38961350589e97e8f2823acdGreg Clayton getter_sel, 491152f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_clang_type_to_access.GetQualType(), 491252f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, 491352f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl, 491452f792329be5db8e38961350589e97e8f2823acdGreg Clayton isInstance, 491552f792329be5db8e38961350589e97e8f2823acdGreg Clayton isVariadic, 491652f792329be5db8e38961350589e97e8f2823acdGreg Clayton isSynthesized, 491752f792329be5db8e38961350589e97e8f2823acdGreg Clayton isImplicitlyDeclared, 491852f792329be5db8e38961350589e97e8f2823acdGreg Clayton isDefined, 491952f792329be5db8e38961350589e97e8f2823acdGreg Clayton impControl, 492052f792329be5db8e38961350589e97e8f2823acdGreg Clayton HasRelatedResultType); 492152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 492252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (getter && metadata) 492352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTContext::SetMetadata(m_ast, getter, *metadata); 492452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 492552f792329be5db8e38961350589e97e8f2823acdGreg Clayton getter->setMethodParams(*m_ast, ArrayRef<ParmVarDecl*>(), ArrayRef<SourceLocation>()); 492652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 492752f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl->addDecl(getter); 492852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 492952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 493052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel)) 493152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 493252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType result_type = m_ast->VoidTy; 493352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 493452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool isInstance = true; 493552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool isVariadic = false; 493652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool isSynthesized = false; 493752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool isImplicitlyDeclared = true; 493852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool isDefined = false; 493952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None; 494052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const bool HasRelatedResultType = false; 494152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 494252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCMethodDecl *setter = ObjCMethodDecl::Create (*m_ast, 494352f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 494452f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 494552f792329be5db8e38961350589e97e8f2823acdGreg Clayton setter_sel, 494652f792329be5db8e38961350589e97e8f2823acdGreg Clayton result_type, 494752f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, 494852f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl, 494952f792329be5db8e38961350589e97e8f2823acdGreg Clayton isInstance, 495052f792329be5db8e38961350589e97e8f2823acdGreg Clayton isVariadic, 495152f792329be5db8e38961350589e97e8f2823acdGreg Clayton isSynthesized, 495252f792329be5db8e38961350589e97e8f2823acdGreg Clayton isImplicitlyDeclared, 495352f792329be5db8e38961350589e97e8f2823acdGreg Clayton isDefined, 495452f792329be5db8e38961350589e97e8f2823acdGreg Clayton impControl, 495552f792329be5db8e38961350589e97e8f2823acdGreg Clayton HasRelatedResultType); 495652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 495752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (setter && metadata) 495852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTContext::SetMetadata(m_ast, setter, *metadata); 495952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 496052f792329be5db8e38961350589e97e8f2823acdGreg Clayton llvm::SmallVector<ParmVarDecl *, 1> params; 496152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 496252f792329be5db8e38961350589e97e8f2823acdGreg Clayton params.push_back (ParmVarDecl::Create (*m_ast, 496352f792329be5db8e38961350589e97e8f2823acdGreg Clayton setter, 496452f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 496552f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 496652f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // anonymous 496752f792329be5db8e38961350589e97e8f2823acdGreg Clayton property_clang_type_to_access.GetQualType(), 496852f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, 496952f792329be5db8e38961350589e97e8f2823acdGreg Clayton SC_Auto, 497052f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL)); 497152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 497252f792329be5db8e38961350589e97e8f2823acdGreg Clayton setter->setMethodParams(*m_ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>()); 497352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 497452f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl->addDecl(setter); 497552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 497652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 497752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 4978d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton } 497952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 498052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 498152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 498252f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 498352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 498452f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 498552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::IsObjCClassTypeAndHasIVars (bool check_superclass) const 498652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 498752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (); 498852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 498952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ObjCDeclHasIVars (class_interface_decl, check_superclass); 499052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 499152f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 499252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 499352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 499452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonObjCMethodDecl * 499552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddMethodToObjCObjectType (const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 499652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ClangASTType &method_clang_type, 499752f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::AccessType access, 499852f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_artificial) 499952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 500052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid() || !method_clang_type.IsValid()) 500152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 500252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 500352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(); 500452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 500552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl == NULL) 500652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 500752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 500852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const char *selector_start = ::strchr (name, ' '); 500952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (selector_start == NULL) 501052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 501152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 501252f792329be5db8e38961350589e97e8f2823acdGreg Clayton selector_start++; 501352f792329be5db8e38961350589e97e8f2823acdGreg Clayton llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 501452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 501552f792329be5db8e38961350589e97e8f2823acdGreg Clayton size_t len = 0; 501652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const char *start; 501752f792329be5db8e38961350589e97e8f2823acdGreg Clayton //printf ("name = '%s'\n", name); 501852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 501952f792329be5db8e38961350589e97e8f2823acdGreg Clayton unsigned num_selectors_with_args = 0; 502052f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (start = selector_start; 502152f792329be5db8e38961350589e97e8f2823acdGreg Clayton start && *start != '\0' && *start != ']'; 502252f792329be5db8e38961350589e97e8f2823acdGreg Clayton start += len) 502352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 502452f792329be5db8e38961350589e97e8f2823acdGreg Clayton len = ::strcspn(start, ":]"); 502552f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool has_arg = (start[len] == ':'); 502652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (has_arg) 502752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++num_selectors_with_args; 502852f792329be5db8e38961350589e97e8f2823acdGreg Clayton selector_idents.push_back (&m_ast->Idents.get (StringRef (start, len))); 502952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (has_arg) 503052f792329be5db8e38961350589e97e8f2823acdGreg Clayton len += 1; 503152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 503252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 503352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 503452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (selector_idents.size() == 0) 503552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 503652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 503752f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::Selector method_selector = m_ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0, 503852f792329be5db8e38961350589e97e8f2823acdGreg Clayton selector_idents.data()); 503952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 504052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType method_qual_type (method_clang_type.GetQualType()); 504152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 504252f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Populate the method decl with parameter decls 504352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type *method_type(method_qual_type.getTypePtr()); 504452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 504552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (method_type == NULL) 504652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 504752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 504852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 504952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 505052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!method_function_prototype) 505152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 505252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 505352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 505452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_variadic = false; 505552f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_synthesized = false; 505652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_defined = false; 505752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 505852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 505952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const unsigned num_args = method_function_prototype->getNumArgs(); 506052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 506152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (num_args != num_selectors_with_args) 506252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; // some debug information is corrupt. We are not going to deal with it. 506352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 506452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*m_ast, 506552f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), // beginLoc, 506652f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), // endLoc, 506752f792329be5db8e38961350589e97e8f2823acdGreg Clayton method_selector, 506852f792329be5db8e38961350589e97e8f2823acdGreg Clayton method_function_prototype->getResultType(), 506952f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // TypeSourceInfo *ResultTInfo, 507052f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetDeclContextForType (), 507152f792329be5db8e38961350589e97e8f2823acdGreg Clayton name[0] == '-', 507252f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_variadic, 507352f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_synthesized, 507452f792329be5db8e38961350589e97e8f2823acdGreg Clayton true, // is_implicitly_declared; we force this to true because we don't have source locations 507552f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_defined, 507652f792329be5db8e38961350589e97e8f2823acdGreg Clayton imp_control, 507752f792329be5db8e38961350589e97e8f2823acdGreg Clayton false /*has_related_result_type*/); 507852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 507952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 508052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_method_decl == NULL) 508152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 508252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 508352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (num_args > 0) 508452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 508552f792329be5db8e38961350589e97e8f2823acdGreg Clayton llvm::SmallVector<ParmVarDecl *, 12> params; 508652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 508752f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (unsigned param_index = 0; param_index < num_args; ++param_index) 508852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 508952f792329be5db8e38961350589e97e8f2823acdGreg Clayton params.push_back (ParmVarDecl::Create (*m_ast, 509052f792329be5db8e38961350589e97e8f2823acdGreg Clayton objc_method_decl, 509152f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 509252f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 509352f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, // anonymous 509452f792329be5db8e38961350589e97e8f2823acdGreg Clayton method_function_prototype->getArgType(param_index), 509552f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, 509652f792329be5db8e38961350589e97e8f2823acdGreg Clayton SC_Auto, 509752f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL)); 509852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 509952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 510052f792329be5db8e38961350589e97e8f2823acdGreg Clayton objc_method_decl->setMethodParams(*m_ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>()); 510152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 510252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 510352f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl->addDecl (objc_method_decl); 510452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 510552f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG 510652f792329be5db8e38961350589e97e8f2823acdGreg Clayton VerifyDecl(objc_method_decl); 510752f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif 510852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 510952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return objc_method_decl; 511052f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 511119b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton 511252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 511352f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::DeclContext * 511452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetDeclContextForType () const 511552f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 511652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 511752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 511852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 511952f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetCanonicalQualType()); 512052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 512152f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 512252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 512352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::UnaryTransform: break; 512452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::FunctionNoProto: break; 512552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::FunctionProto: break; 512652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::IncompleteArray: break; 512752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::VariableArray: break; 512852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ConstantArray: break; 512952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedArray: break; 513052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ExtVector: break; 513152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentSizedExtVector: break; 513252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Vector: break; 513352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Builtin: break; 513452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::BlockPointer: break; 513552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Pointer: break; 513652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::LValueReference: break; 513752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::RValueReference: break; 513852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::MemberPointer: break; 513952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Complex: break; 514052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: break; 514152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 514252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObjectPointer: return ClangASTType (m_ast, cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType()).GetDeclContextForType(); 514352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 514452f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 514552f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetDeclContextForType(); 514652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetDeclContextForType(); 514752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetDeclContextForType(); 514852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOfExpr: break; 514952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TypeOf: break; 515052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Decltype: break; 515152f792329be5db8e38961350589e97e8f2823acdGreg Clayton //case clang::Type::QualifiedName: break; 515252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::TemplateSpecialization: break; 515352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::DependentTemplateSpecialization: break; 5154d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::TemplateTypeParm: break; 5155d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::SubstTemplateTypeParm: break; 5156d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::SubstTemplateTypeParmPack:break; 515752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::PackExpansion: break; 515852f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::UnresolvedUsing: break; 515952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Attributed: break; 5160d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::Auto: break; 5161d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::InjectedClassName: break; 5162d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton case clang::Type::DependentName: break; 5163bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton case clang::Type::Atomic: break; 5164d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton } 516552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // No DeclContext in this type... 516652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return NULL; 5167d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton} 5168d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton 516952f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 517052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetDefaultAccessForRecordFields (int default_accessibility, 517152f792329be5db8e38961350589e97e8f2823acdGreg Clayton int *assigned_accessibilities, 517252f792329be5db8e38961350589e97e8f2823acdGreg Clayton size_t num_assigned_accessibilities) 517362fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton{ 517452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 517562fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton { 517652f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl *record_decl = GetAsRecordDecl(); 517752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (record_decl) 517862fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton { 517952f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t field_idx; 518052f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field, field_end; 518152f792329be5db8e38961350589e97e8f2823acdGreg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 518252f792329be5db8e38961350589e97e8f2823acdGreg Clayton field != field_end; 518352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ++field, ++field_idx) 518462fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton { 518552f792329be5db8e38961350589e97e8f2823acdGreg Clayton // If no accessibility was assigned, assign the correct one 518652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 518752f792329be5db8e38961350589e97e8f2823acdGreg Clayton field->setAccess ((AccessSpecifier)default_accessibility); 518852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 518952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 519052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 519152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 519252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 519352f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 519462fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton 519562fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton 519652f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 519752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetHasExternalStorage (bool has_extern) 519852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 519952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 520052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 520152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 520252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 520352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 520452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 520552f792329be5db8e38961350589e97e8f2823acdGreg Clayton switch (type_class) 520652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 520752f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Record: 520852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 520952f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 521052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 521152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 521252f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl->setHasExternalLexicalStorage (has_extern); 521352f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl->setHasExternalVisibleStorage (has_extern); 521452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 521562fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton } 521652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 521762fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton break; 521852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 521952f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Enum: 522052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 522152f792329be5db8e38961350589e97e8f2823acdGreg Clayton EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl(); 522252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (enum_decl) 522352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 522452f792329be5db8e38961350589e97e8f2823acdGreg Clayton enum_decl->setHasExternalLexicalStorage (has_extern); 522552f792329be5db8e38961350589e97e8f2823acdGreg Clayton enum_decl->setHasExternalVisibleStorage (has_extern); 522652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 522752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 522852f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 522952f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 523052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 523152f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCObject: 523252f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::ObjCInterface: 523352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 523452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 523552f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert (objc_class_type); 523652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (objc_class_type) 523752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 523852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 523952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 524052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (class_interface_decl) 524152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 524252f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl->setHasExternalLexicalStorage (has_extern); 524352f792329be5db8e38961350589e97e8f2823acdGreg Clayton class_interface_decl->setHasExternalVisibleStorage (has_extern); 524452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 524552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 524652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 524762fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton } 524852f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 524952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 525052f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Typedef: 525152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).SetHasExternalStorage (has_extern); 525252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 525352f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Elaborated: 525452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).SetHasExternalStorage (has_extern); 525552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 525652f792329be5db8e38961350589e97e8f2823acdGreg Clayton case clang::Type::Paren: 525752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).SetHasExternalStorage (has_extern); 525852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 525952f792329be5db8e38961350589e97e8f2823acdGreg Clayton default: 526052f792329be5db8e38961350589e97e8f2823acdGreg Clayton break; 526162fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton } 526252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 526362fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton} 526462fcf03cee420445b28fa79623075bb5ba379a9aGreg Clayton 526552f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 526652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::SetTagTypeKind (int kind) const 52671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 526852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 52691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 527052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType tag_qual_type(GetQualType()); 527152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type *clang_type = tag_qual_type.getTypePtr(); 527252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type) 527352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 527452f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TagType *tag_type = dyn_cast<TagType>(clang_type); 527552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_type) 527652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 527752f792329be5db8e38961350589e97e8f2823acdGreg Clayton TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 527852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_decl) 527952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 528052f792329be5db8e38961350589e97e8f2823acdGreg Clayton tag_decl->setTagKind ((TagDecl::TagKind)kind); 528152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 528252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 528352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 528452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 528552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 528652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 528752f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 52881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 52891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 529052f792329be5db8e38961350589e97e8f2823acdGreg Clayton#pragma mark TagDecl 52911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 529252f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 529352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::StartTagDeclarationDefinition () 529452f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 529552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 529652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 529752f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetQualType()); 529852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type *t = qual_type.getTypePtr(); 529952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (t) 530052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 530152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TagType *tag_type = dyn_cast<TagType>(t); 530252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_type) 530352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 530452f792329be5db8e38961350589e97e8f2823acdGreg Clayton TagDecl *tag_decl = tag_type->getDecl(); 530552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (tag_decl) 530652f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 530752f792329be5db8e38961350589e97e8f2823acdGreg Clayton tag_decl->startDefinition(); 530852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 530952f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 531052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 531152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 531252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(t); 531352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (object_type) 531452f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 531552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *interface_decl = object_type->getInterface(); 531652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (interface_decl) 531752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 531852f792329be5db8e38961350589e97e8f2823acdGreg Clayton interface_decl->startDefinition(); 531952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 532052f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 532152f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 532252f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 532352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 532452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 532552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 53261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 532752f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 532852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::CompleteTagDeclarationDefinition () 532952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 533052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 533152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 533252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetQualType()); 5333b9f09a6188dc2b48bf7f5677bc1eef9a73c3fa25Sean Callanan 533452f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 533552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 533652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (cxx_record_decl) 533752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 533852f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl->completeDefinition(); 533952f792329be5db8e38961350589e97e8f2823acdGreg Clayton 534052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 53411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 534252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 534352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr()); 534452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 534552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (enum_type) 5346e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 534752f792329be5db8e38961350589e97e8f2823acdGreg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 534852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 534952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (enum_decl) 5350e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 535152f792329be5db8e38961350589e97e8f2823acdGreg Clayton /// TODO This really needs to be fixed. 535252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 535352f792329be5db8e38961350589e97e8f2823acdGreg Clayton unsigned NumPositiveBits = 1; 535452f792329be5db8e38961350589e97e8f2823acdGreg Clayton unsigned NumNegativeBits = 0; 535552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 535652f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType promotion_qual_type; 535752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // If the enum integer type is less than an integer in bit width, 535852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // then we must promote it to an integer size. 535952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (m_ast->getTypeSize(enum_decl->getIntegerType()) < m_ast->getTypeSize(m_ast->IntTy)) 536052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 536152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (enum_decl->getIntegerType()->isSignedIntegerType()) 536252f792329be5db8e38961350589e97e8f2823acdGreg Clayton promotion_qual_type = m_ast->IntTy; 536352f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 536452f792329be5db8e38961350589e97e8f2823acdGreg Clayton promotion_qual_type = m_ast->UnsignedIntTy; 536552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 536652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else 536752f792329be5db8e38961350589e97e8f2823acdGreg Clayton promotion_qual_type = enum_decl->getIntegerType(); 536852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 536952f792329be5db8e38961350589e97e8f2823acdGreg Clayton enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); 537052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 5371e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 5372e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 537352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 537452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 537552f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 53761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 537719b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton 53781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 5379bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton 53801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 53811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 53821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata 538352f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 538452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::AddEnumerationValueToEnumerationType (const ClangASTType &enumerator_clang_type, 538552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const Declaration &decl, 538652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const char *name, 538752f792329be5db8e38961350589e97e8f2823acdGreg Clayton int64_t enum_value, 538852f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t enum_value_bit_size) 538952f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 539052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid() && enumerator_clang_type.IsValid() && name && name[0]) 53911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 539252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType enum_qual_type (GetCanonicalQualType()); 53939b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 539452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_signed = false; 539552f792329be5db8e38961350589e97e8f2823acdGreg Clayton enumerator_clang_type.IsIntegerType (is_signed); 539652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type *clang_type = enum_qual_type.getTypePtr(); 539752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type) 539852f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 539952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 540052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 540152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (enum_type) 540252f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 540352f792329be5db8e38961350589e97e8f2823acdGreg Clayton llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed); 540452f792329be5db8e38961350589e97e8f2823acdGreg Clayton enum_llvm_apsint = enum_value; 540552f792329be5db8e38961350589e97e8f2823acdGreg Clayton EnumConstantDecl *enumerator_decl = 540652f792329be5db8e38961350589e97e8f2823acdGreg Clayton EnumConstantDecl::Create (*m_ast, 540752f792329be5db8e38961350589e97e8f2823acdGreg Clayton enum_type->getDecl(), 540852f792329be5db8e38961350589e97e8f2823acdGreg Clayton SourceLocation(), 540952f792329be5db8e38961350589e97e8f2823acdGreg Clayton name ? &m_ast->Idents.get(name) : NULL, // Identifier 541052f792329be5db8e38961350589e97e8f2823acdGreg Clayton enumerator_clang_type.GetQualType(), 541152f792329be5db8e38961350589e97e8f2823acdGreg Clayton NULL, 541252f792329be5db8e38961350589e97e8f2823acdGreg Clayton enum_llvm_apsint); 541352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 541452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (enumerator_decl) 541552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 541652f792329be5db8e38961350589e97e8f2823acdGreg Clayton enum_type->getDecl()->addDecl(enumerator_decl); 541752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 541852f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG 541952f792329be5db8e38961350589e97e8f2823acdGreg Clayton VerifyDecl(enumerator_decl); 542052f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif 542152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 542252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 542352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 542452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 542552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 542652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 542752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 542852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 54291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 54301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 543152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 543252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetEnumerationIntegerType () const 543352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 543452f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType enum_qual_type (GetCanonicalQualType()); 543552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const clang::Type *clang_type = enum_qual_type.getTypePtr(); 543652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type) 543752f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 543852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 543952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (enum_type) 544052f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 544152f792329be5db8e38961350589e97e8f2823acdGreg Clayton EnumDecl *enum_decl = enum_type->getDecl(); 544252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (enum_decl) 544352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, enum_decl->getIntegerType()); 544452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 544552f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 544652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 544752f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 544852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 544952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType 545052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::CreateMemberPointerType (const ClangASTType &pointee_type) const 545152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 545252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid() && pointee_type.IsValid()) 545352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 545452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType (m_ast, m_ast->getMemberPointerType (pointee_type.GetQualType(), 545552f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetQualType().getTypePtr())); 545652f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 545752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return ClangASTType(); 545852f792329be5db8e38961350589e97e8f2823acdGreg Clayton} 54591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 54601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 546152f792329be5db8e38961350589e97e8f2823acdGreg Claytonsize_t 546252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::ConvertStringToFloatValue (const char *s, uint8_t *dst, size_t dst_size) const 546352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 546452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 546552f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 546652f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type (GetCanonicalQualType()); 546752f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t count = 0; 546852f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_complex = false; 546952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsFloatingPointType (count, is_complex)) 5470e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton { 547152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // TODO: handle complex and vector types 547252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (count != 1) 547352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 547452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 547552f792329be5db8e38961350589e97e8f2823acdGreg Clayton StringRef s_sref(s); 547652f792329be5db8e38961350589e97e8f2823acdGreg Clayton APFloat ap_float(m_ast->getFloatTypeSemantics(qual_type), s_sref); 547752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 547852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint64_t bit_size = m_ast->getTypeSize (qual_type); 547952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint64_t byte_size = bit_size / 8; 548052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (dst_size >= byte_size) 548152f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 548252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (bit_size == sizeof(float)*8) 548352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 548452f792329be5db8e38961350589e97e8f2823acdGreg Clayton float float32 = ap_float.convertToFloat(); 548552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ::memcpy (dst, &float32, byte_size); 548652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return byte_size; 548752f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 548852f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (bit_size >= 64) 548952f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 549052f792329be5db8e38961350589e97e8f2823acdGreg Clayton llvm::APInt ap_int(ap_float.bitcastToAPInt()); 549152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ::memcpy (dst, ap_int.getRawData(), byte_size); 549252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return byte_size; 549352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 549452f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 5495e52f37baba95cc60d2fc78d9f8726dff5c3f3720Greg Clayton } 54961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 549752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return 0; 54981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} 54991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 55001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 550152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 550252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 550352f792329be5db8e38961350589e97e8f2823acdGreg Clayton// Dumping types 550452f792329be5db8e38961350589e97e8f2823acdGreg Clayton//---------------------------------------------------------------------- 55051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#define DEPTH_INCREMENT 2 550652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 55071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonvoid 550852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DumpValue (ExecutionContext *exe_ctx, 550952f792329be5db8e38961350589e97e8f2823acdGreg Clayton Stream *s, 551052f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::Format format, 551152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const lldb_private::DataExtractor &data, 551252f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::offset_t data_byte_offset, 551352f792329be5db8e38961350589e97e8f2823acdGreg Clayton size_t data_byte_size, 551452f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t bitfield_bit_size, 551552f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t bitfield_bit_offset, 551652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool show_types, 551752f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool show_summary, 551852f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool verbose, 551952f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint32_t depth) 552052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{ 552152f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 552252f792329be5db8e38961350589e97e8f2823acdGreg Clayton return; 552352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 552452f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetQualType()); 55251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton switch (qual_type->getTypeClass()) 55261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 55271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Record: 552852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType ()) 55291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 553052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 553152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl = record_type->getDecl(); 55321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton assert(record_decl); 55331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t field_bit_offset = 0; 55341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t field_byte_offset = 0; 553552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(record_decl); 55361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t child_idx = 0; 55371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 553852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 55391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (cxx_record_decl) 55401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 55411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // We might have base classes to print out first 554252f792329be5db8e38961350589e97e8f2823acdGreg Clayton CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 55431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 55441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton base_class != base_class_end; 55451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton ++base_class) 55461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 554752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 55481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 55491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Skip empty base classes 55501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false) 55511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton continue; 55521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 55531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (base_class->isVirtual()) 5554a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; 55551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 5556a4881d04b4f367c67e34e8040e1257fc222a8b41Greg Clayton field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; 55571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton field_byte_offset = field_bit_offset / 8; 55581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton assert (field_bit_offset % 8 == 0); 55591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (child_idx == 0) 55601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->PutChar('{'); 55611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 55621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->PutChar(','); 55631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 556452f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType base_class_qual_type = base_class->getType(); 55651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton std::string base_class_type_name(base_class_qual_type.getAsString()); 55661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 55671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Indent and print the base class type name 55681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str()); 55691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 557052f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::pair<uint64_t, unsigned> base_class_type_info = m_ast->getTypeInfo(base_class_qual_type); 55711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 55721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Dump the value of the member 557352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType base_clang_type(m_ast, base_class_qual_type); 557452f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_clang_type.DumpValue (exe_ctx, 557552f792329be5db8e38961350589e97e8f2823acdGreg Clayton s, // Stream to dump to 557652f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_clang_type.GetFormat(), // The format with which to display the member 557752f792329be5db8e38961350589e97e8f2823acdGreg Clayton data, // Data buffer containing all bytes for this type 557852f792329be5db8e38961350589e97e8f2823acdGreg Clayton data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from 557952f792329be5db8e38961350589e97e8f2823acdGreg Clayton base_class_type_info.first / 8, // Size of this type in bytes 558052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 0, // Bitfield bit size 558152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 0, // Bitfield bit offset 558252f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_types, // Boolean indicating if we should show the variable types 558352f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_summary, // Boolean indicating if we should show a summary for the current type 558452f792329be5db8e38961350589e97e8f2823acdGreg Clayton verbose, // Verbose output? 558552f792329be5db8e38961350589e97e8f2823acdGreg Clayton depth + DEPTH_INCREMENT); // Scope depth for any types that have children 55861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 55871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton ++child_idx; 55881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 55891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 55901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t field_idx = 0; 559152f792329be5db8e38961350589e97e8f2823acdGreg Clayton RecordDecl::field_iterator field, field_end; 55921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 55931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 55941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Print the starting squiggly bracket (if this is the 55951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // first member) or comman (for member 2 and beyong) for 55961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // the struct/union/class member. 55971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (child_idx == 0) 55981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->PutChar('{'); 55991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 56001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->PutChar(','); 56011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 56021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Indent 56031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->Printf("\n%*s", depth + DEPTH_INCREMENT, ""); 56041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 560552f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType field_type = field->getType(); 56061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Print the member type if requested 56071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Figure out the type byte size (field_type_info.first) and 56081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // alignment (field_type_info.second) from the AST context. 560952f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::pair<uint64_t, unsigned> field_type_info = m_ast->getTypeInfo(field_type); 56101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton assert(field_idx < record_layout.getFieldCount()); 56111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Figure out the field offset within the current struct/union/class type 56121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton field_bit_offset = record_layout.getFieldOffset (field_idx); 56131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton field_byte_offset = field_bit_offset / 8; 56141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t field_bitfield_bit_size = 0; 56151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t field_bitfield_bit_offset = 0; 561652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ClangASTContext::FieldIsBitfield (m_ast, *field, field_bitfield_bit_size)) 56171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton field_bitfield_bit_offset = field_bit_offset % 8; 56181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 56191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (show_types) 56201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 56211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton std::string field_type_name(field_type.getAsString()); 56221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (field_bitfield_bit_size > 0) 56231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size); 56241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 56251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->Printf("(%s) ", field_type_name.c_str()); 56261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 56271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Print the member name and equal sign 56281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->Printf("%s = ", field->getNameAsString().c_str()); 56291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 56301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 56311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Dump the value of the member 563252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType field_clang_type (m_ast, field_type); 563352f792329be5db8e38961350589e97e8f2823acdGreg Clayton field_clang_type.DumpValue (exe_ctx, 563452f792329be5db8e38961350589e97e8f2823acdGreg Clayton s, // Stream to dump to 563552f792329be5db8e38961350589e97e8f2823acdGreg Clayton field_clang_type.GetFormat(), // The format with which to display the member 563652f792329be5db8e38961350589e97e8f2823acdGreg Clayton data, // Data buffer containing all bytes for this type 563752f792329be5db8e38961350589e97e8f2823acdGreg Clayton data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from 563852f792329be5db8e38961350589e97e8f2823acdGreg Clayton field_type_info.first / 8, // Size of this type in bytes 563952f792329be5db8e38961350589e97e8f2823acdGreg Clayton field_bitfield_bit_size, // Bitfield bit size 564052f792329be5db8e38961350589e97e8f2823acdGreg Clayton field_bitfield_bit_offset, // Bitfield bit offset 564152f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_types, // Boolean indicating if we should show the variable types 564252f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_summary, // Boolean indicating if we should show a summary for the current type 564352f792329be5db8e38961350589e97e8f2823acdGreg Clayton verbose, // Verbose output? 564452f792329be5db8e38961350589e97e8f2823acdGreg Clayton depth + DEPTH_INCREMENT); // Scope depth for any types that have children 56451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 56461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 56471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Indent the trailing squiggly bracket 56481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (child_idx > 0) 56491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->Printf("\n%*s}", depth, ""); 56501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 56511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return; 56521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 56531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Enum: 565452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (GetCompleteType ()) 56551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 565652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const EnumType *enum_type = cast<EnumType>(qual_type.getTypePtr()); 565752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const EnumDecl *enum_decl = enum_type->getDecl(); 56581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton assert(enum_decl); 565952f792329be5db8e38961350589e97e8f2823acdGreg Clayton EnumDecl::enumerator_iterator enum_pos, enum_end_pos; 566036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = data_byte_offset; 56611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset); 56621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos) 56631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 56641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (enum_pos->getInitVal() == enum_value) 56651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 566647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan s->Printf("%s", enum_pos->getNameAsString().c_str()); 56671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return; 56681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 56691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 56701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // If we have gotten here we didn't get find the enumerator in the 56711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // enum decl, so just print the integer. 56725f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf("%" PRIi64, enum_value); 56731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 56741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return; 56751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 56761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::ConstantArray: 56771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 567852f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr()); 56791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton bool is_array_of_characters = false; 568052f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType element_qual_type = array->getElementType(); 56811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 5682d5b3c351ea23e8e36d47056e50b1df773ae9050aSean Callanan const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr(); 56831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (canonical_type) 56841674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton is_array_of_characters = canonical_type->isCharType(); 56851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 56861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton const uint64_t element_count = array->getSize().getLimitedValue(); 56871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 568852f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::pair<uint64_t, unsigned> field_type_info = m_ast->getTypeInfo(element_qual_type); 56891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 56901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t element_idx = 0; 56911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t element_offset = 0; 56921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint64_t element_byte_size = field_type_info.first / 8; 56931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t element_stride = element_byte_size; 56941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 56951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (is_array_of_characters) 56961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 56971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->PutChar('"'); 56981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); 56991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->PutChar('"'); 57001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return; 57011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 57021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 57031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 570452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType element_clang_type(m_ast, element_qual_type); 570552f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::Format element_format = element_clang_type.GetFormat(); 57061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 57071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton for (element_idx = 0; element_idx < element_count; ++element_idx) 57081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 57091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Print the starting squiggly bracket (if this is the 57101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // first member) or comman (for member 2 and beyong) for 57111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // the struct/union/class member. 57121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (element_idx == 0) 57131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->PutChar('{'); 57141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 57151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->PutChar(','); 57161674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 57171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Indent and print the index 57181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx); 57191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 57201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Figure out the field offset within the current struct/union/class type 57211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton element_offset = element_idx * element_stride; 57221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 57231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Dump the value of the member 572452f792329be5db8e38961350589e97e8f2823acdGreg Clayton element_clang_type.DumpValue (exe_ctx, 572552f792329be5db8e38961350589e97e8f2823acdGreg Clayton s, // Stream to dump to 572652f792329be5db8e38961350589e97e8f2823acdGreg Clayton element_format, // The format with which to display the element 572752f792329be5db8e38961350589e97e8f2823acdGreg Clayton data, // Data buffer containing all bytes for this type 572852f792329be5db8e38961350589e97e8f2823acdGreg Clayton data_byte_offset + element_offset,// Offset into "data" where to grab value from 572952f792329be5db8e38961350589e97e8f2823acdGreg Clayton element_byte_size, // Size of this type in bytes 573052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 0, // Bitfield bit size 573152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 0, // Bitfield bit offset 573252f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_types, // Boolean indicating if we should show the variable types 573352f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_summary, // Boolean indicating if we should show a summary for the current type 573452f792329be5db8e38961350589e97e8f2823acdGreg Clayton verbose, // Verbose output? 573552f792329be5db8e38961350589e97e8f2823acdGreg Clayton depth + DEPTH_INCREMENT); // Scope depth for any types that have children 57361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 57371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 57381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Indent the trailing squiggly bracket 57391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (element_idx > 0) 57401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton s->Printf("\n%*s}", depth, ""); 57411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 57421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 57431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return; 57441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 57451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Typedef: 57461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 574752f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType typedef_qual_type = cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType(); 574852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 574952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType typedef_clang_type (m_ast, typedef_qual_type); 575052f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::Format typedef_format = typedef_clang_type.GetFormat(); 575152f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::pair<uint64_t, unsigned> typedef_type_info = m_ast->getTypeInfo(typedef_qual_type); 57521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint64_t typedef_byte_size = typedef_type_info.first / 8; 57531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 575452f792329be5db8e38961350589e97e8f2823acdGreg Clayton return typedef_clang_type.DumpValue (exe_ctx, 575552f792329be5db8e38961350589e97e8f2823acdGreg Clayton s, // Stream to dump to 575652f792329be5db8e38961350589e97e8f2823acdGreg Clayton typedef_format, // The format with which to display the element 575752f792329be5db8e38961350589e97e8f2823acdGreg Clayton data, // Data buffer containing all bytes for this type 575852f792329be5db8e38961350589e97e8f2823acdGreg Clayton data_byte_offset, // Offset into "data" where to grab value from 575952f792329be5db8e38961350589e97e8f2823acdGreg Clayton typedef_byte_size, // Size of this type in bytes 576052f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_size, // Bitfield bit size 576152f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_offset,// Bitfield bit offset 576252f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_types, // Boolean indicating if we should show the variable types 576352f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_summary, // Boolean indicating if we should show a summary for the current type 576452f792329be5db8e38961350589e97e8f2823acdGreg Clayton verbose, // Verbose output? 576552f792329be5db8e38961350589e97e8f2823acdGreg Clayton depth); // Scope depth for any types that have children 57661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 57671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 57681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 576919b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton case clang::Type::Elaborated: 577019b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton { 577152f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType elaborated_qual_type = cast<ElaboratedType>(qual_type)->getNamedType(); 577252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType elaborated_clang_type (m_ast, elaborated_qual_type); 577352f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::Format elaborated_format = elaborated_clang_type.GetFormat(); 577452f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::pair<uint64_t, unsigned> elaborated_type_info = m_ast->getTypeInfo(elaborated_qual_type); 577519b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton uint64_t elaborated_byte_size = elaborated_type_info.first / 8; 577619b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton 577752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return elaborated_clang_type.DumpValue (exe_ctx, 577852f792329be5db8e38961350589e97e8f2823acdGreg Clayton s, // Stream to dump to 577952f792329be5db8e38961350589e97e8f2823acdGreg Clayton elaborated_format, // The format with which to display the element 578052f792329be5db8e38961350589e97e8f2823acdGreg Clayton data, // Data buffer containing all bytes for this type 578152f792329be5db8e38961350589e97e8f2823acdGreg Clayton data_byte_offset, // Offset into "data" where to grab value from 578252f792329be5db8e38961350589e97e8f2823acdGreg Clayton elaborated_byte_size, // Size of this type in bytes 578352f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_size, // Bitfield bit size 578452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_offset,// Bitfield bit offset 578552f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_types, // Boolean indicating if we should show the variable types 578652f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_summary, // Boolean indicating if we should show a summary for the current type 578752f792329be5db8e38961350589e97e8f2823acdGreg Clayton verbose, // Verbose output? 578852f792329be5db8e38961350589e97e8f2823acdGreg Clayton depth); // Scope depth for any types that have children 578919b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton } 579019b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton break; 5791efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata 5792efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata case clang::Type::Paren: 579352f792329be5db8e38961350589e97e8f2823acdGreg Clayton { 579452f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType desugar_qual_type = cast<ParenType>(qual_type)->desugar(); 579552f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType desugar_clang_type (m_ast, desugar_qual_type); 579652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 579752f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::Format desugar_format = desugar_clang_type.GetFormat(); 579852f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::pair<uint64_t, unsigned> desugar_type_info = m_ast->getTypeInfo(desugar_qual_type); 579952f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint64_t desugar_byte_size = desugar_type_info.first / 8; 580052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 580152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return desugar_clang_type.DumpValue (exe_ctx, 580252f792329be5db8e38961350589e97e8f2823acdGreg Clayton s, // Stream to dump to 580352f792329be5db8e38961350589e97e8f2823acdGreg Clayton desugar_format, // The format with which to display the element 580452f792329be5db8e38961350589e97e8f2823acdGreg Clayton data, // Data buffer containing all bytes for this type 580552f792329be5db8e38961350589e97e8f2823acdGreg Clayton data_byte_offset, // Offset into "data" where to grab value from 580652f792329be5db8e38961350589e97e8f2823acdGreg Clayton desugar_byte_size, // Size of this type in bytes 580752f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_size, // Bitfield bit size 580852f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_offset,// Bitfield bit offset 580952f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_types, // Boolean indicating if we should show the variable types 581052f792329be5db8e38961350589e97e8f2823acdGreg Clayton show_summary, // Boolean indicating if we should show a summary for the current type 581152f792329be5db8e38961350589e97e8f2823acdGreg Clayton verbose, // Verbose output? 581252f792329be5db8e38961350589e97e8f2823acdGreg Clayton depth); // Scope depth for any types that have children 581352f792329be5db8e38961350589e97e8f2823acdGreg Clayton } 5814efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata break; 5815efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata 58161674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton default: 58171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // We are down the a scalar type that we just need to display. 581852f792329be5db8e38961350589e97e8f2823acdGreg Clayton data.Dump(s, 581952f792329be5db8e38961350589e97e8f2823acdGreg Clayton data_byte_offset, 582052f792329be5db8e38961350589e97e8f2823acdGreg Clayton format, 582152f792329be5db8e38961350589e97e8f2823acdGreg Clayton data_byte_size, 582252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 1, 582352f792329be5db8e38961350589e97e8f2823acdGreg Clayton UINT32_MAX, 582452f792329be5db8e38961350589e97e8f2823acdGreg Clayton LLDB_INVALID_ADDRESS, 582552f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_size, 582652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_offset); 58271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 58281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (show_summary) 582952f792329be5db8e38961350589e97e8f2823acdGreg Clayton DumpSummary (exe_ctx, s, data, data_byte_offset, data_byte_size); 58301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 58311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 58321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} 58331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 58341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 58351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 58361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 58371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonbool 583852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DumpTypeValue (Stream *s, 583924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton lldb::Format format, 584024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton const lldb_private::DataExtractor &data, 5841fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton lldb::offset_t byte_offset, 584224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton size_t byte_size, 584324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton uint32_t bitfield_bit_size, 584424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton uint32_t bitfield_bit_offset, 584524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton ExecutionContextScope *exe_scope) 58461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 584752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 584852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 584952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsAggregateType()) 58501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 585152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 58521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 58531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 58541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 585552f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetQualType()); 585652f792329be5db8e38961350589e97e8f2823acdGreg Clayton 58579488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 58589488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton switch (type_class) 58591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 5860e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case clang::Type::Typedef: 5861e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton { 586252f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType typedef_qual_type = cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType(); 586352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType typedef_clang_type (m_ast, typedef_qual_type); 5864e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton if (format == eFormatDefault) 586552f792329be5db8e38961350589e97e8f2823acdGreg Clayton format = typedef_clang_type.GetFormat(); 586652f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::pair<uint64_t, unsigned> typedef_type_info = m_ast->getTypeInfo(typedef_qual_type); 5867e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton uint64_t typedef_byte_size = typedef_type_info.first / 8; 5868e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton 586952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return typedef_clang_type.DumpTypeValue (s, 587052f792329be5db8e38961350589e97e8f2823acdGreg Clayton format, // The format with which to display the element 587152f792329be5db8e38961350589e97e8f2823acdGreg Clayton data, // Data buffer containing all bytes for this type 587252f792329be5db8e38961350589e97e8f2823acdGreg Clayton byte_offset, // Offset into "data" where to grab value from 587352f792329be5db8e38961350589e97e8f2823acdGreg Clayton typedef_byte_size, // Size of this type in bytes 587452f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield 587552f792329be5db8e38961350589e97e8f2823acdGreg Clayton bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0 587652f792329be5db8e38961350589e97e8f2823acdGreg Clayton exe_scope); 5877e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton } 5878e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton break; 5879e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton 58801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case clang::Type::Enum: 5881e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton // If our format is enum or default, show the enumeration value as 5882e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton // its enumeration string value, else just display it as requested. 588352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType ()) 58841674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 588552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const EnumType *enum_type = cast<EnumType>(qual_type.getTypePtr()); 588652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const EnumDecl *enum_decl = enum_type->getDecl(); 58871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton assert(enum_decl); 588852f792329be5db8e38961350589e97e8f2823acdGreg Clayton EnumDecl::enumerator_iterator enum_pos, enum_end_pos; 5889d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton const bool is_signed = qual_type->isSignedIntegerOrEnumerationType(); 589036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = byte_offset; 5891d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton if (is_signed) 58921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 5893d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset); 5894d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos) 58951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 5896d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton if (enum_pos->getInitVal().getSExtValue() == enum_svalue) 5897d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton { 5898d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton s->PutCString (enum_pos->getNameAsString().c_str()); 5899d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton return true; 5900d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton } 59011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 5902d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton // If we have gotten here we didn't get find the enumerator in the 5903d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton // enum decl, so just print the integer. 5904d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton s->Printf("%" PRIi64, enum_svalue); 5905d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton } 5906d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton else 5907d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton { 5908d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset); 5909d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos) 5910d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton { 5911d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton if (enum_pos->getInitVal().getZExtValue() == enum_uvalue) 5912d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton { 5913d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton s->PutCString (enum_pos->getNameAsString().c_str()); 5914d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton return true; 5915d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton } 5916d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton } 5917d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton // If we have gotten here we didn't get find the enumerator in the 5918d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton // enum decl, so just print the integer. 5919d8d97f556ab58fae76d5c677d43a2d621bf039beGreg Clayton s->Printf("%" PRIu64, enum_uvalue); 59201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 59211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 59221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 5923e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton // format was not enum, just fall through and dump the value as requested.... 5924e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton 59251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton default: 59261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // We are down the a scalar type that we just need to display. 5927e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton { 5928e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton uint32_t item_count = 1; 5929e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton // A few formats, we might need to modify our size and count for depending 5930e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton // on how we are trying to display the value... 5931e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton switch (format) 5932e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton { 5933e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton default: 5934e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatBoolean: 5935e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatBinary: 5936e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatComplex: 5937e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatCString: // NULL terminated C strings 5938e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatDecimal: 5939e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatEnum: 5940e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatHex: 5941535543d6104ee45b4503db6bb6c175e66d0e093bEnrico Granata case eFormatHexUppercase: 5942e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatFloat: 5943e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatOctal: 5944e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatOSType: 5945e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatUnsigned: 5946e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatPointer: 5947e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfChar: 5948e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfSInt8: 5949e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfUInt8: 5950e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfSInt16: 5951e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfUInt16: 5952e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfSInt32: 5953e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfUInt32: 5954e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfSInt64: 5955e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfUInt64: 5956e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfFloat32: 5957e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfFloat64: 5958e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatVectorOfUInt128: 5959e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton break; 5960e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton 5961e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatChar: 5962e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatCharPrintable: 5963307fa07606d519d427c812802aff5f9727e7047cGreg Clayton case eFormatCharArray: 5964e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatBytes: 5965e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatBytesWithASCII: 5966cebe96537a98c95f375cf81ac1c37dd082b4520bJohnny Chen item_count = byte_size; 5967e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton byte_size = 1; 5968e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton break; 5969e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton 5970e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatUnicode16: 5971cebe96537a98c95f375cf81ac1c37dd082b4520bJohnny Chen item_count = byte_size / 2; 5972e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton byte_size = 2; 5973e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton break; 5974e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton 5975e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton case eFormatUnicode32: 5976cebe96537a98c95f375cf81ac1c37dd082b4520bJohnny Chen item_count = byte_size / 4; 5977e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton byte_size = 4; 5978e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton break; 5979e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton } 5980e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton return data.Dump (s, 5981e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton byte_offset, 5982e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton format, 5983e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton byte_size, 5984e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton item_count, 5985e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton UINT32_MAX, 5986e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton LLDB_INVALID_ADDRESS, 5987e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton bitfield_bit_size, 598824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton bitfield_bit_offset, 598924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton exe_scope); 5990e179a5840a49167964ca768a13c252c58c9cffccGreg Clayton } 59911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 59921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 59931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 59941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return 0; 59951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} 59961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 59971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 59981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 59991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonvoid 600052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DumpSummary (ExecutionContext *exe_ctx, 600152f792329be5db8e38961350589e97e8f2823acdGreg Clayton Stream *s, 600252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const lldb_private::DataExtractor &data, 600352f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::offset_t data_byte_offset, 600452f792329be5db8e38961350589e97e8f2823acdGreg Clayton size_t data_byte_size) 60051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 60061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t length = 0; 600752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsCStringType (length)) 60081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 6009567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 60101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 6011567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 6012567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 60131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 601436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = data_byte_offset; 6015567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t pointer_addresss = data.GetMaxU64(&offset, data_byte_size); 6016567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton std::vector<uint8_t> buf; 6017567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (length > 0) 6018567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton buf.resize (length); 6019567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else 6020567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton buf.resize (256); 6021567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 6022567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4); 6023567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton buf.back() = '\0'; 6024567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton size_t bytes_read; 6025567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton size_t total_cstr_len = 0; 6026567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error error; 6027567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton while ((bytes_read = process->ReadMemory (pointer_addresss, &buf.front(), buf.size(), error)) > 0) 6028567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 6029567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const size_t len = strlen((const char *)&buf.front()); 6030567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (len == 0) 6031567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton break; 6032567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (total_cstr_len == 0) 6033567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s->PutCString (" \""); 6034567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0); 6035567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton total_cstr_len += len; 6036567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (len < buf.size()) 6037567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton break; 6038567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton pointer_addresss += total_cstr_len; 6039567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 6040567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (total_cstr_len > 0) 6041567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton s->PutChar ('"'); 60421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 60431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 60441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 60451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} 60461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 6047960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonvoid 604852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DumpTypeDescription () const 6049133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton{ 6050133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton StreamFile s (stdout, false); 6051133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton DumpTypeDescription (&s); 6052017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton ClangASTMetadata *metadata = ClangASTContext::GetMetadata (m_ast, m_type); 6053017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton if (metadata) 6054017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton { 6055017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton metadata->Dump (&s); 6056017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton } 6057133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton} 6058133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Clayton 6059133214fe6ebe3cf7f509047a3d297fca1f4b09eeGreg Claytonvoid 606052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::DumpTypeDescription (Stream *s) const 6061960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 606252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsValid()) 6063960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 606452f792329be5db8e38961350589e97e8f2823acdGreg Clayton QualType qual_type(GetQualType()); 6065960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 606652f792329be5db8e38961350589e97e8f2823acdGreg Clayton SmallVector<char, 1024> buf; 606752f792329be5db8e38961350589e97e8f2823acdGreg Clayton raw_svector_ostream llvm_ostrm (buf); 6068960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 606996154be69fa240a662419183ed08e1cfc5418164Greg Clayton const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 607096154be69fa240a662419183ed08e1cfc5418164Greg Clayton switch (type_class) 6071960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 607296154be69fa240a662419183ed08e1cfc5418164Greg Clayton case clang::Type::ObjCObject: 607396154be69fa240a662419183ed08e1cfc5418164Greg Clayton case clang::Type::ObjCInterface: 6074960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 607552f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetCompleteType (); 6076017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton 607752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 607896154be69fa240a662419183ed08e1cfc5418164Greg Clayton assert (objc_class_type); 607996154be69fa240a662419183ed08e1cfc5418164Greg Clayton if (objc_class_type) 6080960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 608152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 608296154be69fa240a662419183ed08e1cfc5418164Greg Clayton if (class_interface_decl) 6083009a430d4d65984e0d33850686dd7b7a7a4a35bdSean Callanan { 608452f792329be5db8e38961350589e97e8f2823acdGreg Clayton PrintingPolicy policy = m_ast->getPrintingPolicy(); 6085009a430d4d65984e0d33850686dd7b7a7a4a35bdSean Callanan class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel()); 6086009a430d4d65984e0d33850686dd7b7a7a4a35bdSean Callanan } 6087960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 608896154be69fa240a662419183ed08e1cfc5418164Greg Clayton } 608996154be69fa240a662419183ed08e1cfc5418164Greg Clayton break; 609096154be69fa240a662419183ed08e1cfc5418164Greg Clayton 609196154be69fa240a662419183ed08e1cfc5418164Greg Clayton case clang::Type::Typedef: 609296154be69fa240a662419183ed08e1cfc5418164Greg Clayton { 609352f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); 609496154be69fa240a662419183ed08e1cfc5418164Greg Clayton if (typedef_type) 6095960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 609652f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TypedefNameDecl *typedef_decl = typedef_type->getDecl(); 609796154be69fa240a662419183ed08e1cfc5418164Greg Clayton std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString()); 609896154be69fa240a662419183ed08e1cfc5418164Greg Clayton if (!clang_typedef_name.empty()) 6099960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 610096154be69fa240a662419183ed08e1cfc5418164Greg Clayton s->PutCString ("typedef "); 610196154be69fa240a662419183ed08e1cfc5418164Greg Clayton s->PutCString (clang_typedef_name.c_str()); 6102960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 6103960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 610496154be69fa240a662419183ed08e1cfc5418164Greg Clayton } 610596154be69fa240a662419183ed08e1cfc5418164Greg Clayton break; 610696154be69fa240a662419183ed08e1cfc5418164Greg Clayton 610719b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton case clang::Type::Elaborated: 610852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s); 610919b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton return; 611019b646725e7d6bebda787fa3cb55ff223a00d907Greg Clayton 6111efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata case clang::Type::Paren: 611252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).DumpTypeDescription(s); 6113efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata return; 6114efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata 611596154be69fa240a662419183ed08e1cfc5418164Greg Clayton case clang::Type::Record: 611696154be69fa240a662419183ed08e1cfc5418164Greg Clayton { 611752f792329be5db8e38961350589e97e8f2823acdGreg Clayton GetCompleteType (); 6118017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton 611952f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 612052f792329be5db8e38961350589e97e8f2823acdGreg Clayton const RecordDecl *record_decl = record_type->getDecl(); 612152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 612296154be69fa240a662419183ed08e1cfc5418164Greg Clayton 612396154be69fa240a662419183ed08e1cfc5418164Greg Clayton if (cxx_record_decl) 612452f792329be5db8e38961350589e97e8f2823acdGreg Clayton cxx_record_decl->print(llvm_ostrm, m_ast->getPrintingPolicy(), s->GetIndentLevel()); 612596154be69fa240a662419183ed08e1cfc5418164Greg Clayton else 612652f792329be5db8e38961350589e97e8f2823acdGreg Clayton record_decl->print(llvm_ostrm, m_ast->getPrintingPolicy(), s->GetIndentLevel()); 612796154be69fa240a662419183ed08e1cfc5418164Greg Clayton } 612896154be69fa240a662419183ed08e1cfc5418164Greg Clayton break; 6129960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 613096154be69fa240a662419183ed08e1cfc5418164Greg Clayton default: 613196154be69fa240a662419183ed08e1cfc5418164Greg Clayton { 613252f792329be5db8e38961350589e97e8f2823acdGreg Clayton const TagType *tag_type = dyn_cast<TagType>(qual_type.getTypePtr()); 613396154be69fa240a662419183ed08e1cfc5418164Greg Clayton if (tag_type) 613496154be69fa240a662419183ed08e1cfc5418164Greg Clayton { 613552f792329be5db8e38961350589e97e8f2823acdGreg Clayton TagDecl *tag_decl = tag_type->getDecl(); 613696154be69fa240a662419183ed08e1cfc5418164Greg Clayton if (tag_decl) 613796154be69fa240a662419183ed08e1cfc5418164Greg Clayton tag_decl->print(llvm_ostrm, 0); 613896154be69fa240a662419183ed08e1cfc5418164Greg Clayton } 613996154be69fa240a662419183ed08e1cfc5418164Greg Clayton else 6140960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 6141960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton std::string clang_type_name(qual_type.getAsString()); 6142960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (!clang_type_name.empty()) 6143960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton s->PutCString (clang_type_name.c_str()); 6144960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 6145960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 6146960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 6147960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 6148960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton llvm_ostrm.flush(); 6149960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (buf.size() > 0) 6150960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton { 6151960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton s->Write (buf.data(), buf.size()); 6152960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 6153960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton } 6154960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 6155960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 61561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonbool 615752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::GetValueAsScalar (const lldb_private::DataExtractor &data, 615852f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::offset_t data_byte_offset, 615952f792329be5db8e38961350589e97e8f2823acdGreg Clayton size_t data_byte_size, 616052f792329be5db8e38961350589e97e8f2823acdGreg Clayton Scalar &value) const 61611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 616252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 616352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 61641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 616552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (IsAggregateType ()) 61661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 61671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return false; // Aggregate types don't have scalar values 61681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 61691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 61701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 6171fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton uint64_t count = 0; 617252f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::Encoding encoding = GetEncoding (count); 61731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 61741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (encoding == lldb::eEncodingInvalid || count != 1) 61751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return false; 61761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 617752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint64_t byte_size = GetByteSize(); 617836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = data_byte_offset; 61791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton switch (encoding) 61801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 6181279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case lldb::eEncodingInvalid: 6182279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 6183279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case lldb::eEncodingVector: 6184279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 61851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case lldb::eEncodingUint: 61861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size <= sizeof(unsigned long long)) 61871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 61881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint64_t uval64 = data.GetMaxU64 (&offset, byte_size); 61891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size <= sizeof(unsigned int)) 61901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 61911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = (unsigned int)uval64; 61921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 61931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 61941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else if (byte_size <= sizeof(unsigned long)) 61951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 61961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = (unsigned long)uval64; 61971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 61981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 61991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else if (byte_size <= sizeof(unsigned long long)) 62001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = (unsigned long long )uval64; 62021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 62031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 62051674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value.Clear(); 62061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 62081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 62091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case lldb::eEncodingSint: 62101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size <= sizeof(long long)) 62111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62124a19f588474a658b18338eff7ba665ca9766e1c7Sean Callanan int64_t sval64 = data.GetMaxS64 (&offset, byte_size); 62131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size <= sizeof(int)) 62141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = (int)sval64; 62161674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 62171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else if (byte_size <= sizeof(long)) 62191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = (long)sval64; 62211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 62221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else if (byte_size <= sizeof(long long)) 62241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = (long long )sval64; 62261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 62271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 62291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value.Clear(); 62301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 62321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 62331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case lldb::eEncodingIEEE754: 62341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size <= sizeof(long double)) 62351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint32_t u32; 62371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint64_t u64; 62381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size == sizeof(float)) 62391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (sizeof(float) == sizeof(uint32_t)) 62411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton u32 = data.GetU32(&offset); 62431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = *((float *)&u32); 62441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 62451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else if (sizeof(float) == sizeof(uint64_t)) 62471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton u64 = data.GetU64(&offset); 62491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = *((float *)&u64); 62501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 62511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 62541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size == sizeof(double)) 62551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (sizeof(double) == sizeof(uint32_t)) 62571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton u32 = data.GetU32(&offset); 62591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = *((double *)&u32); 62601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 62611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else if (sizeof(double) == sizeof(uint64_t)) 62631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton u64 = data.GetU64(&offset); 62651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = *((double *)&u64); 62661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 62671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 62701674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size == sizeof(long double)) 62711674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62721674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (sizeof(long double) == sizeof(uint32_t)) 62731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62741674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton u32 = data.GetU32(&offset); 62751674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = *((long double *)&u32); 62761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 62771674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62781674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else if (sizeof(long double) == sizeof(uint64_t)) 62791674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton u64 = data.GetU64(&offset); 62811674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton value = *((long double *)&u64); 62821674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 62831674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62841674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62851674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 62871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 62891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return false; 62901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} 62911674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 62921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonbool 62931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg ClaytonClangASTType::SetValueFromScalar (const Scalar &value, Stream &strm) 62941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 62951674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // Aggregate types don't have scalar values 629652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsAggregateType ()) 62971674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 62981674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton strm.GetFlags().Set(Stream::eBinary); 6299fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton uint64_t count = 0; 630052f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::Encoding encoding = GetEncoding (count); 63011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 63021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (encoding == lldb::eEncodingInvalid || count != 1) 63031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return false; 63041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 630552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint64_t bit_width = GetBitSize(); 63061674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // This function doesn't currently handle non-byte aligned assignments 63071674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if ((bit_width % 8) != 0) 63081674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return false; 63091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 6310fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton const uint64_t byte_size = (bit_width + 7 ) / 8; 63111674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton switch (encoding) 63121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 6313279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case lldb::eEncodingInvalid: 6314279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 6315279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan case lldb::eEncodingVector: 6316279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan break; 63171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case lldb::eEncodingUint: 63181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton switch (byte_size) 63191674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 63201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case 1: strm.PutHex8(value.UInt()); return true; 63211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case 2: strm.PutHex16(value.UInt()); return true; 63221674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case 4: strm.PutHex32(value.UInt()); return true; 63231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case 8: strm.PutHex64(value.ULongLong()); return true; 63241674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton default: 63251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 63261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 63271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 63281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 63291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case lldb::eEncodingSint: 63301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton switch (byte_size) 63311674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 63321674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case 1: strm.PutHex8(value.SInt()); return true; 63331674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case 2: strm.PutHex16(value.SInt()); return true; 63341674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case 4: strm.PutHex32(value.SInt()); return true; 63351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case 8: strm.PutHex64(value.SLongLong()); return true; 63361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton default: 63371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 63381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 63391674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 63401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 63411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton case lldb::eEncodingIEEE754: 63421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size <= sizeof(long double)) 63431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 63441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size == sizeof(float)) 63451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 63461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton strm.PutFloat(value.Float()); 63471674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 63481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 63491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 63501674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size == sizeof(double)) 63511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 63521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton strm.PutDouble(value.Double()); 63531674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 63541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 63551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 63561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size == sizeof(long double)) 63571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 63581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton strm.PutDouble(value.LongDouble()); 63591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 63601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 63611674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 63621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton break; 63631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 63641674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 63651674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return false; 63661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} 63671674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 63681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonbool 6369fe6dc6e241c52822710380cec0931351a1d7b2d3Greg ClaytonClangASTType::ReadFromMemory (lldb_private::ExecutionContext *exe_ctx, 6370fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton lldb::addr_t addr, 6371fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton AddressType address_type, 6372fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton lldb_private::DataExtractor &data) 63731674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 637452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 637552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 63761674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 637752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Can't convert a file address to anything valid without more 637852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // context (which Module it came from) 6379b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (address_type == eAddressTypeFile) 63801674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return false; 63818f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 638252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!GetCompleteType()) 63838f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return false; 63848f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 638552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint64_t byte_size = GetByteSize(); 63861674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (data.GetByteSize() < byte_size) 63871674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 63881674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton lldb::DataBufferSP data_sp(new DataBufferHeap (byte_size, '\0')); 63891674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton data.SetData(data_sp); 63901674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 639152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 63921674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton uint8_t* dst = (uint8_t*)data.PeekData(0, byte_size); 63931674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (dst != NULL) 63941674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 6395b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (address_type == eAddressTypeHost) 63961674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 639772374e3009feb87332542f60d72b92343c9b35faEnrico Granata if (addr == 0) 639872374e3009feb87332542f60d72b92343c9b35faEnrico Granata return false; 63991674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // The address is an address in this process, so just copy it 64001674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton memcpy (dst, (uint8_t*)NULL + addr, byte_size); 64011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 64021674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 64031674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 64041674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 6405567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = NULL; 6406567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 6407567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process = exe_ctx->GetProcessPtr(); 6408567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 64091674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 64101674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton Error error; 6411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return process->ReadMemory(addr, dst, byte_size, error) == byte_size; 64121674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 64131674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 64141674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 64151674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return false; 64161674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} 64171674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 64181674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonbool 641952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType::WriteToMemory (lldb_private::ExecutionContext *exe_ctx, 642052f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::addr_t addr, 642152f792329be5db8e38961350589e97e8f2823acdGreg Clayton AddressType address_type, 642252f792329be5db8e38961350589e97e8f2823acdGreg Clayton StreamString &new_value) 64231674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton{ 642452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!IsValid()) 642552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 64261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 642752f792329be5db8e38961350589e97e8f2823acdGreg Clayton // Can't convert a file address to anything valid without more 642852f792329be5db8e38961350589e97e8f2823acdGreg Clayton // context (which Module it came from) 6429b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (address_type == eAddressTypeFile) 64301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return false; 643152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 643252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!GetCompleteType()) 643352f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 643452f792329be5db8e38961350589e97e8f2823acdGreg Clayton 643552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint64_t byte_size = GetByteSize(); 64361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 64371674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton if (byte_size > 0) 64381674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 6439b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (address_type == eAddressTypeHost) 64401674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 64411674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton // The address is an address in this process, so just copy it 64421674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton memcpy ((void *)addr, new_value.GetData(), byte_size); 64431674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return true; 64441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 64451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton else 64461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 6447567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = NULL; 6448567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 6449567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process = exe_ctx->GetProcessPtr(); 6450567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 64511674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton { 64521674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton Error error; 6453567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return process->WriteMemory(addr, new_value.GetData(), byte_size, error) == byte_size; 64541674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 64551674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 64561674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton } 64571674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton return false; 64581674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton} 64591674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 64601674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton 646152f792329be5db8e38961350589e97e8f2823acdGreg Clayton//CXXRecordDecl * 646252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//ClangASTType::GetAsCXXRecordDecl (lldb::clang_type_t opaque_clang_qual_type) 646352f792329be5db8e38961350589e97e8f2823acdGreg Clayton//{ 646452f792329be5db8e38961350589e97e8f2823acdGreg Clayton// if (opaque_clang_qual_type) 646552f792329be5db8e38961350589e97e8f2823acdGreg Clayton// return QualType::getFromOpaquePtr(opaque_clang_qual_type)->getAsCXXRecordDecl(); 646652f792329be5db8e38961350589e97e8f2823acdGreg Clayton// return NULL; 646752f792329be5db8e38961350589e97e8f2823acdGreg Clayton//} 64680fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton 64690fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonbool 64700fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonlldb_private::operator == (const lldb_private::ClangASTType &lhs, const lldb_private::ClangASTType &rhs) 64710fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton{ 64720fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton return lhs.GetASTContext() == rhs.GetASTContext() && lhs.GetOpaqueQualType() == rhs.GetOpaqueQualType(); 64730fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton} 64740fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton 64750fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton 64760fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonbool 64770fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonlldb_private::operator != (const lldb_private::ClangASTType &lhs, const lldb_private::ClangASTType &rhs) 64780fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton{ 64790fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton return lhs.GetASTContext() != rhs.GetASTContext() || lhs.GetOpaqueQualType() != rhs.GetOpaqueQualType(); 64800fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton} 64810b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton 64820b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton 6483