1 //===-- ClangASTType.cpp ----------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/lldb-python.h"
12 #include "lldb/Symbol/ClangASTType.h"
14 #include "clang/AST/ASTConsumer.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/Attr.h"
17 #include "clang/AST/CXXInheritance.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclCXX.h"
20 #include "clang/AST/DeclObjC.h"
21 #include "clang/AST/DeclGroup.h"
22 #include "clang/AST/DeclTemplate.h"
23 #include "clang/AST/RecordLayout.h"
24 #include "clang/AST/Type.h"
26 #include "clang/Basic/Builtins.h"
27 #include "clang/Basic/IdentifierTable.h"
28 #include "clang/Basic/LangOptions.h"
29 #include "clang/Basic/SourceManager.h"
30 #include "clang/Basic/TargetInfo.h"
32 #include "llvm/Support/FormattedStream.h"
33 #include "llvm/Support/raw_ostream.h"
35 #include "lldb/Core/ConstString.h"
36 #include "lldb/Core/DataBufferHeap.h"
37 #include "lldb/Core/DataExtractor.h"
38 #include "lldb/Core/Debugger.h"
39 #include "lldb/Core/Scalar.h"
40 #include "lldb/Core/Stream.h"
41 #include "lldb/Core/StreamFile.h"
42 #include "lldb/Core/StreamString.h"
43 #include "lldb/Symbol/ClangASTContext.h"
44 #include "lldb/Symbol/ClangExternalASTSourceCommon.h"
45 #include "lldb/Symbol/VerifyDecl.h"
46 #include "lldb/Target/ExecutionContext.h"
47 #include "lldb/Target/Process.h"
52 using namespace lldb_private;
53 using namespace clang;
57 GetCompleteQualType (ASTContext *ast, QualType qual_type, bool allow_completion = true)
59 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
62 case clang::Type::ConstantArray:
63 case clang::Type::IncompleteArray:
64 case clang::Type::VariableArray:
66 const ArrayType *array_type = dyn_cast<ArrayType>(qual_type.getTypePtr());
69 return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
73 case clang::Type::Record:
74 case clang::Type::Enum:
76 const TagType *tag_type = dyn_cast<TagType>(qual_type.getTypePtr());
79 TagDecl *tag_decl = tag_type->getDecl();
82 if (tag_decl->isCompleteDefinition())
85 if (!allow_completion)
88 if (tag_decl->hasExternalLexicalStorage())
92 ExternalASTSource *external_ast_source = ast->getExternalSource();
93 if (external_ast_source)
95 external_ast_source->CompleteType(tag_decl);
96 return !tag_type->isIncompleteType();
107 case clang::Type::ObjCObject:
108 case clang::Type::ObjCInterface:
110 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
113 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
114 // We currently can't complete objective C types through the newly added ASTContext
115 // because it only supports TagDecl objects right now...
116 if (class_interface_decl)
118 if (class_interface_decl->getDefinition())
121 if (!allow_completion)
124 if (class_interface_decl->hasExternalLexicalStorage())
128 ExternalASTSource *external_ast_source = ast->getExternalSource();
129 if (external_ast_source)
131 external_ast_source->CompleteType (class_interface_decl);
132 return !objc_class_type->isIncompleteType();
142 case clang::Type::Typedef:
143 return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
145 case clang::Type::Elaborated:
146 return GetCompleteQualType (ast, cast<ElaboratedType>(qual_type)->getNamedType(), allow_completion);
148 case clang::Type::Paren:
149 return GetCompleteQualType (ast, cast<ParenType>(qual_type)->desugar(), allow_completion);
158 static ObjCIvarDecl::AccessControl
159 ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
163 case eAccessNone: return ObjCIvarDecl::None;
164 case eAccessPublic: return ObjCIvarDecl::Public;
165 case eAccessPrivate: return ObjCIvarDecl::Private;
166 case eAccessProtected: return ObjCIvarDecl::Protected;
167 case eAccessPackage: return ObjCIvarDecl::Package;
169 return ObjCIvarDecl::None;
172 //----------------------------------------------------------------------
174 //----------------------------------------------------------------------
176 ClangASTType::ClangASTType (clang::ASTContext *ast,
177 clang::QualType qual_type) :
178 m_type (qual_type.getAsOpaquePtr()),
183 ClangASTType::~ClangASTType()
187 //----------------------------------------------------------------------
189 //----------------------------------------------------------------------
192 ClangASTType::IsAggregateType () const
197 QualType qual_type (GetCanonicalQualType());
199 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
202 case clang::Type::IncompleteArray:
203 case clang::Type::VariableArray:
204 case clang::Type::ConstantArray:
205 case clang::Type::ExtVector:
206 case clang::Type::Vector:
207 case clang::Type::Record:
208 case clang::Type::ObjCObject:
209 case clang::Type::ObjCInterface:
211 case clang::Type::Elaborated:
212 return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsAggregateType();
213 case clang::Type::Typedef:
214 return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsAggregateType();
215 case clang::Type::Paren:
216 return ClangASTType(m_ast, cast<ParenType>(qual_type)->desugar()).IsAggregateType();
220 // The clang type does have a value
225 ClangASTType::IsArrayType (ClangASTType *element_type_ptr,
227 bool *is_incomplete) const
231 QualType qual_type (GetCanonicalQualType());
233 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
239 case clang::Type::ConstantArray:
240 if (element_type_ptr)
241 element_type_ptr->SetClangType (m_ast, cast<ConstantArrayType>(qual_type)->getElementType());
243 *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
246 case clang::Type::IncompleteArray:
247 if (element_type_ptr)
248 element_type_ptr->SetClangType (m_ast, cast<IncompleteArrayType>(qual_type)->getElementType());
252 *is_incomplete = true;
255 case clang::Type::VariableArray:
256 if (element_type_ptr)
257 element_type_ptr->SetClangType (m_ast, cast<VariableArrayType>(qual_type)->getElementType());
262 case clang::Type::DependentSizedArray:
263 if (element_type_ptr)
264 element_type_ptr->SetClangType (m_ast, cast<DependentSizedArrayType>(qual_type)->getElementType());
269 case clang::Type::Typedef:
270 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsArrayType (element_type_ptr,
273 case clang::Type::Elaborated:
274 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsArrayType (element_type_ptr,
277 case clang::Type::Paren:
278 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsArrayType (element_type_ptr,
283 if (element_type_ptr)
284 element_type_ptr->Clear();
288 *is_incomplete = false;
293 ClangASTType::IsRuntimeGeneratedType () const
298 clang::DeclContext* decl_ctx = GetDeclContextForType();
302 if (!llvm::isa<clang::ObjCInterfaceDecl>(decl_ctx))
305 clang::ObjCInterfaceDecl *result_iface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
307 ClangASTMetadata* ast_metadata = ClangASTContext::GetMetadata(m_ast, result_iface_decl);
310 return (ast_metadata->GetISAPtr() != 0);
314 ClangASTType::IsCharType () const
318 return GetQualType().getUnqualifiedType()->isCharType();
323 ClangASTType::IsCompleteType () const
327 const bool allow_completion = false;
328 return GetCompleteQualType (m_ast, GetQualType(), allow_completion);
332 ClangASTType::IsConst() const
334 return GetQualType().isConstQualified();
338 ClangASTType::IsCStringType (uint32_t &length) const
340 ClangASTType pointee_or_element_clang_type;
342 Flags type_flags (GetTypeInfo (&pointee_or_element_clang_type));
344 if (!pointee_or_element_clang_type.IsValid())
347 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
349 if (pointee_or_element_clang_type.IsCharType())
351 if (type_flags.Test (eTypeIsArray))
353 // We know the size of the array and it could be a C string
354 // since it is an array of characters
355 length = cast<ConstantArrayType>(GetCanonicalQualType().getTypePtr())->getSize().getLimitedValue();
365 ClangASTType::IsFunctionType (bool *is_variadic_ptr) const
369 QualType qual_type (GetCanonicalQualType());
371 if (qual_type->isFunctionType())
375 const clang::FunctionProtoType *function_proto_type = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
376 if (function_proto_type)
377 *is_variadic_ptr = function_proto_type->isVariadic();
379 *is_variadic_ptr = false;
384 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
389 case clang::Type::Typedef:
390 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsFunctionType();
391 case clang::Type::Elaborated:
392 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsFunctionType();
393 case clang::Type::Paren:
394 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsFunctionType();
396 case clang::Type::LValueReference:
397 case clang::Type::RValueReference:
399 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
401 return ClangASTType (m_ast, reference_type->getPointeeType()).IsFunctionType();
410 ClangASTType::GetNumberOfFunctionArguments () const
414 QualType qual_type (GetCanonicalQualType());
415 const FunctionProtoType* func = dyn_cast<FunctionProtoType>(qual_type.getTypePtr());
417 return func->getNumArgs();
423 ClangASTType::GetFunctionArgumentAtIndex (const size_t index)
427 QualType qual_type (GetCanonicalQualType());
428 const FunctionProtoType* func = dyn_cast<FunctionProtoType>(qual_type.getTypePtr());
431 if (index < func->getNumArgs())
432 return ClangASTType(m_ast, func->getArgType(index).getAsOpaquePtr());
435 return ClangASTType();
439 ClangASTType::IsFunctionPointerType () const
443 QualType qual_type (GetCanonicalQualType());
445 if (qual_type->isFunctionPointerType())
448 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
453 case clang::Type::Typedef:
454 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsFunctionPointerType();
455 case clang::Type::Elaborated:
456 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsFunctionPointerType();
457 case clang::Type::Paren:
458 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsFunctionPointerType();
460 case clang::Type::LValueReference:
461 case clang::Type::RValueReference:
463 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
465 return ClangASTType (m_ast, reference_type->getPointeeType()).IsFunctionPointerType();
475 ClangASTType::IsIntegerType (bool &is_signed) const
480 QualType qual_type (GetCanonicalQualType());
481 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
485 if (builtin_type->isInteger())
487 is_signed = builtin_type->isSignedInteger();
496 ClangASTType::IsPointerType (ClangASTType *pointee_type) const
500 QualType qual_type (GetCanonicalQualType());
501 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
504 case clang::Type::Builtin:
505 switch (cast<clang::BuiltinType>(qual_type)->getKind())
509 case clang::BuiltinType::ObjCId:
510 case clang::BuiltinType::ObjCClass:
514 case clang::Type::ObjCObjectPointer:
516 pointee_type->SetClangType (m_ast, cast<ObjCObjectPointerType>(qual_type)->getPointeeType());
518 case clang::Type::BlockPointer:
520 pointee_type->SetClangType (m_ast, cast<BlockPointerType>(qual_type)->getPointeeType());
522 case clang::Type::Pointer:
524 pointee_type->SetClangType (m_ast, cast<PointerType>(qual_type)->getPointeeType());
526 case clang::Type::MemberPointer:
528 pointee_type->SetClangType (m_ast, cast<MemberPointerType>(qual_type)->getPointeeType());
530 case clang::Type::Typedef:
531 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsPointerType(pointee_type);
532 case clang::Type::Elaborated:
533 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsPointerType(pointee_type);
534 case clang::Type::Paren:
535 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsPointerType(pointee_type);
541 pointee_type->Clear();
547 ClangASTType::IsPointerOrReferenceType (ClangASTType *pointee_type) const
551 QualType qual_type (GetCanonicalQualType());
552 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
555 case clang::Type::Builtin:
556 switch (cast<clang::BuiltinType>(qual_type)->getKind())
560 case clang::BuiltinType::ObjCId:
561 case clang::BuiltinType::ObjCClass:
565 case clang::Type::ObjCObjectPointer:
567 pointee_type->SetClangType(m_ast, cast<ObjCObjectPointerType>(qual_type)->getPointeeType());
569 case clang::Type::BlockPointer:
571 pointee_type->SetClangType(m_ast, cast<BlockPointerType>(qual_type)->getPointeeType());
573 case clang::Type::Pointer:
575 pointee_type->SetClangType(m_ast, cast<PointerType>(qual_type)->getPointeeType());
577 case clang::Type::MemberPointer:
579 pointee_type->SetClangType(m_ast, cast<MemberPointerType>(qual_type)->getPointeeType());
581 case clang::Type::LValueReference:
583 pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar());
585 case clang::Type::RValueReference:
587 pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar());
589 case clang::Type::Typedef:
590 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsPointerOrReferenceType(pointee_type);
591 case clang::Type::Elaborated:
592 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsPointerOrReferenceType(pointee_type);
593 case clang::Type::Paren:
594 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsPointerOrReferenceType(pointee_type);
600 pointee_type->Clear();
606 ClangASTType::IsReferenceType (ClangASTType *pointee_type) const
610 QualType qual_type (GetCanonicalQualType());
611 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
615 case clang::Type::LValueReference:
617 pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar());
619 case clang::Type::RValueReference:
621 pointee_type->SetClangType(m_ast, cast<LValueReferenceType>(qual_type)->desugar());
623 case clang::Type::Typedef:
624 return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsReferenceType(pointee_type);
625 case clang::Type::Elaborated:
626 return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).IsReferenceType(pointee_type);
627 case clang::Type::Paren:
628 return ClangASTType(m_ast, cast<clang::ParenType>(qual_type)->desugar()).IsReferenceType(pointee_type);
635 pointee_type->Clear();
640 ClangASTType::IsFloatingPointType (uint32_t &count, bool &is_complex) const
644 QualType qual_type (GetCanonicalQualType());
646 if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
648 clang::BuiltinType::Kind kind = BT->getKind();
649 if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
656 else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
658 if (ClangASTType (m_ast, CT->getElementType()).IsFloatingPointType (count, is_complex))
665 else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
667 if (ClangASTType (m_ast, VT->getElementType()).IsFloatingPointType (count, is_complex))
669 count = VT->getNumElements();
682 ClangASTType::IsDefined() const
687 QualType qual_type(GetQualType());
688 const TagType *tag_type = dyn_cast<TagType>(qual_type.getTypePtr());
691 TagDecl *tag_decl = tag_type->getDecl();
693 return tag_decl->isCompleteDefinition();
698 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type);
701 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
702 if (class_interface_decl)
703 return class_interface_decl->getDefinition() != NULL;
711 ClangASTType::IsObjCClassType () const
715 QualType qual_type (GetCanonicalQualType());
717 const ObjCObjectPointerType *obj_pointer_type = dyn_cast<ObjCObjectPointerType>(qual_type);
719 if (obj_pointer_type)
720 return obj_pointer_type->isObjCClassType();
726 ClangASTType::IsObjCObjectOrInterfaceType () const
729 return GetCanonicalQualType()->isObjCObjectOrInterfaceType();
734 ClangASTType::IsPolymorphicClass () const
738 QualType qual_type(GetCanonicalQualType());
739 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
742 case clang::Type::Record:
743 if (GetCompleteType())
745 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
746 const RecordDecl *record_decl = record_type->getDecl();
749 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
751 return cxx_record_decl->isPolymorphic();
764 ClangASTType::IsPossibleDynamicType (ClangASTType *dynamic_pointee_type,
765 bool check_cplusplus,
766 bool check_objc) const
768 QualType pointee_qual_type;
771 QualType qual_type (GetCanonicalQualType());
772 bool success = false;
773 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
776 case clang::Type::Builtin:
777 if (check_objc && cast<BuiltinType>(qual_type)->getKind() == BuiltinType::ObjCId)
779 if (dynamic_pointee_type)
780 dynamic_pointee_type->SetClangType(m_ast, m_type);
785 case clang::Type::ObjCObjectPointer:
788 if (dynamic_pointee_type)
789 dynamic_pointee_type->SetClangType(m_ast, cast<ObjCObjectPointerType>(qual_type)->getPointeeType());
794 case clang::Type::Pointer:
795 pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
799 case clang::Type::LValueReference:
800 case clang::Type::RValueReference:
801 pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
805 case clang::Type::Typedef:
806 return ClangASTType (m_ast,
807 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).IsPossibleDynamicType (dynamic_pointee_type,
811 case clang::Type::Elaborated:
812 return ClangASTType (m_ast,
813 cast<ElaboratedType>(qual_type)->getNamedType()).IsPossibleDynamicType (dynamic_pointee_type,
817 case clang::Type::Paren:
818 return ClangASTType (m_ast,
819 cast<ParenType>(qual_type)->desugar()).IsPossibleDynamicType (dynamic_pointee_type,
828 // Check to make sure what we are pointing too is a possible dynamic C++ type
829 // We currently accept any "void *" (in case we have a class that has been
830 // watered down to an opaque pointer) and virtual C++ classes.
831 const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
832 switch (pointee_type_class)
834 case clang::Type::Builtin:
835 switch (cast<BuiltinType>(pointee_qual_type)->getKind())
837 case BuiltinType::UnknownAny:
838 case BuiltinType::Void:
839 if (dynamic_pointee_type)
840 dynamic_pointee_type->SetClangType(m_ast, pointee_qual_type);
843 case BuiltinType::NullPtr:
844 case BuiltinType::Bool:
845 case BuiltinType::Char_U:
846 case BuiltinType::UChar:
847 case BuiltinType::WChar_U:
848 case BuiltinType::Char16:
849 case BuiltinType::Char32:
850 case BuiltinType::UShort:
851 case BuiltinType::UInt:
852 case BuiltinType::ULong:
853 case BuiltinType::ULongLong:
854 case BuiltinType::UInt128:
855 case BuiltinType::Char_S:
856 case BuiltinType::SChar:
857 case BuiltinType::WChar_S:
858 case BuiltinType::Short:
859 case BuiltinType::Int:
860 case BuiltinType::Long:
861 case BuiltinType::LongLong:
862 case BuiltinType::Int128:
863 case BuiltinType::Float:
864 case BuiltinType::Double:
865 case BuiltinType::LongDouble:
866 case BuiltinType::Dependent:
867 case BuiltinType::Overload:
868 case BuiltinType::ObjCId:
869 case BuiltinType::ObjCClass:
870 case BuiltinType::ObjCSel:
871 case BuiltinType::BoundMember:
872 case BuiltinType::Half:
873 case BuiltinType::ARCUnbridgedCast:
874 case BuiltinType::PseudoObject:
875 case BuiltinType::BuiltinFn:
876 case BuiltinType::OCLEvent:
877 case BuiltinType::OCLImage1d:
878 case BuiltinType::OCLImage1dArray:
879 case BuiltinType::OCLImage1dBuffer:
880 case BuiltinType::OCLImage2d:
881 case BuiltinType::OCLImage2dArray:
882 case BuiltinType::OCLImage3d:
883 case BuiltinType::OCLSampler:
888 case clang::Type::Record:
891 CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
894 bool is_complete = cxx_record_decl->isCompleteDefinition();
897 success = cxx_record_decl->isDynamicClass();
900 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (m_ast, cxx_record_decl);
902 success = metadata->GetIsDynamicCXXType();
905 is_complete = ClangASTType(m_ast, pointee_qual_type).GetCompleteType();
907 success = cxx_record_decl->isDynamicClass();
915 if (dynamic_pointee_type)
916 dynamic_pointee_type->SetClangType(m_ast, pointee_qual_type);
923 case clang::Type::ObjCObject:
924 case clang::Type::ObjCInterface:
927 if (dynamic_pointee_type)
928 dynamic_pointee_type->SetClangType(m_ast, pointee_qual_type);
938 if (dynamic_pointee_type)
939 dynamic_pointee_type->Clear();
945 ClangASTType::IsScalarType () const
950 return (GetTypeInfo (NULL) & eTypeIsScalar) != 0;
954 ClangASTType::IsTypedefType () const
958 return GetQualType()->getTypeClass() == clang::Type::Typedef;
962 ClangASTType::IsVoidType () const
966 return GetCanonicalQualType()->isVoidType();
970 ClangASTType::IsPointerToScalarType () const
975 return IsPointerType() && GetPointeeType().IsScalarType();
979 ClangASTType::IsArrayOfScalarType () const
981 ClangASTType element_type;
982 if (IsArrayType(&element_type, NULL, NULL))
983 return element_type.IsScalarType();
989 ClangASTType::GetCXXClassName (std::string &class_name) const
993 QualType qual_type (GetCanonicalQualType());
995 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
998 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
1008 ClangASTType::IsCXXClassType () const
1013 QualType qual_type (GetCanonicalQualType());
1014 if (qual_type->getAsCXXRecordDecl() != NULL)
1020 ClangASTType::IsBeingDefined () const
1024 QualType qual_type (GetCanonicalQualType());
1025 const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type);
1027 return tag_type->isBeingDefined();
1032 ClangASTType::IsObjCObjectPointerType (ClangASTType *class_type_ptr)
1037 QualType qual_type (GetCanonicalQualType());
1039 if (qual_type->isObjCObjectPointerType())
1043 if (!qual_type->isObjCClassType() &&
1044 !qual_type->isObjCIdType())
1046 const ObjCObjectPointerType *obj_pointer_type = dyn_cast<ObjCObjectPointerType>(qual_type);
1047 if (obj_pointer_type == NULL)
1048 class_type_ptr->Clear();
1050 class_type_ptr->SetClangType (m_ast, QualType(obj_pointer_type->getInterfaceType(), 0));
1056 class_type_ptr->Clear();
1061 ClangASTType::GetObjCClassName (std::string &class_name)
1066 QualType qual_type (GetCanonicalQualType());
1068 const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(qual_type);
1071 const ObjCInterfaceDecl *interface = object_type->getInterface();
1074 class_name = interface->getNameAsString();
1082 //----------------------------------------------------------------------
1084 //----------------------------------------------------------------------
1087 ClangASTType::GetCompleteType () const
1091 const bool allow_completion = true;
1092 return GetCompleteQualType (m_ast, GetQualType(), allow_completion);
1095 //----------------------------------------------------------------------
1096 // AST related queries
1097 //----------------------------------------------------------------------
1099 ClangASTType::GetPointerByteSize () const
1102 return m_ast->getTypeSize(m_ast->VoidPtrTy) / 8;
1107 ClangASTType::GetConstQualifiedTypeName () const
1109 return GetConstTypeName ();
1113 ClangASTType::GetConstTypeName () const
1117 ConstString type_name (GetTypeName());
1121 return ConstString("<invalid>");
1125 ClangASTType::GetTypeName () const
1127 std::string type_name;
1130 PrintingPolicy printing_policy (m_ast->getPrintingPolicy());
1131 QualType qual_type(GetQualType());
1132 printing_policy.SuppressTagKeyword = true;
1133 printing_policy.LangOpts.WChar = true;
1134 const TypedefType *typedef_type = qual_type->getAs<TypedefType>();
1137 const TypedefNameDecl *typedef_decl = typedef_type->getDecl();
1138 type_name = typedef_decl->getQualifiedNameAsString();
1142 type_name = qual_type.getAsString(printing_policy);
1145 return ConstString(type_name);
1150 ClangASTType::GetTypeInfo (ClangASTType *pointee_or_element_clang_type) const
1155 if (pointee_or_element_clang_type)
1156 pointee_or_element_clang_type->Clear();
1158 QualType qual_type (GetQualType());
1160 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1163 case clang::Type::Builtin:
1165 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
1167 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
1168 switch (builtin_type->getKind())
1170 case clang::BuiltinType::ObjCId:
1171 case clang::BuiltinType::ObjCClass:
1172 if (pointee_or_element_clang_type)
1173 pointee_or_element_clang_type->SetClangType(m_ast, m_ast->ObjCBuiltinClassTy);
1174 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
1177 case clang::BuiltinType::ObjCSel:
1178 if (pointee_or_element_clang_type)
1179 pointee_or_element_clang_type->SetClangType(m_ast, m_ast->CharTy);
1180 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
1183 case clang::BuiltinType::Bool:
1184 case clang::BuiltinType::Char_U:
1185 case clang::BuiltinType::UChar:
1186 case clang::BuiltinType::WChar_U:
1187 case clang::BuiltinType::Char16:
1188 case clang::BuiltinType::Char32:
1189 case clang::BuiltinType::UShort:
1190 case clang::BuiltinType::UInt:
1191 case clang::BuiltinType::ULong:
1192 case clang::BuiltinType::ULongLong:
1193 case clang::BuiltinType::UInt128:
1194 case clang::BuiltinType::Char_S:
1195 case clang::BuiltinType::SChar:
1196 case clang::BuiltinType::WChar_S:
1197 case clang::BuiltinType::Short:
1198 case clang::BuiltinType::Int:
1199 case clang::BuiltinType::Long:
1200 case clang::BuiltinType::LongLong:
1201 case clang::BuiltinType::Int128:
1202 case clang::BuiltinType::Float:
1203 case clang::BuiltinType::Double:
1204 case clang::BuiltinType::LongDouble:
1205 builtin_type_flags |= eTypeIsScalar;
1206 if (builtin_type->isInteger())
1208 builtin_type_flags |= eTypeIsInteger;
1209 if (builtin_type->isSignedInteger())
1210 builtin_type_flags |= eTypeIsSigned;
1212 else if (builtin_type->isFloatingPoint())
1213 builtin_type_flags |= eTypeIsFloat;
1218 return builtin_type_flags;
1221 case clang::Type::BlockPointer:
1222 if (pointee_or_element_clang_type)
1223 pointee_or_element_clang_type->SetClangType(m_ast, qual_type->getPointeeType());
1224 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
1226 case clang::Type::Complex:
1228 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
1229 const ComplexType *complex_type = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal());
1232 QualType complex_element_type (complex_type->getElementType());
1233 if (complex_element_type->isIntegerType())
1234 complex_type_flags |= eTypeIsFloat;
1235 else if (complex_element_type->isFloatingType())
1236 complex_type_flags |= eTypeIsInteger;
1238 return complex_type_flags;
1242 case clang::Type::ConstantArray:
1243 case clang::Type::DependentSizedArray:
1244 case clang::Type::IncompleteArray:
1245 case clang::Type::VariableArray:
1246 if (pointee_or_element_clang_type)
1247 pointee_or_element_clang_type->SetClangType(m_ast, cast<ArrayType>(qual_type.getTypePtr())->getElementType());
1248 return eTypeHasChildren | eTypeIsArray;
1250 case clang::Type::DependentName: return 0;
1251 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
1252 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
1253 case clang::Type::Decltype: return 0;
1255 case clang::Type::Enum:
1256 if (pointee_or_element_clang_type)
1257 pointee_or_element_clang_type->SetClangType(m_ast, cast<EnumType>(qual_type)->getDecl()->getIntegerType());
1258 return eTypeIsEnumeration | eTypeHasValue;
1260 case clang::Type::Elaborated:
1261 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
1262 case clang::Type::Paren:
1263 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
1265 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
1266 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
1267 case clang::Type::InjectedClassName: return 0;
1269 case clang::Type::LValueReference:
1270 case clang::Type::RValueReference:
1271 if (pointee_or_element_clang_type)
1272 pointee_or_element_clang_type->SetClangType(m_ast, cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType());
1273 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
1275 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
1277 case clang::Type::ObjCObjectPointer:
1278 if (pointee_or_element_clang_type)
1279 pointee_or_element_clang_type->SetClangType(m_ast, qual_type->getPointeeType());
1280 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
1282 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
1283 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
1285 case clang::Type::Pointer:
1286 if (pointee_or_element_clang_type)
1287 pointee_or_element_clang_type->SetClangType(m_ast, qual_type->getPointeeType());
1288 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
1290 case clang::Type::Record:
1291 if (qual_type->getAsCXXRecordDecl())
1292 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
1294 return eTypeHasChildren | eTypeIsStructUnion;
1296 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
1297 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
1298 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
1300 case clang::Type::Typedef:
1301 return eTypeIsTypedef | ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetTypeInfo (pointee_or_element_clang_type);
1302 case clang::Type::TypeOfExpr: return 0;
1303 case clang::Type::TypeOf: return 0;
1304 case clang::Type::UnresolvedUsing: return 0;
1306 case clang::Type::ExtVector:
1307 case clang::Type::Vector:
1309 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
1310 const VectorType *vector_type = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal());
1313 if (vector_type->isIntegerType())
1314 vector_type_flags |= eTypeIsFloat;
1315 else if (vector_type->isFloatingType())
1316 vector_type_flags |= eTypeIsInteger;
1318 return vector_type_flags;
1328 ClangASTType::GetMinimumLanguage ()
1331 return lldb::eLanguageTypeC;
1333 // If the type is a reference, then resolve it to what it refers to first:
1334 QualType qual_type (GetCanonicalQualType().getNonReferenceType());
1335 if (qual_type->isAnyPointerType())
1337 if (qual_type->isObjCObjectPointerType())
1338 return lldb::eLanguageTypeObjC;
1340 QualType pointee_type (qual_type->getPointeeType());
1341 if (pointee_type->getPointeeCXXRecordDecl() != NULL)
1342 return lldb::eLanguageTypeC_plus_plus;
1343 if (pointee_type->isObjCObjectOrInterfaceType())
1344 return lldb::eLanguageTypeObjC;
1345 if (pointee_type->isObjCClassType())
1346 return lldb::eLanguageTypeObjC;
1347 if (pointee_type.getTypePtr() == m_ast->ObjCBuiltinIdTy.getTypePtr())
1348 return lldb::eLanguageTypeObjC;
1352 if (qual_type->isObjCObjectOrInterfaceType())
1353 return lldb::eLanguageTypeObjC;
1354 if (qual_type->getAsCXXRecordDecl())
1355 return lldb::eLanguageTypeC_plus_plus;
1356 switch (qual_type->getTypeClass())
1360 case clang::Type::Builtin:
1361 switch (cast<BuiltinType>(qual_type)->getKind())
1364 case BuiltinType::Void:
1365 case BuiltinType::Bool:
1366 case BuiltinType::Char_U:
1367 case BuiltinType::UChar:
1368 case BuiltinType::WChar_U:
1369 case BuiltinType::Char16:
1370 case BuiltinType::Char32:
1371 case BuiltinType::UShort:
1372 case BuiltinType::UInt:
1373 case BuiltinType::ULong:
1374 case BuiltinType::ULongLong:
1375 case BuiltinType::UInt128:
1376 case BuiltinType::Char_S:
1377 case BuiltinType::SChar:
1378 case BuiltinType::WChar_S:
1379 case BuiltinType::Short:
1380 case BuiltinType::Int:
1381 case BuiltinType::Long:
1382 case BuiltinType::LongLong:
1383 case BuiltinType::Int128:
1384 case BuiltinType::Float:
1385 case BuiltinType::Double:
1386 case BuiltinType::LongDouble:
1389 case BuiltinType::NullPtr:
1390 return eLanguageTypeC_plus_plus;
1392 case BuiltinType::ObjCId:
1393 case BuiltinType::ObjCClass:
1394 case BuiltinType::ObjCSel:
1395 return eLanguageTypeObjC;
1397 case BuiltinType::Dependent:
1398 case BuiltinType::Overload:
1399 case BuiltinType::BoundMember:
1400 case BuiltinType::UnknownAny:
1404 case clang::Type::Typedef:
1405 return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
1408 return lldb::eLanguageTypeC;
1412 ClangASTType::GetTypeClass () const
1415 return lldb::eTypeClassInvalid;
1417 QualType qual_type(GetQualType());
1419 switch (qual_type->getTypeClass())
1421 case clang::Type::UnaryTransform: break;
1422 case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
1423 case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
1424 case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
1425 case clang::Type::VariableArray: return lldb::eTypeClassArray;
1426 case clang::Type::ConstantArray: return lldb::eTypeClassArray;
1427 case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
1428 case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
1429 case clang::Type::ExtVector: return lldb::eTypeClassVector;
1430 case clang::Type::Vector: return lldb::eTypeClassVector;
1431 case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
1432 case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
1433 case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
1434 case clang::Type::Pointer: return lldb::eTypeClassPointer;
1435 case clang::Type::LValueReference: return lldb::eTypeClassReference;
1436 case clang::Type::RValueReference: return lldb::eTypeClassReference;
1437 case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
1438 case clang::Type::Complex:
1439 if (qual_type->isComplexType())
1440 return lldb::eTypeClassComplexFloat;
1442 return lldb::eTypeClassComplexInteger;
1443 case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
1444 case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
1445 case clang::Type::Record:
1447 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
1448 const RecordDecl *record_decl = record_type->getDecl();
1449 if (record_decl->isUnion())
1450 return lldb::eTypeClassUnion;
1451 else if (record_decl->isStruct())
1452 return lldb::eTypeClassStruct;
1454 return lldb::eTypeClassClass;
1457 case clang::Type::Enum: return lldb::eTypeClassEnumeration;
1458 case clang::Type::Typedef: return lldb::eTypeClassTypedef;
1459 case clang::Type::UnresolvedUsing: break;
1460 case clang::Type::Paren:
1461 return ClangASTType(m_ast, cast<ParenType>(qual_type)->desugar()).GetTypeClass();
1462 case clang::Type::Elaborated:
1463 return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
1465 case clang::Type::Attributed: break;
1466 case clang::Type::TemplateTypeParm: break;
1467 case clang::Type::SubstTemplateTypeParm: break;
1468 case clang::Type::SubstTemplateTypeParmPack:break;
1469 case clang::Type::Auto: break;
1470 case clang::Type::InjectedClassName: break;
1471 case clang::Type::DependentName: break;
1472 case clang::Type::DependentTemplateSpecialization: break;
1473 case clang::Type::PackExpansion: break;
1475 case clang::Type::TypeOfExpr: break;
1476 case clang::Type::TypeOf: break;
1477 case clang::Type::Decltype: break;
1478 case clang::Type::TemplateSpecialization: break;
1479 case clang::Type::Atomic: break;
1481 // pointer type decayed from an array or function type.
1482 case clang::Type::Decayed: break;
1484 // We don't know hot to display this type...
1485 return lldb::eTypeClassOther;
1490 ClangASTType::SetClangType (clang::ASTContext *ast, clang::QualType qual_type)
1493 m_type = qual_type.getAsOpaquePtr();
1497 ClangASTType::GetTypeQualifiers() const
1500 return GetQualType().getQualifiers().getCVRQualifiers();
1504 //----------------------------------------------------------------------
1505 // Creating related types
1506 //----------------------------------------------------------------------
1509 ClangASTType::AddConstModifier () const
1513 QualType result(GetQualType());
1515 return ClangASTType (m_ast, result);
1517 return ClangASTType();
1521 ClangASTType::AddRestrictModifier () const
1525 QualType result(GetQualType());
1526 result.getQualifiers().setRestrict (true);
1527 return ClangASTType (m_ast, result);
1529 return ClangASTType();
1533 ClangASTType::AddVolatileModifier () const
1537 QualType result(GetQualType());
1538 result.getQualifiers().setVolatile (true);
1539 return ClangASTType (m_ast, result);
1541 return ClangASTType();
1545 ClangASTType::GetArrayElementType (uint64_t& stride) const
1549 QualType qual_type(GetCanonicalQualType());
1551 ClangASTType element_type (m_ast, qual_type.getTypePtr()->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
1553 // TODO: the real stride will be >= this value.. find the real one!
1554 stride = element_type.GetByteSize();
1556 return element_type;
1559 return ClangASTType();
1563 ClangASTType::GetCanonicalType () const
1566 return ClangASTType (m_ast, GetCanonicalQualType());
1567 return ClangASTType();
1571 GetFullyUnqualifiedType_Impl (ASTContext *ast, QualType qual_type)
1573 if (qual_type->isPointerType())
1574 qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
1576 qual_type = qual_type.getUnqualifiedType();
1577 qual_type.removeLocalConst();
1578 qual_type.removeLocalRestrict();
1579 qual_type.removeLocalVolatile();
1584 ClangASTType::GetFullyUnqualifiedType () const
1587 return ClangASTType(m_ast, GetFullyUnqualifiedType_Impl(m_ast, GetQualType()));
1588 return ClangASTType();
1593 ClangASTType::GetFunctionArgumentCount () const
1597 const FunctionProtoType* func = dyn_cast<FunctionProtoType>(GetCanonicalQualType());
1599 return func->getNumArgs();
1605 ClangASTType::GetFunctionArgumentTypeAtIndex (size_t idx)
1609 const FunctionProtoType* func = dyn_cast<FunctionProtoType>(GetCanonicalQualType());
1612 const uint32_t num_args = func->getNumArgs();
1614 return ClangASTType(m_ast, func->getArgType(idx));
1617 return ClangASTType();
1621 ClangASTType::GetFunctionReturnType () const
1625 QualType qual_type(GetCanonicalQualType());
1626 const FunctionProtoType* func = dyn_cast<FunctionProtoType>(qual_type.getTypePtr());
1628 return ClangASTType(m_ast, func->getResultType());
1630 return ClangASTType();
1635 ClangASTType::GetLValueReferenceType () const
1639 return ClangASTType(m_ast, m_ast->getLValueReferenceType(GetQualType()));
1641 return ClangASTType();
1645 ClangASTType::GetRValueReferenceType () const
1649 return ClangASTType(m_ast, m_ast->getRValueReferenceType(GetQualType()));
1651 return ClangASTType();
1655 ClangASTType::GetNonReferenceType () const
1658 return ClangASTType(m_ast, GetQualType().getNonReferenceType());
1659 return ClangASTType();
1663 ClangASTType::CreateTypedefType (const char *typedef_name,
1664 clang::DeclContext *decl_ctx) const
1666 if (IsValid() && typedef_name && typedef_name[0])
1668 QualType qual_type (GetQualType());
1669 if (decl_ctx == NULL)
1670 decl_ctx = m_ast->getTranslationUnitDecl();
1671 TypedefDecl *decl = TypedefDecl::Create (*m_ast,
1675 &m_ast->Idents.get(typedef_name),
1676 m_ast->getTrivialTypeSourceInfo(qual_type));
1678 decl->setAccess(AS_public); // TODO respect proper access specifier
1680 // Get a uniqued QualType for the typedef decl type
1681 return ClangASTType (m_ast, m_ast->getTypedefType (decl));
1683 return ClangASTType();
1688 ClangASTType::GetPointeeType () const
1692 QualType qual_type(GetQualType());
1693 return ClangASTType (m_ast, qual_type.getTypePtr()->getPointeeType());
1695 return ClangASTType();
1699 ClangASTType::GetPointerType () const
1703 QualType qual_type (GetQualType());
1705 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
1708 case clang::Type::ObjCObject:
1709 case clang::Type::ObjCInterface:
1710 return ClangASTType(m_ast, m_ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr());
1713 return ClangASTType(m_ast, m_ast->getPointerType(qual_type).getAsOpaquePtr());
1716 return ClangASTType();
1720 ClangASTType::GetTypedefedType () const
1724 const TypedefType *typedef_type = dyn_cast<TypedefType>(GetQualType());
1726 return ClangASTType (m_ast, typedef_type->getDecl()->getUnderlyingType());
1728 return ClangASTType();
1732 ClangASTType::RemoveFastQualifiers () const
1736 QualType qual_type(GetQualType());
1737 qual_type.getQualifiers().removeFastQualifiers();
1738 return ClangASTType (m_ast, qual_type);
1740 return ClangASTType();
1744 //----------------------------------------------------------------------
1745 // Create related types using the current type's AST
1746 //----------------------------------------------------------------------
1749 ClangASTType::GetBasicTypeFromAST (lldb::BasicType basic_type) const
1752 return ClangASTContext::GetBasicType(m_ast, basic_type);
1753 return ClangASTType();
1755 //----------------------------------------------------------------------
1756 // Exploring the type
1757 //----------------------------------------------------------------------
1760 ClangASTType::GetBitSize () const
1762 if (GetCompleteType ())
1764 QualType qual_type(GetCanonicalQualType());
1765 const uint32_t bit_size = m_ast->getTypeSize (qual_type);
1768 if (qual_type->isIncompleteArrayType())
1769 return m_ast->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
1771 if (qual_type->isObjCObjectOrInterfaceType())
1772 return bit_size + m_ast->getTypeSize(m_ast->ObjCBuiltinClassTy);
1779 ClangASTType::GetByteSize () const
1781 return (GetBitSize () + 7) / 8;
1785 ClangASTType::GetTypeBitAlign () const
1787 if (GetCompleteType ())
1788 return m_ast->getTypeAlign(GetQualType());
1794 ClangASTType::GetEncoding (uint64_t &count) const
1797 return lldb::eEncodingInvalid;
1800 QualType qual_type(GetCanonicalQualType());
1802 switch (qual_type->getTypeClass())
1804 case clang::Type::UnaryTransform:
1807 case clang::Type::FunctionNoProto:
1808 case clang::Type::FunctionProto:
1811 case clang::Type::IncompleteArray:
1812 case clang::Type::VariableArray:
1815 case clang::Type::ConstantArray:
1818 case clang::Type::ExtVector:
1819 case clang::Type::Vector:
1820 // TODO: Set this to more than one???
1823 case clang::Type::Builtin:
1824 switch (cast<BuiltinType>(qual_type)->getKind())
1826 default: assert(0 && "Unknown builtin type!");
1827 case BuiltinType::Void:
1830 case BuiltinType::Bool:
1831 case BuiltinType::Char_S:
1832 case BuiltinType::SChar:
1833 case BuiltinType::WChar_S:
1834 case BuiltinType::Char16:
1835 case BuiltinType::Char32:
1836 case BuiltinType::Short:
1837 case BuiltinType::Int:
1838 case BuiltinType::Long:
1839 case BuiltinType::LongLong:
1840 case BuiltinType::Int128: return lldb::eEncodingSint;
1842 case BuiltinType::Char_U:
1843 case BuiltinType::UChar:
1844 case BuiltinType::WChar_U:
1845 case BuiltinType::UShort:
1846 case BuiltinType::UInt:
1847 case BuiltinType::ULong:
1848 case BuiltinType::ULongLong:
1849 case BuiltinType::UInt128: return lldb::eEncodingUint;
1851 case BuiltinType::Float:
1852 case BuiltinType::Double:
1853 case BuiltinType::LongDouble: return lldb::eEncodingIEEE754;
1855 case BuiltinType::ObjCClass:
1856 case BuiltinType::ObjCId:
1857 case BuiltinType::ObjCSel: return lldb::eEncodingUint;
1859 case BuiltinType::NullPtr: return lldb::eEncodingUint;
1862 // All pointer types are represented as unsigned integer encodings.
1863 // We may nee to add a eEncodingPointer if we ever need to know the
1865 case clang::Type::ObjCObjectPointer:
1866 case clang::Type::BlockPointer:
1867 case clang::Type::Pointer:
1868 case clang::Type::LValueReference:
1869 case clang::Type::RValueReference:
1870 case clang::Type::MemberPointer: return lldb::eEncodingUint;
1871 case clang::Type::Complex:
1873 lldb::Encoding encoding = lldb::eEncodingIEEE754;
1874 if (qual_type->isComplexType())
1875 encoding = lldb::eEncodingIEEE754;
1878 const ComplexType *complex_type = qual_type->getAsComplexIntegerType();
1880 encoding = ClangASTType(m_ast, complex_type->getElementType()).GetEncoding(count);
1882 encoding = lldb::eEncodingSint;
1888 case clang::Type::ObjCInterface: break;
1889 case clang::Type::Record: break;
1890 case clang::Type::Enum: return lldb::eEncodingSint;
1891 case clang::Type::Typedef:
1892 return ClangASTType(m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
1894 case clang::Type::Elaborated:
1895 return ClangASTType(m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
1897 case clang::Type::Paren:
1898 return ClangASTType(m_ast, cast<ParenType>(qual_type)->desugar()).GetEncoding(count);
1900 case clang::Type::DependentSizedArray:
1901 case clang::Type::DependentSizedExtVector:
1902 case clang::Type::UnresolvedUsing:
1903 case clang::Type::Attributed:
1904 case clang::Type::TemplateTypeParm:
1905 case clang::Type::SubstTemplateTypeParm:
1906 case clang::Type::SubstTemplateTypeParmPack:
1907 case clang::Type::Auto:
1908 case clang::Type::InjectedClassName:
1909 case clang::Type::DependentName:
1910 case clang::Type::DependentTemplateSpecialization:
1911 case clang::Type::PackExpansion:
1912 case clang::Type::ObjCObject:
1914 case clang::Type::TypeOfExpr:
1915 case clang::Type::TypeOf:
1916 case clang::Type::Decltype:
1917 case clang::Type::TemplateSpecialization:
1918 case clang::Type::Atomic:
1921 // pointer type decayed from an array or function type.
1922 case clang::Type::Decayed:
1926 return lldb::eEncodingInvalid;
1930 ClangASTType::GetFormat () const
1933 return lldb::eFormatDefault;
1935 QualType qual_type(GetCanonicalQualType());
1937 switch (qual_type->getTypeClass())
1939 case clang::Type::UnaryTransform:
1942 case clang::Type::FunctionNoProto:
1943 case clang::Type::FunctionProto:
1946 case clang::Type::IncompleteArray:
1947 case clang::Type::VariableArray:
1950 case clang::Type::ConstantArray:
1951 return lldb::eFormatVoid; // no value
1953 case clang::Type::ExtVector:
1954 case clang::Type::Vector:
1957 case clang::Type::Builtin:
1958 switch (cast<BuiltinType>(qual_type)->getKind())
1960 //default: assert(0 && "Unknown builtin type!");
1961 case BuiltinType::UnknownAny:
1962 case BuiltinType::Void:
1963 case BuiltinType::BoundMember:
1966 case BuiltinType::Bool: return lldb::eFormatBoolean;
1967 case BuiltinType::Char_S:
1968 case BuiltinType::SChar:
1969 case BuiltinType::WChar_S:
1970 case BuiltinType::Char_U:
1971 case BuiltinType::UChar:
1972 case BuiltinType::WChar_U: return lldb::eFormatChar;
1973 case BuiltinType::Char16: return lldb::eFormatUnicode16;
1974 case BuiltinType::Char32: return lldb::eFormatUnicode32;
1975 case BuiltinType::UShort: return lldb::eFormatUnsigned;
1976 case BuiltinType::Short: return lldb::eFormatDecimal;
1977 case BuiltinType::UInt: return lldb::eFormatUnsigned;
1978 case BuiltinType::Int: return lldb::eFormatDecimal;
1979 case BuiltinType::ULong: return lldb::eFormatUnsigned;
1980 case BuiltinType::Long: return lldb::eFormatDecimal;
1981 case BuiltinType::ULongLong: return lldb::eFormatUnsigned;
1982 case BuiltinType::LongLong: return lldb::eFormatDecimal;
1983 case BuiltinType::UInt128: return lldb::eFormatUnsigned;
1984 case BuiltinType::Int128: return lldb::eFormatDecimal;
1985 case BuiltinType::Float: return lldb::eFormatFloat;
1986 case BuiltinType::Double: return lldb::eFormatFloat;
1987 case BuiltinType::LongDouble: return lldb::eFormatFloat;
1988 case BuiltinType::NullPtr:
1989 case BuiltinType::Overload:
1990 case BuiltinType::Dependent:
1991 case BuiltinType::ObjCId:
1992 case BuiltinType::ObjCClass:
1993 case BuiltinType::ObjCSel:
1994 case BuiltinType::Half:
1995 case BuiltinType::ARCUnbridgedCast:
1996 case BuiltinType::PseudoObject:
1997 case BuiltinType::BuiltinFn:
1998 case BuiltinType::OCLEvent:
1999 case BuiltinType::OCLImage1d:
2000 case BuiltinType::OCLImage1dArray:
2001 case BuiltinType::OCLImage1dBuffer:
2002 case BuiltinType::OCLImage2d:
2003 case BuiltinType::OCLImage2dArray:
2004 case BuiltinType::OCLImage3d:
2005 case BuiltinType::OCLSampler:
2006 return lldb::eFormatHex;
2009 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
2010 case clang::Type::BlockPointer: return lldb::eFormatHex;
2011 case clang::Type::Pointer: return lldb::eFormatHex;
2012 case clang::Type::LValueReference:
2013 case clang::Type::RValueReference: return lldb::eFormatHex;
2014 case clang::Type::MemberPointer: break;
2015 case clang::Type::Complex:
2017 if (qual_type->isComplexType())
2018 return lldb::eFormatComplex;
2020 return lldb::eFormatComplexInteger;
2022 case clang::Type::ObjCInterface: break;
2023 case clang::Type::Record: break;
2024 case clang::Type::Enum: return lldb::eFormatEnum;
2025 case clang::Type::Typedef:
2026 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
2027 case clang::Type::Auto:
2028 return ClangASTType (m_ast, cast<AutoType>(qual_type)->desugar()).GetFormat();
2029 case clang::Type::Paren:
2030 return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetFormat();
2031 case clang::Type::Elaborated:
2032 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetFormat();
2033 case clang::Type::DependentSizedArray:
2034 case clang::Type::DependentSizedExtVector:
2035 case clang::Type::UnresolvedUsing:
2036 case clang::Type::Attributed:
2037 case clang::Type::TemplateTypeParm:
2038 case clang::Type::SubstTemplateTypeParm:
2039 case clang::Type::SubstTemplateTypeParmPack:
2040 case clang::Type::InjectedClassName:
2041 case clang::Type::DependentName:
2042 case clang::Type::DependentTemplateSpecialization:
2043 case clang::Type::PackExpansion:
2044 case clang::Type::ObjCObject:
2046 case clang::Type::TypeOfExpr:
2047 case clang::Type::TypeOf:
2048 case clang::Type::Decltype:
2049 case clang::Type::TemplateSpecialization:
2050 case clang::Type::Atomic:
2053 // pointer type decayed from an array or function type.
2054 case clang::Type::Decayed:
2057 // We don't know hot to display this type...
2058 return lldb::eFormatBytes;
2062 ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
2064 while (class_interface_decl)
2066 if (class_interface_decl->ivar_size() > 0)
2069 if (check_superclass)
2070 class_interface_decl = class_interface_decl->getSuperClass();
2078 ClangASTType::GetNumChildren (bool omit_empty_base_classes) const
2083 uint32_t num_children = 0;
2084 QualType qual_type(GetQualType());
2085 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2088 case clang::Type::Builtin:
2089 switch (cast<BuiltinType>(qual_type)->getKind())
2091 case BuiltinType::ObjCId: // child is Class
2092 case BuiltinType::ObjCClass: // child is Class
2101 case clang::Type::Complex: return 0;
2103 case clang::Type::Record:
2104 if (GetCompleteQualType (m_ast, qual_type))
2106 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
2107 const RecordDecl *record_decl = record_type->getDecl();
2108 assert(record_decl);
2109 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
2110 if (cxx_record_decl)
2112 if (omit_empty_base_classes)
2114 // Check each base classes to see if it or any of its
2115 // base classes contain any fields. This can help
2116 // limit the noise in variable views by not having to
2117 // show base classes that contain no members.
2118 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2119 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2120 base_class != base_class_end;
2123 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2125 // Skip empty base classes
2126 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
2134 // Include all base classes
2135 num_children += cxx_record_decl->getNumBases();
2139 RecordDecl::field_iterator field, field_end;
2140 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
2145 case clang::Type::ObjCObject:
2146 case clang::Type::ObjCInterface:
2147 if (GetCompleteQualType (m_ast, qual_type))
2149 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
2150 assert (objc_class_type);
2151 if (objc_class_type)
2153 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2155 if (class_interface_decl)
2158 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
2159 if (superclass_interface_decl)
2161 if (omit_empty_base_classes)
2163 if (ObjCDeclHasIVars (superclass_interface_decl, true))
2170 num_children += class_interface_decl->ivar_size();
2176 case clang::Type::ObjCObjectPointer:
2178 const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
2179 QualType pointee_type = pointer_type->getPointeeType();
2180 uint32_t num_pointee_children = ClangASTType (m_ast,pointee_type).GetNumChildren (omit_empty_base_classes);
2181 // If this type points to a simple type, then it has 1 child
2182 if (num_pointee_children == 0)
2185 num_children = num_pointee_children;
2189 case clang::Type::Vector:
2190 case clang::Type::ExtVector:
2191 num_children = cast<VectorType>(qual_type.getTypePtr())->getNumElements();
2194 case clang::Type::ConstantArray:
2195 num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
2198 case clang::Type::Pointer:
2200 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
2201 QualType pointee_type (pointer_type->getPointeeType());
2202 uint32_t num_pointee_children = ClangASTType (m_ast,pointee_type).GetNumChildren (omit_empty_base_classes);
2203 if (num_pointee_children == 0)
2205 // We have a pointer to a pointee type that claims it has no children.
2206 // We will want to look at
2207 num_children = ClangASTType (m_ast, pointee_type).GetNumPointeeChildren();
2210 num_children = num_pointee_children;
2214 case clang::Type::LValueReference:
2215 case clang::Type::RValueReference:
2217 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
2218 QualType pointee_type = reference_type->getPointeeType();
2219 uint32_t num_pointee_children = ClangASTType (m_ast, pointee_type).GetNumChildren (omit_empty_base_classes);
2220 // If this type points to a simple type, then it has 1 child
2221 if (num_pointee_children == 0)
2224 num_children = num_pointee_children;
2229 case clang::Type::Typedef:
2230 num_children = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
2233 case clang::Type::Elaborated:
2234 num_children = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
2237 case clang::Type::Paren:
2238 num_children = ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
2243 return num_children;
2247 ClangASTType::GetBasicTypeEnumeration () const
2251 QualType qual_type(GetQualType());
2252 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2253 if (type_class == clang::Type::Builtin)
2255 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2257 case clang::BuiltinType::Void: return eBasicTypeVoid;
2258 case clang::BuiltinType::Bool: return eBasicTypeBool;
2259 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
2260 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
2261 case clang::BuiltinType::Char16: return eBasicTypeChar16;
2262 case clang::BuiltinType::Char32: return eBasicTypeChar32;
2263 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
2264 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
2265 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
2266 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
2267 case clang::BuiltinType::Short: return eBasicTypeShort;
2268 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
2269 case clang::BuiltinType::Int: return eBasicTypeInt;
2270 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
2271 case clang::BuiltinType::Long: return eBasicTypeLong;
2272 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
2273 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
2274 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
2275 case clang::BuiltinType::Int128: return eBasicTypeInt128;
2276 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
2278 case clang::BuiltinType::Half: return eBasicTypeHalf;
2279 case clang::BuiltinType::Float: return eBasicTypeFloat;
2280 case clang::BuiltinType::Double: return eBasicTypeDouble;
2281 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
2283 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
2284 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
2285 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
2286 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
2287 case clang::BuiltinType::Dependent:
2288 case clang::BuiltinType::Overload:
2289 case clang::BuiltinType::BoundMember:
2290 case clang::BuiltinType::PseudoObject:
2291 case clang::BuiltinType::UnknownAny:
2292 case clang::BuiltinType::BuiltinFn:
2293 case clang::BuiltinType::ARCUnbridgedCast:
2294 case clang::BuiltinType::OCLEvent:
2295 case clang::BuiltinType::OCLImage1d:
2296 case clang::BuiltinType::OCLImage1dArray:
2297 case clang::BuiltinType::OCLImage1dBuffer:
2298 case clang::BuiltinType::OCLImage2d:
2299 case clang::BuiltinType::OCLImage2dArray:
2300 case clang::BuiltinType::OCLImage3d:
2301 case clang::BuiltinType::OCLSampler:
2302 return eBasicTypeOther;
2306 return eBasicTypeInvalid;
2310 #pragma mark Aggregate Types
2313 ClangASTType::GetNumDirectBaseClasses () const
2319 QualType qual_type(GetCanonicalQualType());
2320 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2323 case clang::Type::Record:
2324 if (GetCompleteType())
2326 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2327 if (cxx_record_decl)
2328 count = cxx_record_decl->getNumBases();
2332 case clang::Type::ObjCObjectPointer:
2333 count = GetPointeeType().GetNumDirectBaseClasses();
2336 case clang::Type::ObjCObject:
2337 if (GetCompleteType())
2339 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
2340 if (objc_class_type)
2342 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2344 if (class_interface_decl && class_interface_decl->getSuperClass())
2349 case clang::Type::ObjCInterface:
2350 if (GetCompleteType())
2352 const ObjCInterfaceType *objc_interface_type = qual_type->getAs<ObjCInterfaceType>();
2353 if (objc_interface_type)
2355 ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
2357 if (class_interface_decl && class_interface_decl->getSuperClass())
2364 case clang::Type::Typedef:
2365 count = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumDirectBaseClasses ();
2368 case clang::Type::Elaborated:
2369 count = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumDirectBaseClasses ();
2372 case clang::Type::Paren:
2373 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumDirectBaseClasses ();
2382 ClangASTType::GetNumVirtualBaseClasses () const
2388 QualType qual_type(GetCanonicalQualType());
2389 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2392 case clang::Type::Record:
2393 if (GetCompleteType())
2395 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2396 if (cxx_record_decl)
2397 count = cxx_record_decl->getNumVBases();
2401 case clang::Type::Typedef:
2402 count = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumVirtualBaseClasses();
2405 case clang::Type::Elaborated:
2406 count = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumVirtualBaseClasses();
2409 case clang::Type::Paren:
2410 count = ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumVirtualBaseClasses();
2420 ClangASTType::GetNumFields () const
2426 QualType qual_type(GetCanonicalQualType());
2427 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2430 case clang::Type::Record:
2431 if (GetCompleteType())
2433 const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
2436 RecordDecl *record_decl = record_type->getDecl();
2439 uint32_t field_idx = 0;
2440 RecordDecl::field_iterator field, field_end;
2441 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
2449 case clang::Type::Typedef:
2450 count = ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
2453 case clang::Type::Elaborated:
2454 count = ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
2457 case clang::Type::Paren:
2458 count = ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
2461 case clang::Type::ObjCObjectPointer:
2462 if (GetCompleteType())
2464 const ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
2465 if (objc_class_type)
2467 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
2469 if (class_interface_decl)
2470 count = class_interface_decl->ivar_size();
2475 case clang::Type::ObjCObject:
2476 case clang::Type::ObjCInterface:
2477 if (GetCompleteType())
2479 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
2480 if (objc_class_type)
2482 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2484 if (class_interface_decl)
2485 count = class_interface_decl->ivar_size();
2497 ClangASTType::GetDirectBaseClassAtIndex (size_t idx, uint32_t *bit_offset_ptr) const
2500 return ClangASTType();
2502 QualType qual_type(GetCanonicalQualType());
2503 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2506 case clang::Type::Record:
2507 if (GetCompleteType())
2509 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2510 if (cxx_record_decl)
2512 uint32_t curr_idx = 0;
2513 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2514 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
2515 base_class != base_class_end;
2516 ++base_class, ++curr_idx)
2518 if (curr_idx == idx)
2522 const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(cxx_record_decl);
2523 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2524 if (base_class->isVirtual())
2525 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
2527 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
2529 return ClangASTType (m_ast, base_class->getType());
2536 case clang::Type::ObjCObjectPointer:
2537 return GetPointeeType().GetDirectBaseClassAtIndex(idx,bit_offset_ptr);
2539 case clang::Type::ObjCObject:
2540 if (idx == 0 && GetCompleteType())
2542 const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
2543 if (objc_class_type)
2545 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2547 if (class_interface_decl)
2549 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
2550 if (superclass_interface_decl)
2553 *bit_offset_ptr = 0;
2554 return ClangASTType (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl));
2560 case clang::Type::ObjCInterface:
2561 if (idx == 0 && GetCompleteType())
2563 const ObjCObjectType *objc_interface_type = qual_type->getAs<ObjCInterfaceType>();
2564 if (objc_interface_type)
2566 ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
2568 if (class_interface_decl)
2570 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
2571 if (superclass_interface_decl)
2574 *bit_offset_ptr = 0;
2575 return ClangASTType (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl));
2583 case clang::Type::Typedef:
2584 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetDirectBaseClassAtIndex (idx, bit_offset_ptr);
2586 case clang::Type::Elaborated:
2587 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetDirectBaseClassAtIndex (idx, bit_offset_ptr);
2589 case clang::Type::Paren:
2590 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetDirectBaseClassAtIndex (idx, bit_offset_ptr);
2595 return ClangASTType();
2599 ClangASTType::GetVirtualBaseClassAtIndex (size_t idx, uint32_t *bit_offset_ptr) const
2602 return ClangASTType();
2604 QualType qual_type(GetCanonicalQualType());
2605 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2608 case clang::Type::Record:
2609 if (GetCompleteType())
2611 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2612 if (cxx_record_decl)
2614 uint32_t curr_idx = 0;
2615 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
2616 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
2617 base_class != base_class_end;
2618 ++base_class, ++curr_idx)
2620 if (curr_idx == idx)
2624 const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(cxx_record_decl);
2625 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
2626 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
2629 return ClangASTType (m_ast, base_class->getType());
2636 case clang::Type::Typedef:
2637 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetVirtualBaseClassAtIndex (idx, bit_offset_ptr);
2639 case clang::Type::Elaborated:
2640 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetVirtualBaseClassAtIndex (idx, bit_offset_ptr);
2642 case clang::Type::Paren:
2643 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetVirtualBaseClassAtIndex (idx, bit_offset_ptr);
2648 return ClangASTType();
2652 GetObjCFieldAtIndex (clang::ASTContext *ast,
2653 ObjCInterfaceDecl *class_interface_decl,
2656 uint64_t *bit_offset_ptr,
2657 uint32_t *bitfield_bit_size_ptr,
2658 bool *is_bitfield_ptr)
2660 if (class_interface_decl)
2662 if (idx < (class_interface_decl->ivar_size()))
2664 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
2665 uint32_t ivar_idx = 0;
2667 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
2669 if (ivar_idx == idx)
2671 const ObjCIvarDecl* ivar_decl = *ivar_pos;
2673 QualType ivar_qual_type(ivar_decl->getType());
2675 name.assign(ivar_decl->getNameAsString());
2679 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
2680 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
2683 const bool is_bitfield = ivar_pos->isBitField();
2685 if (bitfield_bit_size_ptr)
2687 *bitfield_bit_size_ptr = 0;
2689 if (is_bitfield && ast)
2691 Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
2692 llvm::APSInt bitfield_apsint;
2693 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
2695 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
2699 if (is_bitfield_ptr)
2700 *is_bitfield_ptr = is_bitfield;
2702 return ivar_qual_type.getAsOpaquePtr();
2711 ClangASTType::GetFieldAtIndex (size_t idx,
2713 uint64_t *bit_offset_ptr,
2714 uint32_t *bitfield_bit_size_ptr,
2715 bool *is_bitfield_ptr) const
2718 return ClangASTType();
2720 QualType qual_type(GetCanonicalQualType());
2721 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2724 case clang::Type::Record:
2725 if (GetCompleteType())
2727 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
2728 const RecordDecl *record_decl = record_type->getDecl();
2729 uint32_t field_idx = 0;
2730 RecordDecl::field_iterator field, field_end;
2731 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
2733 if (idx == field_idx)
2735 // Print the member type if requested
2736 // Print the member name and equal sign
2737 name.assign(field->getNameAsString());
2739 // Figure out the type byte size (field_type_info.first) and
2740 // alignment (field_type_info.second) from the AST context.
2743 const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(record_decl);
2744 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
2747 const bool is_bitfield = field->isBitField();
2749 if (bitfield_bit_size_ptr)
2751 *bitfield_bit_size_ptr = 0;
2755 Expr *bitfield_bit_size_expr = field->getBitWidth();
2756 llvm::APSInt bitfield_apsint;
2757 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *m_ast))
2759 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
2763 if (is_bitfield_ptr)
2764 *is_bitfield_ptr = is_bitfield;
2766 return ClangASTType (m_ast, field->getType());
2772 case clang::Type::ObjCObjectPointer:
2773 if (GetCompleteType())
2775 const ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
2776 if (objc_class_type)
2778 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
2779 return ClangASTType (m_ast, GetObjCFieldAtIndex(m_ast, class_interface_decl, idx, name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr));
2784 case clang::Type::ObjCObject:
2785 case clang::Type::ObjCInterface:
2786 if (GetCompleteType())
2788 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
2789 assert (objc_class_type);
2790 if (objc_class_type)
2792 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2793 return ClangASTType (m_ast, GetObjCFieldAtIndex(m_ast, class_interface_decl, idx, name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr));
2799 case clang::Type::Typedef:
2800 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
2801 GetFieldAtIndex (idx,
2804 bitfield_bit_size_ptr,
2807 case clang::Type::Elaborated:
2808 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).
2809 GetFieldAtIndex (idx,
2812 bitfield_bit_size_ptr,
2815 case clang::Type::Paren:
2816 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).
2817 GetFieldAtIndex (idx,
2820 bitfield_bit_size_ptr,
2826 return ClangASTType();
2830 ClangASTType::GetIndexOfFieldWithName (const char* name,
2831 ClangASTType* field_clang_type_ptr,
2832 uint64_t *bit_offset_ptr,
2833 uint32_t *bitfield_bit_size_ptr,
2834 bool *is_bitfield_ptr) const
2836 unsigned count = GetNumFields();
2837 std::string field_name;
2838 for (unsigned index = 0; index < count; index++)
2840 ClangASTType field_clang_type (GetFieldAtIndex(index, field_name, bit_offset_ptr, bitfield_bit_size_ptr, is_bitfield_ptr));
2841 if (strcmp(field_name.c_str(), name) == 0)
2843 if (field_clang_type_ptr)
2844 *field_clang_type_ptr = field_clang_type;
2851 // If a pointer to a pointee type (the clang_type arg) says that it has no
2852 // children, then we either need to trust it, or override it and return a
2853 // different result. For example, an "int *" has one child that is an integer,
2854 // but a function pointer doesn't have any children. Likewise if a Record type
2855 // claims it has no children, then there really is nothing to show.
2857 ClangASTType::GetNumPointeeChildren () const
2862 QualType qual_type(GetCanonicalQualType());
2863 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2866 case clang::Type::Builtin:
2867 switch (cast<clang::BuiltinType>(qual_type)->getKind())
2869 case clang::BuiltinType::UnknownAny:
2870 case clang::BuiltinType::Void:
2871 case clang::BuiltinType::NullPtr:
2872 case clang::BuiltinType::OCLEvent:
2873 case clang::BuiltinType::OCLImage1d:
2874 case clang::BuiltinType::OCLImage1dArray:
2875 case clang::BuiltinType::OCLImage1dBuffer:
2876 case clang::BuiltinType::OCLImage2d:
2877 case clang::BuiltinType::OCLImage2dArray:
2878 case clang::BuiltinType::OCLImage3d:
2879 case clang::BuiltinType::OCLSampler:
2881 case clang::BuiltinType::Bool:
2882 case clang::BuiltinType::Char_U:
2883 case clang::BuiltinType::UChar:
2884 case clang::BuiltinType::WChar_U:
2885 case clang::BuiltinType::Char16:
2886 case clang::BuiltinType::Char32:
2887 case clang::BuiltinType::UShort:
2888 case clang::BuiltinType::UInt:
2889 case clang::BuiltinType::ULong:
2890 case clang::BuiltinType::ULongLong:
2891 case clang::BuiltinType::UInt128:
2892 case clang::BuiltinType::Char_S:
2893 case clang::BuiltinType::SChar:
2894 case clang::BuiltinType::WChar_S:
2895 case clang::BuiltinType::Short:
2896 case clang::BuiltinType::Int:
2897 case clang::BuiltinType::Long:
2898 case clang::BuiltinType::LongLong:
2899 case clang::BuiltinType::Int128:
2900 case clang::BuiltinType::Float:
2901 case clang::BuiltinType::Double:
2902 case clang::BuiltinType::LongDouble:
2903 case clang::BuiltinType::Dependent:
2904 case clang::BuiltinType::Overload:
2905 case clang::BuiltinType::ObjCId:
2906 case clang::BuiltinType::ObjCClass:
2907 case clang::BuiltinType::ObjCSel:
2908 case clang::BuiltinType::BoundMember:
2909 case clang::BuiltinType::Half:
2910 case clang::BuiltinType::ARCUnbridgedCast:
2911 case clang::BuiltinType::PseudoObject:
2912 case clang::BuiltinType::BuiltinFn:
2917 case clang::Type::Complex: return 1;
2918 case clang::Type::Pointer: return 1;
2919 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
2920 case clang::Type::LValueReference: return 1;
2921 case clang::Type::RValueReference: return 1;
2922 case clang::Type::MemberPointer: return 0;
2923 case clang::Type::ConstantArray: return 0;
2924 case clang::Type::IncompleteArray: return 0;
2925 case clang::Type::VariableArray: return 0;
2926 case clang::Type::DependentSizedArray: return 0;
2927 case clang::Type::DependentSizedExtVector: return 0;
2928 case clang::Type::Vector: return 0;
2929 case clang::Type::ExtVector: return 0;
2930 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
2931 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
2932 case clang::Type::UnresolvedUsing: return 0;
2933 case clang::Type::Paren: return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetNumPointeeChildren ();
2934 case clang::Type::Typedef: return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumPointeeChildren ();
2935 case clang::Type::Elaborated: return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumPointeeChildren ();
2936 case clang::Type::TypeOfExpr: return 0;
2937 case clang::Type::TypeOf: return 0;
2938 case clang::Type::Decltype: return 0;
2939 case clang::Type::Record: return 0;
2940 case clang::Type::Enum: return 1;
2941 case clang::Type::TemplateTypeParm: return 1;
2942 case clang::Type::SubstTemplateTypeParm: return 1;
2943 case clang::Type::TemplateSpecialization: return 1;
2944 case clang::Type::InjectedClassName: return 0;
2945 case clang::Type::DependentName: return 1;
2946 case clang::Type::DependentTemplateSpecialization: return 1;
2947 case clang::Type::ObjCObject: return 0;
2948 case clang::Type::ObjCInterface: return 0;
2949 case clang::Type::ObjCObjectPointer: return 1;
2958 ClangASTType::GetChildClangTypeAtIndex (ExecutionContext *exe_ctx,
2959 const char *parent_name,
2961 bool transparent_pointers,
2962 bool omit_empty_base_classes,
2963 bool ignore_array_bounds,
2964 std::string& child_name,
2965 uint32_t &child_byte_size,
2966 int32_t &child_byte_offset,
2967 uint32_t &child_bitfield_bit_size,
2968 uint32_t &child_bitfield_bit_offset,
2969 bool &child_is_base_class,
2970 bool &child_is_deref_of_parent) const
2973 return ClangASTType();
2975 QualType parent_qual_type(GetCanonicalQualType());
2976 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
2977 child_bitfield_bit_size = 0;
2978 child_bitfield_bit_offset = 0;
2979 child_is_base_class = false;
2981 const bool idx_is_valid = idx < GetNumChildren (omit_empty_base_classes);
2982 uint32_t bit_offset;
2983 switch (parent_type_class)
2985 case clang::Type::Builtin:
2988 switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
2990 case clang::BuiltinType::ObjCId:
2991 case clang::BuiltinType::ObjCClass:
2993 child_byte_size = m_ast->getTypeSize(m_ast->ObjCBuiltinClassTy) / CHAR_BIT;
2994 return ClangASTType (m_ast, m_ast->ObjCBuiltinClassTy);
3002 case clang::Type::Record:
3003 if (idx_is_valid && GetCompleteType())
3005 const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
3006 const RecordDecl *record_decl = record_type->getDecl();
3007 assert(record_decl);
3008 const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(record_decl);
3009 uint32_t child_idx = 0;
3011 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3012 if (cxx_record_decl)
3014 // We might have base classes to print out first
3015 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3016 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3017 base_class != base_class_end;
3020 const CXXRecordDecl *base_class_decl = NULL;
3022 // Skip empty base classes
3023 if (omit_empty_base_classes)
3025 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3026 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
3030 if (idx == child_idx)
3032 if (base_class_decl == NULL)
3033 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3036 if (base_class->isVirtual())
3037 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
3039 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
3041 // Base classes should be a multiple of 8 bits in size
3042 child_byte_offset = bit_offset/8;
3043 ClangASTType base_class_clang_type(m_ast, base_class->getType());
3044 child_name = base_class_clang_type.GetTypeName().AsCString("");
3045 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize();
3047 // Base classes bit sizes should be a multiple of 8 bits in size
3048 assert (base_class_clang_type_bit_size % 8 == 0);
3049 child_byte_size = base_class_clang_type_bit_size / 8;
3050 child_is_base_class = true;
3051 return base_class_clang_type;
3053 // We don't increment the child index in the for loop since we might
3054 // be skipping empty base classes
3058 // Make sure index is in range...
3059 uint32_t field_idx = 0;
3060 RecordDecl::field_iterator field, field_end;
3061 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
3063 if (idx == child_idx)
3065 // Print the member type if requested
3066 // Print the member name and equal sign
3067 child_name.assign(field->getNameAsString().c_str());
3069 // Figure out the type byte size (field_type_info.first) and
3070 // alignment (field_type_info.second) from the AST context.
3071 ClangASTType field_clang_type (m_ast, field->getType());
3072 assert(field_idx < record_layout.getFieldCount());
3073 child_byte_size = field_clang_type.GetByteSize();
3075 // Figure out the field offset within the current struct/union/class type
3076 bit_offset = record_layout.getFieldOffset (field_idx);
3077 child_byte_offset = bit_offset / 8;
3078 if (ClangASTContext::FieldIsBitfield (m_ast, *field, child_bitfield_bit_size))
3079 child_bitfield_bit_offset = bit_offset % 8;
3081 return field_clang_type;
3087 case clang::Type::ObjCObject:
3088 case clang::Type::ObjCInterface:
3089 if (idx_is_valid && GetCompleteType())
3091 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
3092 assert (objc_class_type);
3093 if (objc_class_type)
3095 uint32_t child_idx = 0;
3096 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3098 if (class_interface_decl)
3101 const ASTRecordLayout &interface_layout = m_ast->getASTObjCInterfaceLayout(class_interface_decl);
3102 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3103 if (superclass_interface_decl)
3105 if (omit_empty_base_classes)
3107 ClangASTType base_class_clang_type (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl));
3108 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
3112 QualType ivar_qual_type(m_ast->getObjCInterfaceType(superclass_interface_decl));
3115 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
3117 std::pair<uint64_t, unsigned> ivar_type_info = m_ast->getTypeInfo(ivar_qual_type.getTypePtr());
3119 child_byte_size = ivar_type_info.first / 8;
3120 child_byte_offset = 0;
3121 child_is_base_class = true;
3123 return ClangASTType (m_ast, ivar_qual_type);
3133 const uint32_t superclass_idx = child_idx;
3135 if (idx < (child_idx + class_interface_decl->ivar_size()))
3137 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3139 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
3141 if (child_idx == idx)
3143 ObjCIvarDecl* ivar_decl = *ivar_pos;
3145 QualType ivar_qual_type(ivar_decl->getType());
3147 child_name.assign(ivar_decl->getNameAsString().c_str());
3149 std::pair<uint64_t, unsigned> ivar_type_info = m_ast->getTypeInfo(ivar_qual_type.getTypePtr());
3151 child_byte_size = ivar_type_info.first / 8;
3153 // Figure out the field offset within the current struct/union/class type
3154 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
3155 // that doesn't account for the space taken up by unbacked properties, or from
3156 // the changing size of base classes that are newer than this class.
3157 // So if we have a process around that we can ask about this object, do so.
3158 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
3159 Process *process = NULL;
3161 process = exe_ctx->GetProcessPtr();
3164 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
3165 if (objc_runtime != NULL)
3167 ClangASTType parent_ast_type (m_ast, parent_qual_type);
3168 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
3172 // Setting this to UINT32_MAX to make sure we don't compute it twice...
3173 bit_offset = UINT32_MAX;
3175 if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
3177 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
3178 child_byte_offset = bit_offset / 8;
3181 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
3182 // of a bitfield within its containing object. So regardless of where we get the byte
3183 // offset from, we still need to get the bit offset for bitfields from the layout.
3185 if (ClangASTContext::FieldIsBitfield (m_ast, ivar_decl, child_bitfield_bit_size))
3187 if (bit_offset == UINT32_MAX)
3188 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
3190 child_bitfield_bit_offset = bit_offset % 8;
3192 return ClangASTType (m_ast, ivar_qual_type);
3202 case clang::Type::ObjCObjectPointer:
3205 ClangASTType pointee_clang_type (GetPointeeType());
3207 if (transparent_pointers && pointee_clang_type.IsAggregateType())
3209 child_is_deref_of_parent = false;
3210 bool tmp_child_is_deref_of_parent = false;
3211 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
3214 transparent_pointers,
3215 omit_empty_base_classes,
3216 ignore_array_bounds,
3220 child_bitfield_bit_size,
3221 child_bitfield_bit_offset,
3222 child_is_base_class,
3223 tmp_child_is_deref_of_parent);
3227 child_is_deref_of_parent = true;
3230 child_name.assign(1, '*');
3231 child_name += parent_name;
3234 // We have a pointer to an simple type
3235 if (idx == 0 && pointee_clang_type.GetCompleteType())
3237 child_byte_size = pointee_clang_type.GetByteSize();
3238 child_byte_offset = 0;
3239 return pointee_clang_type;
3245 case clang::Type::Vector:
3246 case clang::Type::ExtVector:
3249 const VectorType *array = cast<VectorType>(parent_qual_type.getTypePtr());
3252 ClangASTType element_type (m_ast, array->getElementType());
3253 if (element_type.GetCompleteType())
3255 char element_name[64];
3256 ::snprintf (element_name, sizeof (element_name), "[%zu]", idx);
3257 child_name.assign(element_name);
3258 child_byte_size = element_type.GetByteSize();
3259 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
3260 return element_type;
3266 case clang::Type::ConstantArray:
3267 case clang::Type::IncompleteArray:
3268 if (ignore_array_bounds || idx_is_valid)
3270 const ArrayType *array = cast<ArrayType>(parent_qual_type.getTypePtr());
3273 ClangASTType element_type (m_ast, array->getElementType());
3274 if (element_type.GetCompleteType())
3276 char element_name[64];
3277 ::snprintf (element_name, sizeof (element_name), "[%zu]", idx);
3278 child_name.assign(element_name);
3279 child_byte_size = element_type.GetByteSize();
3280 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
3281 return element_type;
3288 case clang::Type::Pointer:
3291 ClangASTType pointee_clang_type (GetPointeeType());
3293 // Don't dereference "void *" pointers
3294 if (pointee_clang_type.IsVoidType())
3295 return ClangASTType();
3297 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
3299 child_is_deref_of_parent = false;
3300 bool tmp_child_is_deref_of_parent = false;
3301 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
3304 transparent_pointers,
3305 omit_empty_base_classes,
3306 ignore_array_bounds,
3310 child_bitfield_bit_size,
3311 child_bitfield_bit_offset,
3312 child_is_base_class,
3313 tmp_child_is_deref_of_parent);
3317 child_is_deref_of_parent = true;
3321 child_name.assign(1, '*');
3322 child_name += parent_name;
3325 // We have a pointer to an simple type
3328 child_byte_size = pointee_clang_type.GetByteSize();
3329 child_byte_offset = 0;
3330 return pointee_clang_type;
3336 case clang::Type::LValueReference:
3337 case clang::Type::RValueReference:
3340 const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
3341 ClangASTType pointee_clang_type (m_ast, reference_type->getPointeeType());
3342 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
3344 child_is_deref_of_parent = false;
3345 bool tmp_child_is_deref_of_parent = false;
3346 return pointee_clang_type.GetChildClangTypeAtIndex (exe_ctx,
3349 transparent_pointers,
3350 omit_empty_base_classes,
3351 ignore_array_bounds,
3355 child_bitfield_bit_size,
3356 child_bitfield_bit_offset,
3357 child_is_base_class,
3358 tmp_child_is_deref_of_parent);
3364 child_name.assign(1, '&');
3365 child_name += parent_name;
3368 // We have a pointer to an simple type
3371 child_byte_size = pointee_clang_type.GetByteSize();
3372 child_byte_offset = 0;
3373 return pointee_clang_type;
3379 case clang::Type::Typedef:
3381 ClangASTType typedefed_clang_type (m_ast, cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
3382 return typedefed_clang_type.GetChildClangTypeAtIndex (exe_ctx,
3385 transparent_pointers,
3386 omit_empty_base_classes,
3387 ignore_array_bounds,
3391 child_bitfield_bit_size,
3392 child_bitfield_bit_offset,
3393 child_is_base_class,
3394 child_is_deref_of_parent);
3398 case clang::Type::Elaborated:
3400 ClangASTType elaborated_clang_type (m_ast, cast<ElaboratedType>(parent_qual_type)->getNamedType());
3401 return elaborated_clang_type.GetChildClangTypeAtIndex (exe_ctx,
3404 transparent_pointers,
3405 omit_empty_base_classes,
3406 ignore_array_bounds,
3410 child_bitfield_bit_size,
3411 child_bitfield_bit_offset,
3412 child_is_base_class,
3413 child_is_deref_of_parent);
3416 case clang::Type::Paren:
3418 ClangASTType paren_clang_type (m_ast, llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
3419 return paren_clang_type.GetChildClangTypeAtIndex (exe_ctx,
3422 transparent_pointers,
3423 omit_empty_base_classes,
3424 ignore_array_bounds,
3428 child_bitfield_bit_size,
3429 child_bitfield_bit_offset,
3430 child_is_base_class,
3431 child_is_deref_of_parent);
3438 return ClangASTType();
3442 BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
3444 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
3448 GetIndexForRecordBase
3450 const RecordDecl *record_decl,
3451 const CXXBaseSpecifier *base_spec,
3452 bool omit_empty_base_classes
3455 uint32_t child_idx = 0;
3457 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3459 // const char *super_name = record_decl->getNameAsCString();
3460 // const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
3461 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
3463 if (cxx_record_decl)
3465 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3466 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3467 base_class != base_class_end;
3470 if (omit_empty_base_classes)
3472 if (BaseSpecifierIsEmpty (base_class))
3476 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
3478 // base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
3481 if (base_class == base_spec)
3492 GetIndexForRecordChild (const RecordDecl *record_decl,
3493 NamedDecl *canonical_decl,
3494 bool omit_empty_base_classes)
3496 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl),
3497 omit_empty_base_classes);
3499 RecordDecl::field_iterator field, field_end;
3500 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
3502 ++field, ++child_idx)
3504 if (field->getCanonicalDecl() == canonical_decl)
3511 // Look for a child member (doesn't include base classes, but it does include
3512 // their members) in the type hierarchy. Returns an index path into "clang_type"
3513 // on how to reach the appropriate member.
3532 // If we have a clang type that describes "class C", and we wanted to looked
3535 // With omit_empty_base_classes == false we would get an integer array back with:
3537 // The first index 1 is the child index for "class A" within class C
3538 // The second index 1 is the child index for "m_b" within class A
3540 // With omit_empty_base_classes == true we would get an integer array back with:
3542 // 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)
3543 // The second index 1 is the child index for "m_b" within class A
3546 ClangASTType::GetIndexOfChildMemberWithName (const char *name,
3547 bool omit_empty_base_classes,
3548 std::vector<uint32_t>& child_indexes) const
3550 if (IsValid() && name && name[0])
3552 QualType qual_type(GetCanonicalQualType());
3553 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3556 case clang::Type::Record:
3557 if (GetCompleteType ())
3559 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3560 const RecordDecl *record_decl = record_type->getDecl();
3562 assert(record_decl);
3563 uint32_t child_idx = 0;
3565 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3567 // Try and find a field that matches NAME
3568 RecordDecl::field_iterator field, field_end;
3569 StringRef name_sref(name);
3570 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
3572 ++field, ++child_idx)
3574 llvm::StringRef field_name = field->getName();
3575 if (field_name.empty())
3577 ClangASTType field_type(m_ast,field->getType());
3578 child_indexes.push_back(child_idx);
3579 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
3580 return child_indexes.size();
3581 child_indexes.pop_back();
3584 else if (field_name.equals (name_sref))
3586 // We have to add on the number of base classes to this index!
3587 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
3588 return child_indexes.size();
3592 if (cxx_record_decl)
3594 const RecordDecl *parent_record_decl = cxx_record_decl;
3596 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
3598 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
3599 // Didn't find things easily, lets let clang do its thang...
3600 IdentifierInfo & ident_ref = m_ast->Idents.get(name_sref);
3601 DeclarationName decl_name(&ident_ref);
3604 if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
3605 decl_name.getAsOpaquePtr(),
3608 CXXBasePaths::const_paths_iterator path, path_end = paths.end();
3609 for (path = paths.begin(); path != path_end; ++path)
3611 const size_t num_path_elements = path->size();
3612 for (size_t e=0; e<num_path_elements; ++e)
3614 CXXBasePathElement elem = (*path)[e];
3616 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
3617 if (child_idx == UINT32_MAX)
3619 child_indexes.clear();
3624 child_indexes.push_back (child_idx);
3625 parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
3628 for (NamedDecl *path_decl : path->Decls)
3630 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
3631 if (child_idx == UINT32_MAX)
3633 child_indexes.clear();
3638 child_indexes.push_back (child_idx);
3642 return child_indexes.size();
3649 case clang::Type::ObjCObject:
3650 case clang::Type::ObjCInterface:
3651 if (GetCompleteType ())
3653 StringRef name_sref(name);
3654 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3655 assert (objc_class_type);
3656 if (objc_class_type)
3658 uint32_t child_idx = 0;
3659 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3661 if (class_interface_decl)
3663 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3664 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3666 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
3668 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3670 if (ivar_decl->getName().equals (name_sref))
3672 if ((!omit_empty_base_classes && superclass_interface_decl) ||
3673 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
3676 child_indexes.push_back (child_idx);
3677 return child_indexes.size();
3681 if (superclass_interface_decl)
3683 // The super class index is always zero for ObjC classes,
3684 // so we push it onto the child indexes in case we find
3685 // an ivar in our superclass...
3686 child_indexes.push_back (0);
3688 ClangASTType superclass_clang_type (m_ast, m_ast->getObjCInterfaceType(superclass_interface_decl));
3689 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
3690 omit_empty_base_classes,
3693 // We did find an ivar in a superclass so just
3694 // return the results!
3695 return child_indexes.size();
3698 // We didn't find an ivar matching "name" in our
3699 // superclass, pop the superclass zero index that
3700 // we pushed on above.
3701 child_indexes.pop_back();
3708 case clang::Type::ObjCObjectPointer:
3710 ClangASTType objc_object_clang_type (m_ast, cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
3711 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
3712 omit_empty_base_classes,
3718 case clang::Type::ConstantArray:
3720 // const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
3721 // const uint64_t element_count = array->getSize().getLimitedValue();
3723 // if (idx < element_count)
3725 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
3727 // char element_name[32];
3728 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
3730 // child_name.assign(element_name);
3731 // assert(field_type_info.first % 8 == 0);
3732 // child_byte_size = field_type_info.first / 8;
3733 // child_byte_offset = idx * child_byte_size;
3734 // return array->getElementType().getAsOpaquePtr();
3739 // case clang::Type::MemberPointerType:
3741 // MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
3742 // QualType pointee_type = mem_ptr_type->getPointeeType();
3744 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3746 // return GetIndexOfChildWithName (ast,
3747 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
3753 case clang::Type::LValueReference:
3754 case clang::Type::RValueReference:
3756 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
3757 QualType pointee_type(reference_type->getPointeeType());
3758 ClangASTType pointee_clang_type (m_ast, pointee_type);
3760 if (pointee_clang_type.IsAggregateType ())
3762 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
3763 omit_empty_base_classes,
3769 case clang::Type::Pointer:
3771 ClangASTType pointee_clang_type (GetPointeeType());
3773 if (pointee_clang_type.IsAggregateType ())
3775 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
3776 omit_empty_base_classes,
3782 case clang::Type::Typedef:
3783 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
3784 omit_empty_base_classes,
3787 case clang::Type::Elaborated:
3788 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
3789 omit_empty_base_classes,
3792 case clang::Type::Paren:
3793 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
3794 omit_empty_base_classes,
3805 // Get the index of the child of "clang_type" whose name matches. This function
3806 // doesn't descend into the children, but only looks one level deep and name
3807 // matches can include base class names.
3810 ClangASTType::GetIndexOfChildWithName (const char *name, bool omit_empty_base_classes) const
3812 if (IsValid() && name && name[0])
3814 QualType qual_type(GetCanonicalQualType());
3816 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3820 case clang::Type::Record:
3821 if (GetCompleteType ())
3823 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
3824 const RecordDecl *record_decl = record_type->getDecl();
3826 assert(record_decl);
3827 uint32_t child_idx = 0;
3829 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
3831 if (cxx_record_decl)
3833 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
3834 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
3835 base_class != base_class_end;
3838 // Skip empty base classes
3839 CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
3840 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
3843 ClangASTType base_class_clang_type (m_ast, base_class->getType());
3844 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
3845 if (base_class_type_name.compare (name) == 0)
3851 // Try and find a field that matches NAME
3852 RecordDecl::field_iterator field, field_end;
3853 StringRef name_sref(name);
3854 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
3856 ++field, ++child_idx)
3858 if (field->getName().equals (name_sref))
3865 case clang::Type::ObjCObject:
3866 case clang::Type::ObjCInterface:
3867 if (GetCompleteType())
3869 StringRef name_sref(name);
3870 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
3871 assert (objc_class_type);
3872 if (objc_class_type)
3874 uint32_t child_idx = 0;
3875 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3877 if (class_interface_decl)
3879 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
3880 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
3882 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
3884 const ObjCIvarDecl* ivar_decl = *ivar_pos;
3886 if (ivar_decl->getName().equals (name_sref))
3888 if ((!omit_empty_base_classes && superclass_interface_decl) ||
3889 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
3896 if (superclass_interface_decl)
3898 if (superclass_interface_decl->getName().equals (name_sref))
3906 case clang::Type::ObjCObjectPointer:
3908 ClangASTType pointee_clang_type (m_ast, cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
3909 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
3913 case clang::Type::ConstantArray:
3915 // const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
3916 // const uint64_t element_count = array->getSize().getLimitedValue();
3918 // if (idx < element_count)
3920 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
3922 // char element_name[32];
3923 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
3925 // child_name.assign(element_name);
3926 // assert(field_type_info.first % 8 == 0);
3927 // child_byte_size = field_type_info.first / 8;
3928 // child_byte_offset = idx * child_byte_size;
3929 // return array->getElementType().getAsOpaquePtr();
3934 // case clang::Type::MemberPointerType:
3936 // MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
3937 // QualType pointee_type = mem_ptr_type->getPointeeType();
3939 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
3941 // return GetIndexOfChildWithName (ast,
3942 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
3948 case clang::Type::LValueReference:
3949 case clang::Type::RValueReference:
3951 const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
3952 ClangASTType pointee_type (m_ast, reference_type->getPointeeType());
3954 if (pointee_type.IsAggregateType ())
3956 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
3961 case clang::Type::Pointer:
3963 const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
3964 ClangASTType pointee_type (m_ast, pointer_type->getPointeeType());
3966 if (pointee_type.IsAggregateType ())
3968 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
3974 // child_name.assign(1, '*');
3975 // child_name += parent_name;
3978 // // We have a pointer to an simple type
3981 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
3982 // assert(clang_type_info.first % 8 == 0);
3983 // child_byte_size = clang_type_info.first / 8;
3984 // child_byte_offset = 0;
3985 // return pointee_type.getAsOpaquePtr();
3991 case clang::Type::Elaborated:
3992 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
3994 case clang::Type::Paren:
3995 return ClangASTType (m_ast, cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
3997 case clang::Type::Typedef:
3998 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
4009 ClangASTType::GetNumTemplateArguments () const
4013 QualType qual_type (GetCanonicalQualType());
4015 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4018 case clang::Type::Record:
4019 if (GetCompleteType ())
4021 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4022 if (cxx_record_decl)
4024 const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
4026 return template_decl->getTemplateArgs().size();
4031 case clang::Type::Typedef:
4032 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumTemplateArguments();
4034 case clang::Type::Elaborated:
4035 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetNumTemplateArguments();
4037 case clang::Type::Paren:
4038 return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetNumTemplateArguments();
4048 ClangASTType::GetTemplateArgument (size_t arg_idx, lldb::TemplateArgumentKind &kind) const
4052 QualType qual_type (GetCanonicalQualType());
4054 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4057 case clang::Type::Record:
4058 if (GetCompleteType ())
4060 const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4061 if (cxx_record_decl)
4063 const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
4064 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
4066 const TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
4067 switch (template_arg.getKind())
4069 case clang::TemplateArgument::Null:
4070 kind = eTemplateArgumentKindNull;
4071 return ClangASTType();
4073 case clang::TemplateArgument::Type:
4074 kind = eTemplateArgumentKindType;
4075 return ClangASTType(m_ast, template_arg.getAsType());
4077 case clang::TemplateArgument::Declaration:
4078 kind = eTemplateArgumentKindDeclaration;
4079 return ClangASTType();
4081 case clang::TemplateArgument::Integral:
4082 kind = eTemplateArgumentKindIntegral;
4083 return ClangASTType(m_ast, template_arg.getIntegralType());
4085 case clang::TemplateArgument::Template:
4086 kind = eTemplateArgumentKindTemplate;
4087 return ClangASTType();
4089 case clang::TemplateArgument::TemplateExpansion:
4090 kind = eTemplateArgumentKindTemplateExpansion;
4091 return ClangASTType();
4093 case clang::TemplateArgument::Expression:
4094 kind = eTemplateArgumentKindExpression;
4095 return ClangASTType();
4097 case clang::TemplateArgument::Pack:
4098 kind = eTemplateArgumentKindPack;
4099 return ClangASTType();
4102 assert (!"Unhandled TemplateArgument::ArgKind");
4110 case clang::Type::Typedef:
4111 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetTemplateArgument (arg_idx, kind);
4113 case clang::Type::Elaborated:
4114 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetTemplateArgument (arg_idx, kind);
4116 case clang::Type::Paren:
4117 return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetTemplateArgument (arg_idx, kind);
4123 kind = eTemplateArgumentKindNull;
4124 return ClangASTType ();
4128 IsOperator (const char *name, OverloadedOperatorKind &op_kind)
4130 if (name == NULL || name[0] == '\0')
4133 #define OPERATOR_PREFIX "operator"
4134 #define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
4136 const char *post_op_name = NULL;
4138 bool no_space = true;
4140 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
4143 post_op_name = name + OPERATOR_PREFIX_LENGTH;
4145 if (post_op_name[0] == ' ')
4151 #undef OPERATOR_PREFIX
4152 #undef OPERATOR_PREFIX_LENGTH
4154 // This is an operator, set the overloaded operator kind to invalid
4155 // in case this is a conversion operator...
4156 op_kind = NUM_OVERLOADED_OPERATORS;
4158 switch (post_op_name[0])
4167 if (strcmp (post_op_name, "new") == 0)
4169 else if (strcmp (post_op_name, "new[]") == 0)
4170 op_kind = OO_Array_New;
4176 if (strcmp (post_op_name, "delete") == 0)
4177 op_kind = OO_Delete;
4178 else if (strcmp (post_op_name, "delete[]") == 0)
4179 op_kind = OO_Array_Delete;
4183 if (post_op_name[1] == '\0')
4185 else if (post_op_name[2] == '\0')
4187 if (post_op_name[1] == '=')
4188 op_kind = OO_PlusEqual;
4189 else if (post_op_name[1] == '+')
4190 op_kind = OO_PlusPlus;
4195 if (post_op_name[1] == '\0')
4197 else if (post_op_name[2] == '\0')
4199 switch (post_op_name[1])
4201 case '=': op_kind = OO_MinusEqual; break;
4202 case '-': op_kind = OO_MinusMinus; break;
4203 case '>': op_kind = OO_Arrow; break;
4206 else if (post_op_name[3] == '\0')
4208 if (post_op_name[2] == '*')
4209 op_kind = OO_ArrowStar; break;
4214 if (post_op_name[1] == '\0')
4216 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
4217 op_kind = OO_StarEqual;
4221 if (post_op_name[1] == '\0')
4223 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
4224 op_kind = OO_SlashEqual;
4228 if (post_op_name[1] == '\0')
4229 op_kind = OO_Percent;
4230 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
4231 op_kind = OO_PercentEqual;
4236 if (post_op_name[1] == '\0')
4238 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
4239 op_kind = OO_CaretEqual;
4243 if (post_op_name[1] == '\0')
4245 else if (post_op_name[2] == '\0')
4247 switch (post_op_name[1])
4249 case '=': op_kind = OO_AmpEqual; break;
4250 case '&': op_kind = OO_AmpAmp; break;
4256 if (post_op_name[1] == '\0')
4258 else if (post_op_name[2] == '\0')
4260 switch (post_op_name[1])
4262 case '=': op_kind = OO_PipeEqual; break;
4263 case '|': op_kind = OO_PipePipe; break;
4269 if (post_op_name[1] == '\0')
4274 if (post_op_name[1] == '\0')
4275 op_kind = OO_Exclaim;
4276 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
4277 op_kind = OO_ExclaimEqual;
4281 if (post_op_name[1] == '\0')
4283 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
4284 op_kind = OO_EqualEqual;
4288 if (post_op_name[1] == '\0')
4290 else if (post_op_name[2] == '\0')
4292 switch (post_op_name[1])
4294 case '<': op_kind = OO_LessLess; break;
4295 case '=': op_kind = OO_LessEqual; break;
4298 else if (post_op_name[3] == '\0')
4300 if (post_op_name[2] == '=')
4301 op_kind = OO_LessLessEqual;
4306 if (post_op_name[1] == '\0')
4307 op_kind = OO_Greater;
4308 else if (post_op_name[2] == '\0')
4310 switch (post_op_name[1])
4312 case '>': op_kind = OO_GreaterGreater; break;
4313 case '=': op_kind = OO_GreaterEqual; break;
4316 else if (post_op_name[1] == '>' &&
4317 post_op_name[2] == '=' &&
4318 post_op_name[3] == '\0')
4320 op_kind = OO_GreaterGreaterEqual;
4325 if (post_op_name[1] == '\0')
4330 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
4335 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
4336 op_kind = OO_Subscript;
4344 check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
4346 // Special-case call since it can take any number of operands
4347 if(op_kind == OO_Call)
4350 // The parameter count doens't include "this"
4351 if (num_params == 0)
4353 if (num_params == 1)
4360 ClangASTType::GetAsRecordDecl () const
4362 const RecordType *record_type = dyn_cast<RecordType>(GetCanonicalQualType());
4364 return record_type->getDecl();
4368 clang::CXXRecordDecl *
4369 ClangASTType::GetAsCXXRecordDecl () const
4371 return GetCanonicalQualType()->getAsCXXRecordDecl();
4375 ClangASTType::GetAsObjCInterfaceDecl () const
4377 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(GetCanonicalQualType());
4378 if (objc_class_type)
4379 return objc_class_type->getInterface();
4384 ClangASTType::AddFieldToRecordType (const char *name,
4385 const ClangASTType &field_clang_type,
4387 uint32_t bitfield_bit_size)
4389 if (!IsValid() || !field_clang_type.IsValid())
4392 FieldDecl *field = NULL;
4394 clang::Expr *bit_width = NULL;
4395 if (bitfield_bit_size != 0)
4397 APInt bitfield_bit_size_apint(m_ast->getTypeSize(m_ast->IntTy), bitfield_bit_size);
4398 bit_width = new (*m_ast)IntegerLiteral (*m_ast, bitfield_bit_size_apint, m_ast->IntTy, SourceLocation());
4401 RecordDecl *record_decl = GetAsRecordDecl ();
4404 field = FieldDecl::Create (*m_ast,
4408 name ? &m_ast->Idents.get(name) : NULL, // Identifier
4409 field_clang_type.GetQualType(), // Field type
4411 bit_width, // BitWidth
4413 ICIS_NoInit); // HasInit
4417 // Determine whether this field corresponds to an anonymous
4419 if (const TagType *TagT = field->getType()->getAs<TagType>()) {
4420 if (RecordDecl *Rec = dyn_cast<RecordDecl>(TagT->getDecl()))
4421 if (!Rec->getDeclName()) {
4422 Rec->setAnonymousStructOrUnion(true);
4423 field->setImplicit();
4431 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
4433 record_decl->addDecl(field);
4435 #ifdef LLDB_CONFIGURATION_DEBUG
4442 ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl ();
4444 if (class_interface_decl)
4446 const bool is_synthesized = false;
4448 field_clang_type.GetCompleteType();
4450 field = ObjCIvarDecl::Create (*m_ast,
4451 class_interface_decl,
4454 name ? &m_ast->Idents.get(name) : NULL, // Identifier
4455 field_clang_type.GetQualType(), // Field type
4456 NULL, // TypeSourceInfo *
4457 ConvertAccessTypeToObjCIvarAccessControl (access),
4463 class_interface_decl->addDecl(field);
4465 #ifdef LLDB_CONFIGURATION_DEBUG
4475 ClangASTType::BuildIndirectFields ()
4477 RecordDecl *record_decl = GetAsRecordDecl();
4482 typedef llvm::SmallVector <IndirectFieldDecl *, 1> IndirectFieldVector;
4484 IndirectFieldVector indirect_fields;
4485 RecordDecl::field_iterator field_pos;
4486 RecordDecl::field_iterator field_end_pos = record_decl->field_end();
4487 RecordDecl::field_iterator last_field_pos = field_end_pos;
4488 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
4490 if (field_pos->isAnonymousStructOrUnion())
4492 QualType field_qual_type = field_pos->getType();
4494 const RecordType *field_record_type = field_qual_type->getAs<RecordType>();
4496 if (!field_record_type)
4499 RecordDecl *field_record_decl = field_record_type->getDecl();
4501 if (!field_record_decl)
4504 for (RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
4508 if (FieldDecl *nested_field_decl = dyn_cast<FieldDecl>(*di))
4510 NamedDecl **chain = new (*m_ast) NamedDecl*[2];
4511 chain[0] = *field_pos;
4512 chain[1] = nested_field_decl;
4513 IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*m_ast,
4516 nested_field_decl->getIdentifier(),
4517 nested_field_decl->getType(),
4521 indirect_field->setImplicit();
4523 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
4524 nested_field_decl->getAccess()));
4526 indirect_fields.push_back(indirect_field);
4528 else if (IndirectFieldDecl *nested_indirect_field_decl = dyn_cast<IndirectFieldDecl>(*di))
4530 int nested_chain_size = nested_indirect_field_decl->getChainingSize();
4531 NamedDecl **chain = new (*m_ast) NamedDecl*[nested_chain_size + 1];
4532 chain[0] = *field_pos;
4534 int chain_index = 1;
4535 for (IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
4536 nce = nested_indirect_field_decl->chain_end();
4540 chain[chain_index] = *nci;
4544 IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*m_ast,
4547 nested_indirect_field_decl->getIdentifier(),
4548 nested_indirect_field_decl->getType(),
4550 nested_chain_size + 1);
4552 indirect_field->setImplicit();
4554 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
4555 nested_indirect_field_decl->getAccess()));
4557 indirect_fields.push_back(indirect_field);
4563 // Check the last field to see if it has an incomplete array type as its
4564 // last member and if it does, the tell the record decl about it
4565 if (last_field_pos != field_end_pos)
4567 if (last_field_pos->getType()->isIncompleteArrayType())
4568 record_decl->hasFlexibleArrayMember();
4571 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
4575 record_decl->addDecl(*ifi);
4580 ClangASTType::AddVariableToRecordType (const char *name,
4581 const ClangASTType &var_type,
4584 clang::VarDecl *var_decl = NULL;
4586 if (!IsValid() || !var_type.IsValid())
4589 RecordDecl *record_decl = GetAsRecordDecl ();
4592 var_decl = VarDecl::Create (*m_ast, // ASTContext &
4593 record_decl, // DeclContext *
4594 SourceLocation(), // SourceLocation StartLoc
4595 SourceLocation(), // SourceLocation IdLoc
4596 name ? &m_ast->Idents.get(name) : NULL, // IdentifierInfo *
4597 var_type.GetQualType(), // Variable QualType
4598 NULL, // TypeSourceInfo *
4599 SC_Static); // StorageClass
4602 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
4603 record_decl->addDecl(var_decl);
4605 #ifdef LLDB_CONFIGURATION_DEBUG
4606 VerifyDecl(var_decl);
4615 ClangASTType::AddMethodToCXXRecordType (const char *name,
4616 const ClangASTType &method_clang_type,
4617 lldb::AccessType access,
4625 if (!IsValid() || !method_clang_type.IsValid() || name == NULL || name[0] == '\0')
4628 QualType record_qual_type(GetCanonicalQualType());
4630 CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
4632 if (cxx_record_decl == NULL)
4635 QualType method_qual_type (method_clang_type.GetQualType());
4637 CXXMethodDecl *cxx_method_decl = NULL;
4639 DeclarationName decl_name (&m_ast->Idents.get(name));
4641 const clang::FunctionType *function_type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
4643 if (function_type == NULL)
4646 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_type));
4648 if (!method_function_prototype)
4651 unsigned int num_params = method_function_prototype->getNumArgs();
4653 CXXDestructorDecl *cxx_dtor_decl(NULL);
4654 CXXConstructorDecl *cxx_ctor_decl(NULL);
4657 return NULL; // skip everything artificial
4661 cxx_dtor_decl = CXXDestructorDecl::Create (*m_ast,
4664 DeclarationNameInfo (m_ast->DeclarationNames.getCXXDestructorName (m_ast->getCanonicalType (record_qual_type)), SourceLocation()),
4669 cxx_method_decl = cxx_dtor_decl;
4671 else if (decl_name == cxx_record_decl->getDeclName())
4673 cxx_ctor_decl = CXXConstructorDecl::Create (*m_ast,
4676 DeclarationNameInfo (m_ast->DeclarationNames.getCXXConstructorName (m_ast->getCanonicalType (record_qual_type)), SourceLocation()),
4678 NULL, // TypeSourceInfo *
4682 false /*is_constexpr*/);
4683 cxx_method_decl = cxx_ctor_decl;
4687 clang::StorageClass SC = is_static ? SC_Static : SC_None;
4688 OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
4690 if (IsOperator (name, op_kind))
4692 if (op_kind != NUM_OVERLOADED_OPERATORS)
4694 // Check the number of operator parameters. Sometimes we have
4695 // seen bad DWARF that doesn't correctly describe operators and
4696 // if we try to create a methed and add it to the class, clang
4697 // will assert and crash, so we need to make sure things are
4699 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
4701 cxx_method_decl = CXXMethodDecl::Create (*m_ast,
4704 DeclarationNameInfo (m_ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
4706 NULL, // TypeSourceInfo *
4709 false /*is_constexpr*/,
4712 else if (num_params == 0)
4714 // Conversion operators don't take params...
4715 cxx_method_decl = CXXConversionDecl::Create (*m_ast,
4718 DeclarationNameInfo (m_ast->DeclarationNames.getCXXConversionFunctionName (m_ast->getCanonicalType (function_type->getResultType())), SourceLocation()),
4720 NULL, // TypeSourceInfo *
4723 false /*is_constexpr*/,
4728 if (cxx_method_decl == NULL)
4730 cxx_method_decl = CXXMethodDecl::Create (*m_ast,
4733 DeclarationNameInfo (decl_name, SourceLocation()),
4735 NULL, // TypeSourceInfo *
4738 false /*is_constexpr*/,
4743 AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
4745 cxx_method_decl->setAccess (access_specifier);
4746 cxx_method_decl->setVirtualAsWritten (is_virtual);
4749 cxx_method_decl->addAttr(::new (*m_ast) UsedAttr(SourceRange(), *m_ast));
4751 // Populate the method decl with parameter decls
4753 llvm::SmallVector<ParmVarDecl *, 12> params;
4755 for (unsigned param_index = 0;
4756 param_index < num_params;
4759 params.push_back (ParmVarDecl::Create (*m_ast,
4764 method_function_prototype->getArgType(param_index),
4770 cxx_method_decl->setParams (ArrayRef<ParmVarDecl*>(params));
4772 cxx_record_decl->addDecl (cxx_method_decl);
4774 // Sometimes the debug info will mention a constructor (default/copy/move),
4775 // destructor, or assignment operator (copy/move) but there won't be any
4776 // version of this in the code. So we check if the function was artificially
4777 // generated and if it is trivial and this lets the compiler/backend know
4778 // that it can inline the IR for these when it needs to and we can avoid a
4779 // "missing function" error when running expressions.
4783 if (cxx_ctor_decl &&
4784 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
4785 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
4786 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
4788 cxx_ctor_decl->setDefaulted();
4789 cxx_ctor_decl->setTrivial(true);
4791 else if (cxx_dtor_decl)
4793 if (cxx_record_decl->hasTrivialDestructor())
4795 cxx_dtor_decl->setDefaulted();
4796 cxx_dtor_decl->setTrivial(true);
4799 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
4800 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
4802 cxx_method_decl->setDefaulted();
4803 cxx_method_decl->setTrivial(true);
4807 #ifdef LLDB_CONFIGURATION_DEBUG
4808 VerifyDecl(cxx_method_decl);
4811 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
4812 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
4813 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
4814 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
4815 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
4816 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
4817 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
4818 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
4819 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
4820 return cxx_method_decl;
4824 #pragma mark C++ Base Classes
4827 ClangASTType::CreateBaseClassSpecifier (AccessType access, bool is_virtual, bool base_of_class)
4830 return new CXXBaseSpecifier (SourceRange(),
4833 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
4834 m_ast->getTrivialTypeSourceInfo (GetQualType()),
4840 ClangASTType::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
4842 for (unsigned i=0; i<num_base_classes; ++i)
4844 delete base_classes[i];
4845 base_classes[i] = NULL;
4850 ClangASTType::SetBaseClassesForClassType (CXXBaseSpecifier const * const *base_classes,
4851 unsigned num_base_classes)
4855 CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl();
4856 if (cxx_record_decl)
4858 cxx_record_decl->setBases(base_classes, num_base_classes);
4866 ClangASTType::SetObjCSuperClass (const ClangASTType &superclass_clang_type)
4868 if (IsValid() && superclass_clang_type.IsValid())
4870 ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl ();
4871 ObjCInterfaceDecl *super_interface_decl = superclass_clang_type.GetAsObjCInterfaceDecl ();
4872 if (class_interface_decl && super_interface_decl)
4874 class_interface_decl->setSuperClass(super_interface_decl);
4882 ClangASTType::AddObjCClassProperty (const char *property_name,
4883 const ClangASTType &property_clang_type,
4884 ObjCIvarDecl *ivar_decl,
4885 const char *property_setter_name,
4886 const char *property_getter_name,
4887 uint32_t property_attributes,
4888 ClangASTMetadata *metadata)
4890 if (!IsValid() || !property_clang_type.IsValid() || property_name == NULL || property_name[0] == '\0')
4893 ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl ();
4895 if (class_interface_decl)
4897 ClangASTType property_clang_type_to_access;
4899 if (property_clang_type.IsValid())
4900 property_clang_type_to_access = property_clang_type;
4902 property_clang_type_to_access = ClangASTType (m_ast, ivar_decl->getType());
4904 if (class_interface_decl && property_clang_type_to_access.IsValid())
4906 clang::TypeSourceInfo *prop_type_source;
4908 prop_type_source = m_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
4910 prop_type_source = m_ast->getTrivialTypeSourceInfo (property_clang_type.GetQualType());
4912 ObjCPropertyDecl *property_decl = ObjCPropertyDecl::Create (*m_ast,
4913 class_interface_decl,
4914 SourceLocation(), // Source Location
4915 &m_ast->Idents.get(property_name),
4916 SourceLocation(), //Source Location for AT
4917 SourceLocation(), //Source location for (
4923 ClangASTContext::SetMetadata(m_ast, property_decl, *metadata);
4925 class_interface_decl->addDecl (property_decl);
4927 Selector setter_sel, getter_sel;
4929 if (property_setter_name != NULL)
4931 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
4932 clang::IdentifierInfo *setter_ident = &m_ast->Idents.get(property_setter_no_colon.c_str());
4933 setter_sel = m_ast->Selectors.getSelector(1, &setter_ident);
4935 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
4937 std::string setter_sel_string("set");
4938 setter_sel_string.push_back(::toupper(property_name[0]));
4939 setter_sel_string.append(&property_name[1]);
4940 clang::IdentifierInfo *setter_ident = &m_ast->Idents.get(setter_sel_string.c_str());
4941 setter_sel = m_ast->Selectors.getSelector(1, &setter_ident);
4943 property_decl->setSetterName(setter_sel);
4944 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
4946 if (property_getter_name != NULL)
4948 clang::IdentifierInfo *getter_ident = &m_ast->Idents.get(property_getter_name);
4949 getter_sel = m_ast->Selectors.getSelector(0, &getter_ident);
4953 clang::IdentifierInfo *getter_ident = &m_ast->Idents.get(property_name);
4954 getter_sel = m_ast->Selectors.getSelector(0, &getter_ident);
4956 property_decl->setGetterName(getter_sel);
4957 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
4960 property_decl->setPropertyIvarDecl (ivar_decl);
4962 if (property_attributes & DW_APPLE_PROPERTY_readonly)
4963 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
4964 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
4965 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
4966 if (property_attributes & DW_APPLE_PROPERTY_assign)
4967 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
4968 if (property_attributes & DW_APPLE_PROPERTY_retain)
4969 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
4970 if (property_attributes & DW_APPLE_PROPERTY_copy)
4971 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
4972 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
4973 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
4975 if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
4977 const bool isInstance = true;
4978 const bool isVariadic = false;
4979 const bool isSynthesized = false;
4980 const bool isImplicitlyDeclared = true;
4981 const bool isDefined = false;
4982 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
4983 const bool HasRelatedResultType = false;
4985 ObjCMethodDecl *getter = ObjCMethodDecl::Create (*m_ast,
4989 property_clang_type_to_access.GetQualType(),
4991 class_interface_decl,
4995 isImplicitlyDeclared,
4998 HasRelatedResultType);
5000 if (getter && metadata)
5001 ClangASTContext::SetMetadata(m_ast, getter, *metadata);
5003 getter->setMethodParams(*m_ast, ArrayRef<ParmVarDecl*>(), ArrayRef<SourceLocation>());
5005 class_interface_decl->addDecl(getter);
5008 if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
5010 QualType result_type = m_ast->VoidTy;
5012 const bool isInstance = true;
5013 const bool isVariadic = false;
5014 const bool isSynthesized = false;
5015 const bool isImplicitlyDeclared = true;
5016 const bool isDefined = false;
5017 const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
5018 const bool HasRelatedResultType = false;
5020 ObjCMethodDecl *setter = ObjCMethodDecl::Create (*m_ast,
5026 class_interface_decl,
5030 isImplicitlyDeclared,
5033 HasRelatedResultType);
5035 if (setter && metadata)
5036 ClangASTContext::SetMetadata(m_ast, setter, *metadata);
5038 llvm::SmallVector<ParmVarDecl *, 1> params;
5040 params.push_back (ParmVarDecl::Create (*m_ast,
5045 property_clang_type_to_access.GetQualType(),
5050 setter->setMethodParams(*m_ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
5052 class_interface_decl->addDecl(setter);
5063 ClangASTType::IsObjCClassTypeAndHasIVars (bool check_superclass) const
5065 ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl ();
5066 if (class_interface_decl)
5067 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
5073 ClangASTType::AddMethodToObjCObjectType (const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
5074 const ClangASTType &method_clang_type,
5075 lldb::AccessType access,
5078 if (!IsValid() || !method_clang_type.IsValid())
5081 ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl();
5083 if (class_interface_decl == NULL)
5086 const char *selector_start = ::strchr (name, ' ');
5087 if (selector_start == NULL)
5091 llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
5095 //printf ("name = '%s'\n", name);
5097 unsigned num_selectors_with_args = 0;
5098 for (start = selector_start;
5099 start && *start != '\0' && *start != ']';
5102 len = ::strcspn(start, ":]");
5103 bool has_arg = (start[len] == ':');
5105 ++num_selectors_with_args;
5106 selector_idents.push_back (&m_ast->Idents.get (StringRef (start, len)));
5112 if (selector_idents.size() == 0)
5115 clang::Selector method_selector = m_ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
5116 selector_idents.data());
5118 QualType method_qual_type (method_clang_type.GetQualType());
5120 // Populate the method decl with parameter decls
5121 const clang::Type *method_type(method_qual_type.getTypePtr());
5123 if (method_type == NULL)
5126 const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
5128 if (!method_function_prototype)
5132 bool is_variadic = false;
5133 bool is_synthesized = false;
5134 bool is_defined = false;
5135 ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
5137 const unsigned num_args = method_function_prototype->getNumArgs();
5139 if (num_args != num_selectors_with_args)
5140 return NULL; // some debug information is corrupt. We are not going to deal with it.
5142 ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*m_ast,
5143 SourceLocation(), // beginLoc,
5144 SourceLocation(), // endLoc,
5146 method_function_prototype->getResultType(),
5147 NULL, // TypeSourceInfo *ResultTInfo,
5148 GetDeclContextForType (),
5152 true, // is_implicitly_declared; we force this to true because we don't have source locations
5155 false /*has_related_result_type*/);
5158 if (objc_method_decl == NULL)
5163 llvm::SmallVector<ParmVarDecl *, 12> params;
5165 for (unsigned param_index = 0; param_index < num_args; ++param_index)
5167 params.push_back (ParmVarDecl::Create (*m_ast,
5172 method_function_prototype->getArgType(param_index),
5178 objc_method_decl->setMethodParams(*m_ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
5181 class_interface_decl->addDecl (objc_method_decl);
5183 #ifdef LLDB_CONFIGURATION_DEBUG
5184 VerifyDecl(objc_method_decl);
5187 return objc_method_decl;
5191 clang::DeclContext *
5192 ClangASTType::GetDeclContextForType () const
5197 QualType qual_type(GetCanonicalQualType());
5198 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5201 case clang::Type::UnaryTransform: break;
5202 case clang::Type::FunctionNoProto: break;
5203 case clang::Type::FunctionProto: break;
5204 case clang::Type::IncompleteArray: break;
5205 case clang::Type::VariableArray: break;
5206 case clang::Type::ConstantArray: break;
5207 case clang::Type::DependentSizedArray: break;
5208 case clang::Type::ExtVector: break;
5209 case clang::Type::DependentSizedExtVector: break;
5210 case clang::Type::Vector: break;
5211 case clang::Type::Builtin: break;
5212 case clang::Type::BlockPointer: break;
5213 case clang::Type::Pointer: break;
5214 case clang::Type::LValueReference: break;
5215 case clang::Type::RValueReference: break;
5216 case clang::Type::MemberPointer: break;
5217 case clang::Type::Complex: break;
5218 case clang::Type::ObjCObject: break;
5219 case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
5220 case clang::Type::ObjCObjectPointer: return ClangASTType (m_ast, cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType()).GetDeclContextForType();
5221 case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl();
5222 case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl();
5223 case clang::Type::Typedef: return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetDeclContextForType();
5224 case clang::Type::Elaborated: return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).GetDeclContextForType();
5225 case clang::Type::Paren: return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).GetDeclContextForType();
5226 case clang::Type::TypeOfExpr: break;
5227 case clang::Type::TypeOf: break;
5228 case clang::Type::Decltype: break;
5229 //case clang::Type::QualifiedName: break;
5230 case clang::Type::TemplateSpecialization: break;
5231 case clang::Type::DependentTemplateSpecialization: break;
5232 case clang::Type::TemplateTypeParm: break;
5233 case clang::Type::SubstTemplateTypeParm: break;
5234 case clang::Type::SubstTemplateTypeParmPack:break;
5235 case clang::Type::PackExpansion: break;
5236 case clang::Type::UnresolvedUsing: break;
5237 case clang::Type::Attributed: break;
5238 case clang::Type::Auto: break;
5239 case clang::Type::InjectedClassName: break;
5240 case clang::Type::DependentName: break;
5241 case clang::Type::Atomic: break;
5243 // pointer type decayed from an array or function type.
5244 case clang::Type::Decayed: break;
5246 // No DeclContext in this type...
5251 ClangASTType::SetDefaultAccessForRecordFields (int default_accessibility,
5252 int *assigned_accessibilities,
5253 size_t num_assigned_accessibilities)
5257 RecordDecl *record_decl = GetAsRecordDecl();
5261 RecordDecl::field_iterator field, field_end;
5262 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
5264 ++field, ++field_idx)
5266 // If no accessibility was assigned, assign the correct one
5267 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
5268 field->setAccess ((AccessSpecifier)default_accessibility);
5278 ClangASTType::SetHasExternalStorage (bool has_extern)
5283 QualType qual_type (GetCanonicalQualType());
5285 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5288 case clang::Type::Record:
5290 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5291 if (cxx_record_decl)
5293 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
5294 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
5300 case clang::Type::Enum:
5302 EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
5305 enum_decl->setHasExternalLexicalStorage (has_extern);
5306 enum_decl->setHasExternalVisibleStorage (has_extern);
5312 case clang::Type::ObjCObject:
5313 case clang::Type::ObjCInterface:
5315 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
5316 assert (objc_class_type);
5317 if (objc_class_type)
5319 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5321 if (class_interface_decl)
5323 class_interface_decl->setHasExternalLexicalStorage (has_extern);
5324 class_interface_decl->setHasExternalVisibleStorage (has_extern);
5331 case clang::Type::Typedef:
5332 return ClangASTType (m_ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()).SetHasExternalStorage (has_extern);
5334 case clang::Type::Elaborated:
5335 return ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).SetHasExternalStorage (has_extern);
5337 case clang::Type::Paren:
5338 return ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).SetHasExternalStorage (has_extern);
5347 ClangASTType::SetTagTypeKind (int kind) const
5351 QualType tag_qual_type(GetQualType());
5352 const clang::Type *clang_type = tag_qual_type.getTypePtr();
5355 const TagType *tag_type = dyn_cast<TagType>(clang_type);
5358 TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
5361 tag_decl->setTagKind ((TagDecl::TagKind)kind);
5371 #pragma mark TagDecl
5374 ClangASTType::StartTagDeclarationDefinition ()
5378 QualType qual_type (GetQualType());
5379 const clang::Type *t = qual_type.getTypePtr();
5382 const TagType *tag_type = dyn_cast<TagType>(t);
5385 TagDecl *tag_decl = tag_type->getDecl();
5388 tag_decl->startDefinition();
5393 const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(t);
5396 ObjCInterfaceDecl *interface_decl = object_type->getInterface();
5399 interface_decl->startDefinition();
5409 ClangASTType::CompleteTagDeclarationDefinition ()
5413 QualType qual_type (GetQualType());
5415 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5417 if (cxx_record_decl)
5419 cxx_record_decl->completeDefinition();
5424 const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
5428 EnumDecl *enum_decl = enum_type->getDecl();
5432 /// TODO This really needs to be fixed.
5434 unsigned NumPositiveBits = 1;
5435 unsigned NumNegativeBits = 0;
5437 QualType promotion_qual_type;
5438 // If the enum integer type is less than an integer in bit width,
5439 // then we must promote it to an integer size.
5440 if (m_ast->getTypeSize(enum_decl->getIntegerType()) < m_ast->getTypeSize(m_ast->IntTy))
5442 if (enum_decl->getIntegerType()->isSignedIntegerType())
5443 promotion_qual_type = m_ast->IntTy;
5445 promotion_qual_type = m_ast->UnsignedIntTy;
5448 promotion_qual_type = enum_decl->getIntegerType();
5450 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
5465 ClangASTType::AddEnumerationValueToEnumerationType (const ClangASTType &enumerator_clang_type,
5466 const Declaration &decl,
5469 uint32_t enum_value_bit_size)
5471 if (IsValid() && enumerator_clang_type.IsValid() && name && name[0])
5473 QualType enum_qual_type (GetCanonicalQualType());
5475 bool is_signed = false;
5476 enumerator_clang_type.IsIntegerType (is_signed);
5477 const clang::Type *clang_type = enum_qual_type.getTypePtr();
5480 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
5484 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
5485 enum_llvm_apsint = enum_value;
5486 EnumConstantDecl *enumerator_decl =
5487 EnumConstantDecl::Create (*m_ast,
5488 enum_type->getDecl(),
5490 name ? &m_ast->Idents.get(name) : NULL, // Identifier
5491 enumerator_clang_type.GetQualType(),
5495 if (enumerator_decl)
5497 enum_type->getDecl()->addDecl(enumerator_decl);
5499 #ifdef LLDB_CONFIGURATION_DEBUG
5500 VerifyDecl(enumerator_decl);
5513 ClangASTType::GetEnumerationIntegerType () const
5515 QualType enum_qual_type (GetCanonicalQualType());
5516 const clang::Type *clang_type = enum_qual_type.getTypePtr();
5519 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
5522 EnumDecl *enum_decl = enum_type->getDecl();
5524 return ClangASTType (m_ast, enum_decl->getIntegerType());
5527 return ClangASTType();
5531 ClangASTType::CreateMemberPointerType (const ClangASTType &pointee_type) const
5533 if (IsValid() && pointee_type.IsValid())
5535 return ClangASTType (m_ast, m_ast->getMemberPointerType (pointee_type.GetQualType(),
5536 GetQualType().getTypePtr()));
5538 return ClangASTType();
5543 ClangASTType::ConvertStringToFloatValue (const char *s, uint8_t *dst, size_t dst_size) const
5547 QualType qual_type (GetCanonicalQualType());
5549 bool is_complex = false;
5550 if (IsFloatingPointType (count, is_complex))
5552 // TODO: handle complex and vector types
5556 StringRef s_sref(s);
5557 APFloat ap_float(m_ast->getFloatTypeSemantics(qual_type), s_sref);
5559 const uint64_t bit_size = m_ast->getTypeSize (qual_type);
5560 const uint64_t byte_size = bit_size / 8;
5561 if (dst_size >= byte_size)
5563 if (bit_size == sizeof(float)*8)
5565 float float32 = ap_float.convertToFloat();
5566 ::memcpy (dst, &float32, byte_size);
5569 else if (bit_size >= 64)
5571 llvm::APInt ap_int(ap_float.bitcastToAPInt());
5572 ::memcpy (dst, ap_int.getRawData(), byte_size);
5583 //----------------------------------------------------------------------
5585 //----------------------------------------------------------------------
5586 #define DEPTH_INCREMENT 2
5589 ClangASTType::DumpValue (ExecutionContext *exe_ctx,
5591 lldb::Format format,
5592 const lldb_private::DataExtractor &data,
5593 lldb::offset_t data_byte_offset,
5594 size_t data_byte_size,
5595 uint32_t bitfield_bit_size,
5596 uint32_t bitfield_bit_offset,
5605 QualType qual_type(GetQualType());
5606 switch (qual_type->getTypeClass())
5608 case clang::Type::Record:
5609 if (GetCompleteType ())
5611 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
5612 const RecordDecl *record_decl = record_type->getDecl();
5613 assert(record_decl);
5614 uint32_t field_bit_offset = 0;
5615 uint32_t field_byte_offset = 0;
5616 const ASTRecordLayout &record_layout = m_ast->getASTRecordLayout(record_decl);
5617 uint32_t child_idx = 0;
5619 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
5620 if (cxx_record_decl)
5622 // We might have base classes to print out first
5623 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5624 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5625 base_class != base_class_end;
5628 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
5630 // Skip empty base classes
5631 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
5634 if (base_class->isVirtual())
5635 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
5637 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
5638 field_byte_offset = field_bit_offset / 8;
5639 assert (field_bit_offset % 8 == 0);
5645 QualType base_class_qual_type = base_class->getType();
5646 std::string base_class_type_name(base_class_qual_type.getAsString());
5648 // Indent and print the base class type name
5649 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
5651 std::pair<uint64_t, unsigned> base_class_type_info = m_ast->getTypeInfo(base_class_qual_type);
5653 // Dump the value of the member
5654 ClangASTType base_clang_type(m_ast, base_class_qual_type);
5655 base_clang_type.DumpValue (exe_ctx,
5656 s, // Stream to dump to
5657 base_clang_type.GetFormat(), // The format with which to display the member
5658 data, // Data buffer containing all bytes for this type
5659 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
5660 base_class_type_info.first / 8, // Size of this type in bytes
5661 0, // Bitfield bit size
5662 0, // Bitfield bit offset
5663 show_types, // Boolean indicating if we should show the variable types
5664 show_summary, // Boolean indicating if we should show a summary for the current type
5665 verbose, // Verbose output?
5666 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
5671 uint32_t field_idx = 0;
5672 RecordDecl::field_iterator field, field_end;
5673 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
5675 // Print the starting squiggly bracket (if this is the
5676 // first member) or comman (for member 2 and beyong) for
5677 // the struct/union/class member.
5684 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
5686 QualType field_type = field->getType();
5687 // Print the member type if requested
5688 // Figure out the type byte size (field_type_info.first) and
5689 // alignment (field_type_info.second) from the AST context.
5690 std::pair<uint64_t, unsigned> field_type_info = m_ast->getTypeInfo(field_type);
5691 assert(field_idx < record_layout.getFieldCount());
5692 // Figure out the field offset within the current struct/union/class type
5693 field_bit_offset = record_layout.getFieldOffset (field_idx);
5694 field_byte_offset = field_bit_offset / 8;
5695 uint32_t field_bitfield_bit_size = 0;
5696 uint32_t field_bitfield_bit_offset = 0;
5697 if (ClangASTContext::FieldIsBitfield (m_ast, *field, field_bitfield_bit_size))
5698 field_bitfield_bit_offset = field_bit_offset % 8;
5702 std::string field_type_name(field_type.getAsString());
5703 if (field_bitfield_bit_size > 0)
5704 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
5706 s->Printf("(%s) ", field_type_name.c_str());
5708 // Print the member name and equal sign
5709 s->Printf("%s = ", field->getNameAsString().c_str());
5712 // Dump the value of the member
5713 ClangASTType field_clang_type (m_ast, field_type);
5714 field_clang_type.DumpValue (exe_ctx,
5715 s, // Stream to dump to
5716 field_clang_type.GetFormat(), // The format with which to display the member
5717 data, // Data buffer containing all bytes for this type
5718 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
5719 field_type_info.first / 8, // Size of this type in bytes
5720 field_bitfield_bit_size, // Bitfield bit size
5721 field_bitfield_bit_offset, // Bitfield bit offset
5722 show_types, // Boolean indicating if we should show the variable types
5723 show_summary, // Boolean indicating if we should show a summary for the current type
5724 verbose, // Verbose output?
5725 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
5728 // Indent the trailing squiggly bracket
5730 s->Printf("\n%*s}", depth, "");
5734 case clang::Type::Enum:
5735 if (GetCompleteType ())
5737 const EnumType *enum_type = cast<EnumType>(qual_type.getTypePtr());
5738 const EnumDecl *enum_decl = enum_type->getDecl();
5740 EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
5741 lldb::offset_t offset = data_byte_offset;
5742 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
5743 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
5745 if (enum_pos->getInitVal() == enum_value)
5747 s->Printf("%s", enum_pos->getNameAsString().c_str());
5751 // If we have gotten here we didn't get find the enumerator in the
5752 // enum decl, so just print the integer.
5753 s->Printf("%" PRIi64, enum_value);
5757 case clang::Type::ConstantArray:
5759 const ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr());
5760 bool is_array_of_characters = false;
5761 QualType element_qual_type = array->getElementType();
5763 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
5765 is_array_of_characters = canonical_type->isCharType();
5767 const uint64_t element_count = array->getSize().getLimitedValue();
5769 std::pair<uint64_t, unsigned> field_type_info = m_ast->getTypeInfo(element_qual_type);
5771 uint32_t element_idx = 0;
5772 uint32_t element_offset = 0;
5773 uint64_t element_byte_size = field_type_info.first / 8;
5774 uint32_t element_stride = element_byte_size;
5776 if (is_array_of_characters)
5779 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
5785 ClangASTType element_clang_type(m_ast, element_qual_type);
5786 lldb::Format element_format = element_clang_type.GetFormat();
5788 for (element_idx = 0; element_idx < element_count; ++element_idx)
5790 // Print the starting squiggly bracket (if this is the
5791 // first member) or comman (for member 2 and beyong) for
5792 // the struct/union/class member.
5793 if (element_idx == 0)
5798 // Indent and print the index
5799 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
5801 // Figure out the field offset within the current struct/union/class type
5802 element_offset = element_idx * element_stride;
5804 // Dump the value of the member
5805 element_clang_type.DumpValue (exe_ctx,
5806 s, // Stream to dump to
5807 element_format, // The format with which to display the element
5808 data, // Data buffer containing all bytes for this type
5809 data_byte_offset + element_offset,// Offset into "data" where to grab value from
5810 element_byte_size, // Size of this type in bytes
5811 0, // Bitfield bit size
5812 0, // Bitfield bit offset
5813 show_types, // Boolean indicating if we should show the variable types
5814 show_summary, // Boolean indicating if we should show a summary for the current type
5815 verbose, // Verbose output?
5816 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
5819 // Indent the trailing squiggly bracket
5820 if (element_idx > 0)
5821 s->Printf("\n%*s}", depth, "");
5826 case clang::Type::Typedef:
5828 QualType typedef_qual_type = cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType();
5830 ClangASTType typedef_clang_type (m_ast, typedef_qual_type);
5831 lldb::Format typedef_format = typedef_clang_type.GetFormat();
5832 std::pair<uint64_t, unsigned> typedef_type_info = m_ast->getTypeInfo(typedef_qual_type);
5833 uint64_t typedef_byte_size = typedef_type_info.first / 8;
5835 return typedef_clang_type.DumpValue (exe_ctx,
5836 s, // Stream to dump to
5837 typedef_format, // The format with which to display the element
5838 data, // Data buffer containing all bytes for this type
5839 data_byte_offset, // Offset into "data" where to grab value from
5840 typedef_byte_size, // Size of this type in bytes
5841 bitfield_bit_size, // Bitfield bit size
5842 bitfield_bit_offset,// Bitfield bit offset
5843 show_types, // Boolean indicating if we should show the variable types
5844 show_summary, // Boolean indicating if we should show a summary for the current type
5845 verbose, // Verbose output?
5846 depth); // Scope depth for any types that have children
5850 case clang::Type::Elaborated:
5852 QualType elaborated_qual_type = cast<ElaboratedType>(qual_type)->getNamedType();
5853 ClangASTType elaborated_clang_type (m_ast, elaborated_qual_type);
5854 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
5855 std::pair<uint64_t, unsigned> elaborated_type_info = m_ast->getTypeInfo(elaborated_qual_type);
5856 uint64_t elaborated_byte_size = elaborated_type_info.first / 8;
5858 return elaborated_clang_type.DumpValue (exe_ctx,
5859 s, // Stream to dump to
5860 elaborated_format, // The format with which to display the element
5861 data, // Data buffer containing all bytes for this type
5862 data_byte_offset, // Offset into "data" where to grab value from
5863 elaborated_byte_size, // Size of this type in bytes
5864 bitfield_bit_size, // Bitfield bit size
5865 bitfield_bit_offset,// Bitfield bit offset
5866 show_types, // Boolean indicating if we should show the variable types
5867 show_summary, // Boolean indicating if we should show a summary for the current type
5868 verbose, // Verbose output?
5869 depth); // Scope depth for any types that have children
5873 case clang::Type::Paren:
5875 QualType desugar_qual_type = cast<ParenType>(qual_type)->desugar();
5876 ClangASTType desugar_clang_type (m_ast, desugar_qual_type);
5878 lldb::Format desugar_format = desugar_clang_type.GetFormat();
5879 std::pair<uint64_t, unsigned> desugar_type_info = m_ast->getTypeInfo(desugar_qual_type);
5880 uint64_t desugar_byte_size = desugar_type_info.first / 8;
5882 return desugar_clang_type.DumpValue (exe_ctx,
5883 s, // Stream to dump to
5884 desugar_format, // The format with which to display the element
5885 data, // Data buffer containing all bytes for this type
5886 data_byte_offset, // Offset into "data" where to grab value from
5887 desugar_byte_size, // Size of this type in bytes
5888 bitfield_bit_size, // Bitfield bit size
5889 bitfield_bit_offset,// Bitfield bit offset
5890 show_types, // Boolean indicating if we should show the variable types
5891 show_summary, // Boolean indicating if we should show a summary for the current type
5892 verbose, // Verbose output?
5893 depth); // Scope depth for any types that have children
5898 // We are down the a scalar type that we just need to display.
5905 LLDB_INVALID_ADDRESS,
5907 bitfield_bit_offset);
5910 DumpSummary (exe_ctx, s, data, data_byte_offset, data_byte_size);
5919 ClangASTType::DumpTypeValue (Stream *s,
5920 lldb::Format format,
5921 const lldb_private::DataExtractor &data,
5922 lldb::offset_t byte_offset,
5924 uint32_t bitfield_bit_size,
5925 uint32_t bitfield_bit_offset,
5926 ExecutionContextScope *exe_scope)
5930 if (IsAggregateType())
5936 QualType qual_type(GetQualType());
5938 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5941 case clang::Type::Typedef:
5943 QualType typedef_qual_type = cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType();
5944 ClangASTType typedef_clang_type (m_ast, typedef_qual_type);
5945 if (format == eFormatDefault)
5946 format = typedef_clang_type.GetFormat();
5947 std::pair<uint64_t, unsigned> typedef_type_info = m_ast->getTypeInfo(typedef_qual_type);
5948 uint64_t typedef_byte_size = typedef_type_info.first / 8;
5950 return typedef_clang_type.DumpTypeValue (s,
5951 format, // The format with which to display the element
5952 data, // Data buffer containing all bytes for this type
5953 byte_offset, // Offset into "data" where to grab value from
5954 typedef_byte_size, // Size of this type in bytes
5955 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
5956 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
5961 case clang::Type::Enum:
5962 // If our format is enum or default, show the enumeration value as
5963 // its enumeration string value, else just display it as requested.
5964 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType ())
5966 const EnumType *enum_type = cast<EnumType>(qual_type.getTypePtr());
5967 const EnumDecl *enum_decl = enum_type->getDecl();
5969 EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
5970 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
5971 lldb::offset_t offset = byte_offset;
5974 const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
5975 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
5977 if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
5979 s->PutCString (enum_pos->getNameAsString().c_str());
5983 // If we have gotten here we didn't get find the enumerator in the
5984 // enum decl, so just print the integer.
5985 s->Printf("%" PRIi64, enum_svalue);
5989 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
5990 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
5992 if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
5994 s->PutCString (enum_pos->getNameAsString().c_str());
5998 // If we have gotten here we didn't get find the enumerator in the
5999 // enum decl, so just print the integer.
6000 s->Printf("%" PRIu64, enum_uvalue);
6004 // format was not enum, just fall through and dump the value as requested....
6007 // We are down the a scalar type that we just need to display.
6009 uint32_t item_count = 1;
6010 // A few formats, we might need to modify our size and count for depending
6011 // on how we are trying to display the value...
6015 case eFormatBoolean:
6017 case eFormatComplex:
6018 case eFormatCString: // NULL terminated C strings
6019 case eFormatDecimal:
6022 case eFormatHexUppercase:
6026 case eFormatUnsigned:
6027 case eFormatPointer:
6028 case eFormatVectorOfChar:
6029 case eFormatVectorOfSInt8:
6030 case eFormatVectorOfUInt8:
6031 case eFormatVectorOfSInt16:
6032 case eFormatVectorOfUInt16:
6033 case eFormatVectorOfSInt32:
6034 case eFormatVectorOfUInt32:
6035 case eFormatVectorOfSInt64:
6036 case eFormatVectorOfUInt64:
6037 case eFormatVectorOfFloat32:
6038 case eFormatVectorOfFloat64:
6039 case eFormatVectorOfUInt128:
6043 case eFormatCharPrintable:
6044 case eFormatCharArray:
6046 case eFormatBytesWithASCII:
6047 item_count = byte_size;
6051 case eFormatUnicode16:
6052 item_count = byte_size / 2;
6056 case eFormatUnicode32:
6057 item_count = byte_size / 4;
6061 return data.Dump (s,
6067 LLDB_INVALID_ADDRESS,
6069 bitfield_bit_offset,
6081 ClangASTType::DumpSummary (ExecutionContext *exe_ctx,
6083 const lldb_private::DataExtractor &data,
6084 lldb::offset_t data_byte_offset,
6085 size_t data_byte_size)
6087 uint32_t length = 0;
6088 if (IsCStringType (length))
6092 Process *process = exe_ctx->GetProcessPtr();
6095 lldb::offset_t offset = data_byte_offset;
6096 lldb::addr_t pointer_addresss = data.GetMaxU64(&offset, data_byte_size);
6097 std::vector<uint8_t> buf;
6099 buf.resize (length);
6103 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
6106 size_t total_cstr_len = 0;
6108 while ((bytes_read = process->ReadMemory (pointer_addresss, &buf.front(), buf.size(), error)) > 0)
6110 const size_t len = strlen((const char *)&buf.front());
6113 if (total_cstr_len == 0)
6114 s->PutCString (" \"");
6115 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
6116 total_cstr_len += len;
6117 if (len < buf.size())
6119 pointer_addresss += total_cstr_len;
6121 if (total_cstr_len > 0)
6129 ClangASTType::DumpTypeDescription () const
6131 StreamFile s (stdout, false);
6132 DumpTypeDescription (&s);
6133 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (m_ast, m_type);
6136 metadata->Dump (&s);
6141 ClangASTType::DumpTypeDescription (Stream *s) const
6145 QualType qual_type(GetQualType());
6147 SmallVector<char, 1024> buf;
6148 raw_svector_ostream llvm_ostrm (buf);
6150 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6153 case clang::Type::ObjCObject:
6154 case clang::Type::ObjCInterface:
6158 const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
6159 assert (objc_class_type);
6160 if (objc_class_type)
6162 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6163 if (class_interface_decl)
6165 PrintingPolicy policy = m_ast->getPrintingPolicy();
6166 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
6172 case clang::Type::Typedef:
6174 const TypedefType *typedef_type = qual_type->getAs<TypedefType>();
6177 const TypedefNameDecl *typedef_decl = typedef_type->getDecl();
6178 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
6179 if (!clang_typedef_name.empty())
6181 s->PutCString ("typedef ");
6182 s->PutCString (clang_typedef_name.c_str());
6188 case clang::Type::Elaborated:
6189 ClangASTType (m_ast, cast<ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
6192 case clang::Type::Paren:
6193 ClangASTType (m_ast, cast<ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
6196 case clang::Type::Record:
6200 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
6201 const RecordDecl *record_decl = record_type->getDecl();
6202 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
6204 if (cxx_record_decl)
6205 cxx_record_decl->print(llvm_ostrm, m_ast->getPrintingPolicy(), s->GetIndentLevel());
6207 record_decl->print(llvm_ostrm, m_ast->getPrintingPolicy(), s->GetIndentLevel());
6213 const TagType *tag_type = dyn_cast<TagType>(qual_type.getTypePtr());
6216 TagDecl *tag_decl = tag_type->getDecl();
6218 tag_decl->print(llvm_ostrm, 0);
6222 std::string clang_type_name(qual_type.getAsString());
6223 if (!clang_type_name.empty())
6224 s->PutCString (clang_type_name.c_str());
6232 s->Write (buf.data(), buf.size());
6238 ClangASTType::GetValueAsScalar (const lldb_private::DataExtractor &data,
6239 lldb::offset_t data_byte_offset,
6240 size_t data_byte_size,
6241 Scalar &value) const
6246 if (IsAggregateType ())
6248 return false; // Aggregate types don't have scalar values
6253 lldb::Encoding encoding = GetEncoding (count);
6255 if (encoding == lldb::eEncodingInvalid || count != 1)
6258 const uint64_t byte_size = GetByteSize();
6259 lldb::offset_t offset = data_byte_offset;
6262 case lldb::eEncodingInvalid:
6264 case lldb::eEncodingVector:
6266 case lldb::eEncodingUint:
6267 if (byte_size <= sizeof(unsigned long long))
6269 uint64_t uval64 = data.GetMaxU64 (&offset, byte_size);
6270 if (byte_size <= sizeof(unsigned int))
6272 value = (unsigned int)uval64;
6275 else if (byte_size <= sizeof(unsigned long))
6277 value = (unsigned long)uval64;
6280 else if (byte_size <= sizeof(unsigned long long))
6282 value = (unsigned long long )uval64;
6290 case lldb::eEncodingSint:
6291 if (byte_size <= sizeof(long long))
6293 int64_t sval64 = data.GetMaxS64 (&offset, byte_size);
6294 if (byte_size <= sizeof(int))
6296 value = (int)sval64;
6299 else if (byte_size <= sizeof(long))
6301 value = (long)sval64;
6304 else if (byte_size <= sizeof(long long))
6306 value = (long long )sval64;
6314 case lldb::eEncodingIEEE754:
6315 if (byte_size <= sizeof(long double))
6319 if (byte_size == sizeof(float))
6321 if (sizeof(float) == sizeof(uint32_t))
6323 u32 = data.GetU32(&offset);
6324 value = *((float *)&u32);
6327 else if (sizeof(float) == sizeof(uint64_t))
6329 u64 = data.GetU64(&offset);
6330 value = *((float *)&u64);
6335 if (byte_size == sizeof(double))
6337 if (sizeof(double) == sizeof(uint32_t))
6339 u32 = data.GetU32(&offset);
6340 value = *((double *)&u32);
6343 else if (sizeof(double) == sizeof(uint64_t))
6345 u64 = data.GetU64(&offset);
6346 value = *((double *)&u64);
6351 if (byte_size == sizeof(long double))
6353 if (sizeof(long double) == sizeof(uint32_t))
6355 u32 = data.GetU32(&offset);
6356 value = *((long double *)&u32);
6359 else if (sizeof(long double) == sizeof(uint64_t))
6361 u64 = data.GetU64(&offset);
6362 value = *((long double *)&u64);
6374 ClangASTType::SetValueFromScalar (const Scalar &value, Stream &strm)
6376 // Aggregate types don't have scalar values
6377 if (!IsAggregateType ())
6379 strm.GetFlags().Set(Stream::eBinary);
6381 lldb::Encoding encoding = GetEncoding (count);
6383 if (encoding == lldb::eEncodingInvalid || count != 1)
6386 const uint64_t bit_width = GetBitSize();
6387 // This function doesn't currently handle non-byte aligned assignments
6388 if ((bit_width % 8) != 0)
6391 const uint64_t byte_size = (bit_width + 7 ) / 8;
6394 case lldb::eEncodingInvalid:
6396 case lldb::eEncodingVector:
6398 case lldb::eEncodingUint:
6401 case 1: strm.PutHex8(value.UInt()); return true;
6402 case 2: strm.PutHex16(value.UInt()); return true;
6403 case 4: strm.PutHex32(value.UInt()); return true;
6404 case 8: strm.PutHex64(value.ULongLong()); return true;
6410 case lldb::eEncodingSint:
6413 case 1: strm.PutHex8(value.SInt()); return true;
6414 case 2: strm.PutHex16(value.SInt()); return true;
6415 case 4: strm.PutHex32(value.SInt()); return true;
6416 case 8: strm.PutHex64(value.SLongLong()); return true;
6422 case lldb::eEncodingIEEE754:
6423 if (byte_size <= sizeof(long double))
6425 if (byte_size == sizeof(float))
6427 strm.PutFloat(value.Float());
6431 if (byte_size == sizeof(double))
6433 strm.PutDouble(value.Double());
6437 if (byte_size == sizeof(long double))
6439 strm.PutDouble(value.LongDouble());
6450 ClangASTType::ReadFromMemory (lldb_private::ExecutionContext *exe_ctx,
6452 AddressType address_type,
6453 lldb_private::DataExtractor &data)
6458 // Can't convert a file address to anything valid without more
6459 // context (which Module it came from)
6460 if (address_type == eAddressTypeFile)
6463 if (!GetCompleteType())
6466 const uint64_t byte_size = GetByteSize();
6467 if (data.GetByteSize() < byte_size)
6469 lldb::DataBufferSP data_sp(new DataBufferHeap (byte_size, '\0'));
6470 data.SetData(data_sp);
6473 uint8_t* dst = (uint8_t*)data.PeekData(0, byte_size);
6476 if (address_type == eAddressTypeHost)
6480 // The address is an address in this process, so just copy it
6481 memcpy (dst, (uint8_t*)NULL + addr, byte_size);
6486 Process *process = NULL;
6488 process = exe_ctx->GetProcessPtr();
6492 return process->ReadMemory(addr, dst, byte_size, error) == byte_size;
6500 ClangASTType::WriteToMemory (lldb_private::ExecutionContext *exe_ctx,
6502 AddressType address_type,
6503 StreamString &new_value)
6508 // Can't convert a file address to anything valid without more
6509 // context (which Module it came from)
6510 if (address_type == eAddressTypeFile)
6513 if (!GetCompleteType())
6516 const uint64_t byte_size = GetByteSize();
6520 if (address_type == eAddressTypeHost)
6522 // The address is an address in this process, so just copy it
6523 memcpy ((void *)addr, new_value.GetData(), byte_size);
6528 Process *process = NULL;
6530 process = exe_ctx->GetProcessPtr();
6534 return process->WriteMemory(addr, new_value.GetData(), byte_size, error) == byte_size;
6543 //ClangASTType::GetAsCXXRecordDecl (lldb::clang_type_t opaque_clang_qual_type)
6545 // if (opaque_clang_qual_type)
6546 // return QualType::getFromOpaquePtr(opaque_clang_qual_type)->getAsCXXRecordDecl();
6551 lldb_private::operator == (const lldb_private::ClangASTType &lhs, const lldb_private::ClangASTType &rhs)
6553 return lhs.GetASTContext() == rhs.GetASTContext() && lhs.GetOpaqueQualType() == rhs.GetOpaqueQualType();
6558 lldb_private::operator != (const lldb_private::ClangASTType &lhs, const lldb_private::ClangASTType &rhs)
6560 return lhs.GetASTContext() != rhs.GetASTContext() || lhs.GetOpaqueQualType() != rhs.GetOpaqueQualType();