1 //===--- ASTContext.cpp - Context to hold long-lived AST nodes ------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the ASTContext interface. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/AST/ASTContext.h" 15 #include "clang/AST/CharUnits.h" 16 #include "clang/AST/DeclCXX.h" 17 #include "clang/AST/DeclObjC.h" 18 #include "clang/AST/DeclTemplate.h" 19 #include "clang/AST/TypeLoc.h" 20 #include "clang/AST/Expr.h" 21 #include "clang/AST/ExprCXX.h" 22 #include "clang/AST/ExternalASTSource.h" 23 #include "clang/AST/ASTMutationListener.h" 24 #include "clang/AST/RecordLayout.h" 25 #include "clang/AST/Mangle.h" 26 #include "clang/Basic/Builtins.h" 27 #include "clang/Basic/SourceManager.h" 28 #include "clang/Basic/TargetInfo.h" 29 #include "llvm/ADT/SmallString.h" 30 #include "llvm/ADT/StringExtras.h" 31 #include "llvm/Support/MathExtras.h" 32 #include "llvm/Support/raw_ostream.h" 33 #include "CXXABI.h" 34 #include <map> 35 36 using namespace clang; 37 38 unsigned ASTContext::NumImplicitDefaultConstructors; 39 unsigned ASTContext::NumImplicitDefaultConstructorsDeclared; 40 unsigned ASTContext::NumImplicitCopyConstructors; 41 unsigned ASTContext::NumImplicitCopyConstructorsDeclared; 42 unsigned ASTContext::NumImplicitMoveConstructors; 43 unsigned ASTContext::NumImplicitMoveConstructorsDeclared; 44 unsigned ASTContext::NumImplicitCopyAssignmentOperators; 45 unsigned ASTContext::NumImplicitCopyAssignmentOperatorsDeclared; 46 unsigned ASTContext::NumImplicitMoveAssignmentOperators; 47 unsigned ASTContext::NumImplicitMoveAssignmentOperatorsDeclared; 48 unsigned ASTContext::NumImplicitDestructors; 49 unsigned ASTContext::NumImplicitDestructorsDeclared; 50 51 enum FloatingRank { 52 FloatRank, DoubleRank, LongDoubleRank 53 }; 54 55 void 56 ASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID, 57 TemplateTemplateParmDecl *Parm) { 58 ID.AddInteger(Parm->getDepth()); 59 ID.AddInteger(Parm->getPosition()); 60 ID.AddBoolean(Parm->isParameterPack()); 61 62 TemplateParameterList *Params = Parm->getTemplateParameters(); 63 ID.AddInteger(Params->size()); 64 for (TemplateParameterList::const_iterator P = Params->begin(), 65 PEnd = Params->end(); 66 P != PEnd; ++P) { 67 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 68 ID.AddInteger(0); 69 ID.AddBoolean(TTP->isParameterPack()); 70 continue; 71 } 72 73 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 74 ID.AddInteger(1); 75 ID.AddBoolean(NTTP->isParameterPack()); 76 ID.AddPointer(NTTP->getType().getAsOpaquePtr()); 77 if (NTTP->isExpandedParameterPack()) { 78 ID.AddBoolean(true); 79 ID.AddInteger(NTTP->getNumExpansionTypes()); 80 for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) 81 ID.AddPointer(NTTP->getExpansionType(I).getAsOpaquePtr()); 82 } else 83 ID.AddBoolean(false); 84 continue; 85 } 86 87 TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*P); 88 ID.AddInteger(2); 89 Profile(ID, TTP); 90 } 91 } 92 93 TemplateTemplateParmDecl * 94 ASTContext::getCanonicalTemplateTemplateParmDecl( 95 TemplateTemplateParmDecl *TTP) const { 96 // Check if we already have a canonical template template parameter. 97 llvm::FoldingSetNodeID ID; 98 CanonicalTemplateTemplateParm::Profile(ID, TTP); 99 void *InsertPos = 0; 100 CanonicalTemplateTemplateParm *Canonical 101 = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos); 102 if (Canonical) 103 return Canonical->getParam(); 104 105 // Build a canonical template parameter list. 106 TemplateParameterList *Params = TTP->getTemplateParameters(); 107 llvm::SmallVector<NamedDecl *, 4> CanonParams; 108 CanonParams.reserve(Params->size()); 109 for (TemplateParameterList::const_iterator P = Params->begin(), 110 PEnd = Params->end(); 111 P != PEnd; ++P) { 112 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) 113 CanonParams.push_back( 114 TemplateTypeParmDecl::Create(*this, getTranslationUnitDecl(), 115 SourceLocation(), 116 SourceLocation(), 117 TTP->getDepth(), 118 TTP->getIndex(), 0, false, 119 TTP->isParameterPack())); 120 else if (NonTypeTemplateParmDecl *NTTP 121 = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 122 QualType T = getCanonicalType(NTTP->getType()); 123 TypeSourceInfo *TInfo = getTrivialTypeSourceInfo(T); 124 NonTypeTemplateParmDecl *Param; 125 if (NTTP->isExpandedParameterPack()) { 126 llvm::SmallVector<QualType, 2> ExpandedTypes; 127 llvm::SmallVector<TypeSourceInfo *, 2> ExpandedTInfos; 128 for (unsigned I = 0, N = NTTP->getNumExpansionTypes(); I != N; ++I) { 129 ExpandedTypes.push_back(getCanonicalType(NTTP->getExpansionType(I))); 130 ExpandedTInfos.push_back( 131 getTrivialTypeSourceInfo(ExpandedTypes.back())); 132 } 133 134 Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 135 SourceLocation(), 136 SourceLocation(), 137 NTTP->getDepth(), 138 NTTP->getPosition(), 0, 139 T, 140 TInfo, 141 ExpandedTypes.data(), 142 ExpandedTypes.size(), 143 ExpandedTInfos.data()); 144 } else { 145 Param = NonTypeTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 146 SourceLocation(), 147 SourceLocation(), 148 NTTP->getDepth(), 149 NTTP->getPosition(), 0, 150 T, 151 NTTP->isParameterPack(), 152 TInfo); 153 } 154 CanonParams.push_back(Param); 155 156 } else 157 CanonParams.push_back(getCanonicalTemplateTemplateParmDecl( 158 cast<TemplateTemplateParmDecl>(*P))); 159 } 160 161 TemplateTemplateParmDecl *CanonTTP 162 = TemplateTemplateParmDecl::Create(*this, getTranslationUnitDecl(), 163 SourceLocation(), TTP->getDepth(), 164 TTP->getPosition(), 165 TTP->isParameterPack(), 166 0, 167 TemplateParameterList::Create(*this, SourceLocation(), 168 SourceLocation(), 169 CanonParams.data(), 170 CanonParams.size(), 171 SourceLocation())); 172 173 // Get the new insert position for the node we care about. 174 Canonical = CanonTemplateTemplateParms.FindNodeOrInsertPos(ID, InsertPos); 175 assert(Canonical == 0 && "Shouldn't be in the map!"); 176 (void)Canonical; 177 178 // Create the canonical template template parameter entry. 179 Canonical = new (*this) CanonicalTemplateTemplateParm(CanonTTP); 180 CanonTemplateTemplateParms.InsertNode(Canonical, InsertPos); 181 return CanonTTP; 182 } 183 184 CXXABI *ASTContext::createCXXABI(const TargetInfo &T) { 185 if (!LangOpts.CPlusPlus) return 0; 186 187 switch (T.getCXXABI()) { 188 case CXXABI_ARM: 189 return CreateARMCXXABI(*this); 190 case CXXABI_Itanium: 191 return CreateItaniumCXXABI(*this); 192 case CXXABI_Microsoft: 193 return CreateMicrosoftCXXABI(*this); 194 } 195 return 0; 196 } 197 198 static const LangAS::Map &getAddressSpaceMap(const TargetInfo &T, 199 const LangOptions &LOpts) { 200 if (LOpts.FakeAddressSpaceMap) { 201 // The fake address space map must have a distinct entry for each 202 // language-specific address space. 203 static const unsigned FakeAddrSpaceMap[] = { 204 1, // opencl_global 205 2, // opencl_local 206 3 // opencl_constant 207 }; 208 return FakeAddrSpaceMap; 209 } else { 210 return T.getAddressSpaceMap(); 211 } 212 } 213 214 ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM, 215 const TargetInfo &t, 216 IdentifierTable &idents, SelectorTable &sels, 217 Builtin::Context &builtins, 218 unsigned size_reserve) : 219 FunctionProtoTypes(this_()), 220 TemplateSpecializationTypes(this_()), 221 DependentTemplateSpecializationTypes(this_()), 222 SubstTemplateTemplateParmPacks(this_()), 223 GlobalNestedNameSpecifier(0), IsInt128Installed(false), 224 CFConstantStringTypeDecl(0), NSConstantStringTypeDecl(0), 225 ObjCFastEnumerationStateTypeDecl(0), FILEDecl(0), 226 jmp_bufDecl(0), sigjmp_bufDecl(0), BlockDescriptorType(0), 227 BlockDescriptorExtendedType(0), cudaConfigureCallDecl(0), 228 NullTypeSourceInfo(QualType()), 229 SourceMgr(SM), LangOpts(LOpts), ABI(createCXXABI(t)), 230 AddrSpaceMap(getAddressSpaceMap(t, LOpts)), Target(t), 231 Idents(idents), Selectors(sels), 232 BuiltinInfo(builtins), 233 DeclarationNames(*this), 234 ExternalSource(0), Listener(0), PrintingPolicy(LOpts), 235 LastSDM(0, 0), 236 UniqueBlockByRefTypeID(0) { 237 ObjCIdRedefinitionType = QualType(); 238 ObjCClassRedefinitionType = QualType(); 239 ObjCSelRedefinitionType = QualType(); 240 if (size_reserve > 0) Types.reserve(size_reserve); 241 TUDecl = TranslationUnitDecl::Create(*this); 242 InitBuiltinTypes(); 243 } 244 245 ASTContext::~ASTContext() { 246 // Release the DenseMaps associated with DeclContext objects. 247 // FIXME: Is this the ideal solution? 248 ReleaseDeclContextMaps(); 249 250 // Call all of the deallocation functions. 251 for (unsigned I = 0, N = Deallocations.size(); I != N; ++I) 252 Deallocations[I].first(Deallocations[I].second); 253 254 // Release all of the memory associated with overridden C++ methods. 255 for (llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::iterator 256 OM = OverriddenMethods.begin(), OMEnd = OverriddenMethods.end(); 257 OM != OMEnd; ++OM) 258 OM->second.Destroy(); 259 260 // ASTRecordLayout objects in ASTRecordLayouts must always be destroyed 261 // because they can contain DenseMaps. 262 for (llvm::DenseMap<const ObjCContainerDecl*, 263 const ASTRecordLayout*>::iterator 264 I = ObjCLayouts.begin(), E = ObjCLayouts.end(); I != E; ) 265 // Increment in loop to prevent using deallocated memory. 266 if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) 267 R->Destroy(*this); 268 269 for (llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>::iterator 270 I = ASTRecordLayouts.begin(), E = ASTRecordLayouts.end(); I != E; ) { 271 // Increment in loop to prevent using deallocated memory. 272 if (ASTRecordLayout *R = const_cast<ASTRecordLayout*>((I++)->second)) 273 R->Destroy(*this); 274 } 275 276 for (llvm::DenseMap<const Decl*, AttrVec*>::iterator A = DeclAttrs.begin(), 277 AEnd = DeclAttrs.end(); 278 A != AEnd; ++A) 279 A->second->~AttrVec(); 280 } 281 282 void ASTContext::AddDeallocation(void (*Callback)(void*), void *Data) { 283 Deallocations.push_back(std::make_pair(Callback, Data)); 284 } 285 286 void 287 ASTContext::setExternalSource(llvm::OwningPtr<ExternalASTSource> &Source) { 288 ExternalSource.reset(Source.take()); 289 } 290 291 void ASTContext::PrintStats() const { 292 llvm::errs() << "\n*** AST Context Stats:\n"; 293 llvm::errs() << " " << Types.size() << " types total.\n"; 294 295 unsigned counts[] = { 296 #define TYPE(Name, Parent) 0, 297 #define ABSTRACT_TYPE(Name, Parent) 298 #include "clang/AST/TypeNodes.def" 299 0 // Extra 300 }; 301 302 for (unsigned i = 0, e = Types.size(); i != e; ++i) { 303 Type *T = Types[i]; 304 counts[(unsigned)T->getTypeClass()]++; 305 } 306 307 unsigned Idx = 0; 308 unsigned TotalBytes = 0; 309 #define TYPE(Name, Parent) \ 310 if (counts[Idx]) \ 311 llvm::errs() << " " << counts[Idx] << " " << #Name \ 312 << " types\n"; \ 313 TotalBytes += counts[Idx] * sizeof(Name##Type); \ 314 ++Idx; 315 #define ABSTRACT_TYPE(Name, Parent) 316 #include "clang/AST/TypeNodes.def" 317 318 llvm::errs() << "Total bytes = " << TotalBytes << "\n"; 319 320 // Implicit special member functions. 321 llvm::errs() << NumImplicitDefaultConstructorsDeclared << "/" 322 << NumImplicitDefaultConstructors 323 << " implicit default constructors created\n"; 324 llvm::errs() << NumImplicitCopyConstructorsDeclared << "/" 325 << NumImplicitCopyConstructors 326 << " implicit copy constructors created\n"; 327 if (getLangOptions().CPlusPlus) 328 llvm::errs() << NumImplicitMoveConstructorsDeclared << "/" 329 << NumImplicitMoveConstructors 330 << " implicit move constructors created\n"; 331 llvm::errs() << NumImplicitCopyAssignmentOperatorsDeclared << "/" 332 << NumImplicitCopyAssignmentOperators 333 << " implicit copy assignment operators created\n"; 334 if (getLangOptions().CPlusPlus) 335 llvm::errs() << NumImplicitMoveAssignmentOperatorsDeclared << "/" 336 << NumImplicitMoveAssignmentOperators 337 << " implicit move assignment operators created\n"; 338 llvm::errs() << NumImplicitDestructorsDeclared << "/" 339 << NumImplicitDestructors 340 << " implicit destructors created\n"; 341 342 if (ExternalSource.get()) { 343 llvm::errs() << "\n"; 344 ExternalSource->PrintStats(); 345 } 346 347 BumpAlloc.PrintStats(); 348 } 349 350 351 void ASTContext::InitBuiltinType(CanQualType &R, BuiltinType::Kind K) { 352 BuiltinType *Ty = new (*this, TypeAlignment) BuiltinType(K); 353 R = CanQualType::CreateUnsafe(QualType(Ty, 0)); 354 Types.push_back(Ty); 355 } 356 357 void ASTContext::InitBuiltinTypes() { 358 assert(VoidTy.isNull() && "Context reinitialized?"); 359 360 // C99 6.2.5p19. 361 InitBuiltinType(VoidTy, BuiltinType::Void); 362 363 // C99 6.2.5p2. 364 InitBuiltinType(BoolTy, BuiltinType::Bool); 365 // C99 6.2.5p3. 366 if (LangOpts.CharIsSigned) 367 InitBuiltinType(CharTy, BuiltinType::Char_S); 368 else 369 InitBuiltinType(CharTy, BuiltinType::Char_U); 370 // C99 6.2.5p4. 371 InitBuiltinType(SignedCharTy, BuiltinType::SChar); 372 InitBuiltinType(ShortTy, BuiltinType::Short); 373 InitBuiltinType(IntTy, BuiltinType::Int); 374 InitBuiltinType(LongTy, BuiltinType::Long); 375 InitBuiltinType(LongLongTy, BuiltinType::LongLong); 376 377 // C99 6.2.5p6. 378 InitBuiltinType(UnsignedCharTy, BuiltinType::UChar); 379 InitBuiltinType(UnsignedShortTy, BuiltinType::UShort); 380 InitBuiltinType(UnsignedIntTy, BuiltinType::UInt); 381 InitBuiltinType(UnsignedLongTy, BuiltinType::ULong); 382 InitBuiltinType(UnsignedLongLongTy, BuiltinType::ULongLong); 383 384 // C99 6.2.5p10. 385 InitBuiltinType(FloatTy, BuiltinType::Float); 386 InitBuiltinType(DoubleTy, BuiltinType::Double); 387 InitBuiltinType(LongDoubleTy, BuiltinType::LongDouble); 388 389 // GNU extension, 128-bit integers. 390 InitBuiltinType(Int128Ty, BuiltinType::Int128); 391 InitBuiltinType(UnsignedInt128Ty, BuiltinType::UInt128); 392 393 if (LangOpts.CPlusPlus) { // C++ 3.9.1p5 394 if (TargetInfo::isTypeSigned(Target.getWCharType())) 395 InitBuiltinType(WCharTy, BuiltinType::WChar_S); 396 else // -fshort-wchar makes wchar_t be unsigned. 397 InitBuiltinType(WCharTy, BuiltinType::WChar_U); 398 } else // C99 399 WCharTy = getFromTargetType(Target.getWCharType()); 400 401 if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++ 402 InitBuiltinType(Char16Ty, BuiltinType::Char16); 403 else // C99 404 Char16Ty = getFromTargetType(Target.getChar16Type()); 405 406 if (LangOpts.CPlusPlus) // C++0x 3.9.1p5, extension for C++ 407 InitBuiltinType(Char32Ty, BuiltinType::Char32); 408 else // C99 409 Char32Ty = getFromTargetType(Target.getChar32Type()); 410 411 // Placeholder type for type-dependent expressions whose type is 412 // completely unknown. No code should ever check a type against 413 // DependentTy and users should never see it; however, it is here to 414 // help diagnose failures to properly check for type-dependent 415 // expressions. 416 InitBuiltinType(DependentTy, BuiltinType::Dependent); 417 418 // Placeholder type for functions. 419 InitBuiltinType(OverloadTy, BuiltinType::Overload); 420 421 // Placeholder type for bound members. 422 InitBuiltinType(BoundMemberTy, BuiltinType::BoundMember); 423 424 // "any" type; useful for debugger-like clients. 425 InitBuiltinType(UnknownAnyTy, BuiltinType::UnknownAny); 426 427 // C99 6.2.5p11. 428 FloatComplexTy = getComplexType(FloatTy); 429 DoubleComplexTy = getComplexType(DoubleTy); 430 LongDoubleComplexTy = getComplexType(LongDoubleTy); 431 432 BuiltinVaListType = QualType(); 433 434 // "Builtin" typedefs set by Sema::ActOnTranslationUnitScope(). 435 ObjCIdTypedefType = QualType(); 436 ObjCClassTypedefType = QualType(); 437 ObjCSelTypedefType = QualType(); 438 439 // Builtin types for 'id', 'Class', and 'SEL'. 440 InitBuiltinType(ObjCBuiltinIdTy, BuiltinType::ObjCId); 441 InitBuiltinType(ObjCBuiltinClassTy, BuiltinType::ObjCClass); 442 InitBuiltinType(ObjCBuiltinSelTy, BuiltinType::ObjCSel); 443 444 ObjCConstantStringType = QualType(); 445 446 // void * type 447 VoidPtrTy = getPointerType(VoidTy); 448 449 // nullptr type (C++0x 2.14.7) 450 InitBuiltinType(NullPtrTy, BuiltinType::NullPtr); 451 } 452 453 Diagnostic &ASTContext::getDiagnostics() const { 454 return SourceMgr.getDiagnostics(); 455 } 456 457 AttrVec& ASTContext::getDeclAttrs(const Decl *D) { 458 AttrVec *&Result = DeclAttrs[D]; 459 if (!Result) { 460 void *Mem = Allocate(sizeof(AttrVec)); 461 Result = new (Mem) AttrVec; 462 } 463 464 return *Result; 465 } 466 467 /// \brief Erase the attributes corresponding to the given declaration. 468 void ASTContext::eraseDeclAttrs(const Decl *D) { 469 llvm::DenseMap<const Decl*, AttrVec*>::iterator Pos = DeclAttrs.find(D); 470 if (Pos != DeclAttrs.end()) { 471 Pos->second->~AttrVec(); 472 DeclAttrs.erase(Pos); 473 } 474 } 475 476 MemberSpecializationInfo * 477 ASTContext::getInstantiatedFromStaticDataMember(const VarDecl *Var) { 478 assert(Var->isStaticDataMember() && "Not a static data member"); 479 llvm::DenseMap<const VarDecl *, MemberSpecializationInfo *>::iterator Pos 480 = InstantiatedFromStaticDataMember.find(Var); 481 if (Pos == InstantiatedFromStaticDataMember.end()) 482 return 0; 483 484 return Pos->second; 485 } 486 487 void 488 ASTContext::setInstantiatedFromStaticDataMember(VarDecl *Inst, VarDecl *Tmpl, 489 TemplateSpecializationKind TSK, 490 SourceLocation PointOfInstantiation) { 491 assert(Inst->isStaticDataMember() && "Not a static data member"); 492 assert(Tmpl->isStaticDataMember() && "Not a static data member"); 493 assert(!InstantiatedFromStaticDataMember[Inst] && 494 "Already noted what static data member was instantiated from"); 495 InstantiatedFromStaticDataMember[Inst] 496 = new (*this) MemberSpecializationInfo(Tmpl, TSK, PointOfInstantiation); 497 } 498 499 NamedDecl * 500 ASTContext::getInstantiatedFromUsingDecl(UsingDecl *UUD) { 501 llvm::DenseMap<UsingDecl *, NamedDecl *>::const_iterator Pos 502 = InstantiatedFromUsingDecl.find(UUD); 503 if (Pos == InstantiatedFromUsingDecl.end()) 504 return 0; 505 506 return Pos->second; 507 } 508 509 void 510 ASTContext::setInstantiatedFromUsingDecl(UsingDecl *Inst, NamedDecl *Pattern) { 511 assert((isa<UsingDecl>(Pattern) || 512 isa<UnresolvedUsingValueDecl>(Pattern) || 513 isa<UnresolvedUsingTypenameDecl>(Pattern)) && 514 "pattern decl is not a using decl"); 515 assert(!InstantiatedFromUsingDecl[Inst] && "pattern already exists"); 516 InstantiatedFromUsingDecl[Inst] = Pattern; 517 } 518 519 UsingShadowDecl * 520 ASTContext::getInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst) { 521 llvm::DenseMap<UsingShadowDecl*, UsingShadowDecl*>::const_iterator Pos 522 = InstantiatedFromUsingShadowDecl.find(Inst); 523 if (Pos == InstantiatedFromUsingShadowDecl.end()) 524 return 0; 525 526 return Pos->second; 527 } 528 529 void 530 ASTContext::setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, 531 UsingShadowDecl *Pattern) { 532 assert(!InstantiatedFromUsingShadowDecl[Inst] && "pattern already exists"); 533 InstantiatedFromUsingShadowDecl[Inst] = Pattern; 534 } 535 536 FieldDecl *ASTContext::getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) { 537 llvm::DenseMap<FieldDecl *, FieldDecl *>::iterator Pos 538 = InstantiatedFromUnnamedFieldDecl.find(Field); 539 if (Pos == InstantiatedFromUnnamedFieldDecl.end()) 540 return 0; 541 542 return Pos->second; 543 } 544 545 void ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, 546 FieldDecl *Tmpl) { 547 assert(!Inst->getDeclName() && "Instantiated field decl is not unnamed"); 548 assert(!Tmpl->getDeclName() && "Template field decl is not unnamed"); 549 assert(!InstantiatedFromUnnamedFieldDecl[Inst] && 550 "Already noted what unnamed field was instantiated from"); 551 552 InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl; 553 } 554 555 bool ASTContext::ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD, 556 const FieldDecl *LastFD) const { 557 return (FD->isBitField() && LastFD && !LastFD->isBitField() && 558 FD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue() == 0); 559 560 } 561 562 bool ASTContext::ZeroBitfieldFollowsBitfield(const FieldDecl *FD, 563 const FieldDecl *LastFD) const { 564 return (FD->isBitField() && LastFD && LastFD->isBitField() && 565 FD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue() == 0 && 566 LastFD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue() != 0); 567 568 } 569 570 bool ASTContext::BitfieldFollowsBitfield(const FieldDecl *FD, 571 const FieldDecl *LastFD) const { 572 return (FD->isBitField() && LastFD && LastFD->isBitField() && 573 FD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue() && 574 LastFD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue()); 575 } 576 577 bool ASTContext::NoneBitfieldFollowsBitfield(const FieldDecl *FD, 578 const FieldDecl *LastFD) const { 579 return (!FD->isBitField() && LastFD && LastFD->isBitField() && 580 LastFD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue()); 581 } 582 583 bool ASTContext::BitfieldFollowsNoneBitfield(const FieldDecl *FD, 584 const FieldDecl *LastFD) const { 585 return (FD->isBitField() && LastFD && !LastFD->isBitField() && 586 FD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue()); 587 } 588 589 ASTContext::overridden_cxx_method_iterator 590 ASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const { 591 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 592 = OverriddenMethods.find(Method); 593 if (Pos == OverriddenMethods.end()) 594 return 0; 595 596 return Pos->second.begin(); 597 } 598 599 ASTContext::overridden_cxx_method_iterator 600 ASTContext::overridden_methods_end(const CXXMethodDecl *Method) const { 601 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 602 = OverriddenMethods.find(Method); 603 if (Pos == OverriddenMethods.end()) 604 return 0; 605 606 return Pos->second.end(); 607 } 608 609 unsigned 610 ASTContext::overridden_methods_size(const CXXMethodDecl *Method) const { 611 llvm::DenseMap<const CXXMethodDecl *, CXXMethodVector>::const_iterator Pos 612 = OverriddenMethods.find(Method); 613 if (Pos == OverriddenMethods.end()) 614 return 0; 615 616 return Pos->second.size(); 617 } 618 619 void ASTContext::addOverriddenMethod(const CXXMethodDecl *Method, 620 const CXXMethodDecl *Overridden) { 621 OverriddenMethods[Method].push_back(Overridden); 622 } 623 624 //===----------------------------------------------------------------------===// 625 // Type Sizing and Analysis 626 //===----------------------------------------------------------------------===// 627 628 /// getFloatTypeSemantics - Return the APFloat 'semantics' for the specified 629 /// scalar floating point type. 630 const llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const { 631 const BuiltinType *BT = T->getAs<BuiltinType>(); 632 assert(BT && "Not a floating point type!"); 633 switch (BT->getKind()) { 634 default: assert(0 && "Not a floating point type!"); 635 case BuiltinType::Float: return Target.getFloatFormat(); 636 case BuiltinType::Double: return Target.getDoubleFormat(); 637 case BuiltinType::LongDouble: return Target.getLongDoubleFormat(); 638 } 639 } 640 641 /// getDeclAlign - Return a conservative estimate of the alignment of the 642 /// specified decl. Note that bitfields do not have a valid alignment, so 643 /// this method will assert on them. 644 /// If @p RefAsPointee, references are treated like their underlying type 645 /// (for alignof), else they're treated like pointers (for CodeGen). 646 CharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const { 647 unsigned Align = Target.getCharWidth(); 648 649 bool UseAlignAttrOnly = false; 650 if (unsigned AlignFromAttr = D->getMaxAlignment()) { 651 Align = AlignFromAttr; 652 653 // __attribute__((aligned)) can increase or decrease alignment 654 // *except* on a struct or struct member, where it only increases 655 // alignment unless 'packed' is also specified. 656 // 657 // It is an error for [[align]] to decrease alignment, so we can 658 // ignore that possibility; Sema should diagnose it. 659 if (isa<FieldDecl>(D)) { 660 UseAlignAttrOnly = D->hasAttr<PackedAttr>() || 661 cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>(); 662 } else { 663 UseAlignAttrOnly = true; 664 } 665 } 666 else if (isa<FieldDecl>(D)) 667 UseAlignAttrOnly = 668 D->hasAttr<PackedAttr>() || 669 cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>(); 670 671 // If we're using the align attribute only, just ignore everything 672 // else about the declaration and its type. 673 if (UseAlignAttrOnly) { 674 // do nothing 675 676 } else if (const ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 677 QualType T = VD->getType(); 678 if (const ReferenceType* RT = T->getAs<ReferenceType>()) { 679 if (RefAsPointee) 680 T = RT->getPointeeType(); 681 else 682 T = getPointerType(RT->getPointeeType()); 683 } 684 if (!T->isIncompleteType() && !T->isFunctionType()) { 685 // Adjust alignments of declarations with array type by the 686 // large-array alignment on the target. 687 unsigned MinWidth = Target.getLargeArrayMinWidth(); 688 const ArrayType *arrayType; 689 if (MinWidth && (arrayType = getAsArrayType(T))) { 690 if (isa<VariableArrayType>(arrayType)) 691 Align = std::max(Align, Target.getLargeArrayAlign()); 692 else if (isa<ConstantArrayType>(arrayType) && 693 MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType))) 694 Align = std::max(Align, Target.getLargeArrayAlign()); 695 696 // Walk through any array types while we're at it. 697 T = getBaseElementType(arrayType); 698 } 699 Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr())); 700 } 701 702 // Fields can be subject to extra alignment constraints, like if 703 // the field is packed, the struct is packed, or the struct has a 704 // a max-field-alignment constraint (#pragma pack). So calculate 705 // the actual alignment of the field within the struct, and then 706 // (as we're expected to) constrain that by the alignment of the type. 707 if (const FieldDecl *field = dyn_cast<FieldDecl>(VD)) { 708 // So calculate the alignment of the field. 709 const ASTRecordLayout &layout = getASTRecordLayout(field->getParent()); 710 711 // Start with the record's overall alignment. 712 unsigned fieldAlign = toBits(layout.getAlignment()); 713 714 // Use the GCD of that and the offset within the record. 715 uint64_t offset = layout.getFieldOffset(field->getFieldIndex()); 716 if (offset > 0) { 717 // Alignment is always a power of 2, so the GCD will be a power of 2, 718 // which means we get to do this crazy thing instead of Euclid's. 719 uint64_t lowBitOfOffset = offset & (~offset + 1); 720 if (lowBitOfOffset < fieldAlign) 721 fieldAlign = static_cast<unsigned>(lowBitOfOffset); 722 } 723 724 Align = std::min(Align, fieldAlign); 725 } 726 } 727 728 return toCharUnitsFromBits(Align); 729 } 730 731 std::pair<CharUnits, CharUnits> 732 ASTContext::getTypeInfoInChars(const Type *T) const { 733 std::pair<uint64_t, unsigned> Info = getTypeInfo(T); 734 return std::make_pair(toCharUnitsFromBits(Info.first), 735 toCharUnitsFromBits(Info.second)); 736 } 737 738 std::pair<CharUnits, CharUnits> 739 ASTContext::getTypeInfoInChars(QualType T) const { 740 return getTypeInfoInChars(T.getTypePtr()); 741 } 742 743 /// getTypeSize - Return the size of the specified type, in bits. This method 744 /// does not work on incomplete types. 745 /// 746 /// FIXME: Pointers into different addr spaces could have different sizes and 747 /// alignment requirements: getPointerInfo should take an AddrSpace, this 748 /// should take a QualType, &c. 749 std::pair<uint64_t, unsigned> 750 ASTContext::getTypeInfo(const Type *T) const { 751 uint64_t Width=0; 752 unsigned Align=8; 753 switch (T->getTypeClass()) { 754 #define TYPE(Class, Base) 755 #define ABSTRACT_TYPE(Class, Base) 756 #define NON_CANONICAL_TYPE(Class, Base) 757 #define DEPENDENT_TYPE(Class, Base) case Type::Class: 758 #include "clang/AST/TypeNodes.def" 759 llvm_unreachable("Should not see dependent types"); 760 break; 761 762 case Type::FunctionNoProto: 763 case Type::FunctionProto: 764 // GCC extension: alignof(function) = 32 bits 765 Width = 0; 766 Align = 32; 767 break; 768 769 case Type::IncompleteArray: 770 case Type::VariableArray: 771 Width = 0; 772 Align = getTypeAlign(cast<ArrayType>(T)->getElementType()); 773 break; 774 775 case Type::ConstantArray: { 776 const ConstantArrayType *CAT = cast<ConstantArrayType>(T); 777 778 std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType()); 779 Width = EltInfo.first*CAT->getSize().getZExtValue(); 780 Align = EltInfo.second; 781 Width = llvm::RoundUpToAlignment(Width, Align); 782 break; 783 } 784 case Type::ExtVector: 785 case Type::Vector: { 786 const VectorType *VT = cast<VectorType>(T); 787 std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(VT->getElementType()); 788 Width = EltInfo.first*VT->getNumElements(); 789 Align = Width; 790 // If the alignment is not a power of 2, round up to the next power of 2. 791 // This happens for non-power-of-2 length vectors. 792 if (Align & (Align-1)) { 793 Align = llvm::NextPowerOf2(Align); 794 Width = llvm::RoundUpToAlignment(Width, Align); 795 } 796 break; 797 } 798 799 case Type::Builtin: 800 switch (cast<BuiltinType>(T)->getKind()) { 801 default: assert(0 && "Unknown builtin type!"); 802 case BuiltinType::Void: 803 // GCC extension: alignof(void) = 8 bits. 804 Width = 0; 805 Align = 8; 806 break; 807 808 case BuiltinType::Bool: 809 Width = Target.getBoolWidth(); 810 Align = Target.getBoolAlign(); 811 break; 812 case BuiltinType::Char_S: 813 case BuiltinType::Char_U: 814 case BuiltinType::UChar: 815 case BuiltinType::SChar: 816 Width = Target.getCharWidth(); 817 Align = Target.getCharAlign(); 818 break; 819 case BuiltinType::WChar_S: 820 case BuiltinType::WChar_U: 821 Width = Target.getWCharWidth(); 822 Align = Target.getWCharAlign(); 823 break; 824 case BuiltinType::Char16: 825 Width = Target.getChar16Width(); 826 Align = Target.getChar16Align(); 827 break; 828 case BuiltinType::Char32: 829 Width = Target.getChar32Width(); 830 Align = Target.getChar32Align(); 831 break; 832 case BuiltinType::UShort: 833 case BuiltinType::Short: 834 Width = Target.getShortWidth(); 835 Align = Target.getShortAlign(); 836 break; 837 case BuiltinType::UInt: 838 case BuiltinType::Int: 839 Width = Target.getIntWidth(); 840 Align = Target.getIntAlign(); 841 break; 842 case BuiltinType::ULong: 843 case BuiltinType::Long: 844 Width = Target.getLongWidth(); 845 Align = Target.getLongAlign(); 846 break; 847 case BuiltinType::ULongLong: 848 case BuiltinType::LongLong: 849 Width = Target.getLongLongWidth(); 850 Align = Target.getLongLongAlign(); 851 break; 852 case BuiltinType::Int128: 853 case BuiltinType::UInt128: 854 Width = 128; 855 Align = 128; // int128_t is 128-bit aligned on all targets. 856 break; 857 case BuiltinType::Float: 858 Width = Target.getFloatWidth(); 859 Align = Target.getFloatAlign(); 860 break; 861 case BuiltinType::Double: 862 Width = Target.getDoubleWidth(); 863 Align = Target.getDoubleAlign(); 864 break; 865 case BuiltinType::LongDouble: 866 Width = Target.getLongDoubleWidth(); 867 Align = Target.getLongDoubleAlign(); 868 break; 869 case BuiltinType::NullPtr: 870 Width = Target.getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t) 871 Align = Target.getPointerAlign(0); // == sizeof(void*) 872 break; 873 case BuiltinType::ObjCId: 874 case BuiltinType::ObjCClass: 875 case BuiltinType::ObjCSel: 876 Width = Target.getPointerWidth(0); 877 Align = Target.getPointerAlign(0); 878 break; 879 } 880 break; 881 case Type::ObjCObjectPointer: 882 Width = Target.getPointerWidth(0); 883 Align = Target.getPointerAlign(0); 884 break; 885 case Type::BlockPointer: { 886 unsigned AS = getTargetAddressSpace( 887 cast<BlockPointerType>(T)->getPointeeType()); 888 Width = Target.getPointerWidth(AS); 889 Align = Target.getPointerAlign(AS); 890 break; 891 } 892 case Type::LValueReference: 893 case Type::RValueReference: { 894 // alignof and sizeof should never enter this code path here, so we go 895 // the pointer route. 896 unsigned AS = getTargetAddressSpace( 897 cast<ReferenceType>(T)->getPointeeType()); 898 Width = Target.getPointerWidth(AS); 899 Align = Target.getPointerAlign(AS); 900 break; 901 } 902 case Type::Pointer: { 903 unsigned AS = getTargetAddressSpace(cast<PointerType>(T)->getPointeeType()); 904 Width = Target.getPointerWidth(AS); 905 Align = Target.getPointerAlign(AS); 906 break; 907 } 908 case Type::MemberPointer: { 909 const MemberPointerType *MPT = cast<MemberPointerType>(T); 910 std::pair<uint64_t, unsigned> PtrDiffInfo = 911 getTypeInfo(getPointerDiffType()); 912 Width = PtrDiffInfo.first * ABI->getMemberPointerSize(MPT); 913 Align = PtrDiffInfo.second; 914 break; 915 } 916 case Type::Complex: { 917 // Complex types have the same alignment as their elements, but twice the 918 // size. 919 std::pair<uint64_t, unsigned> EltInfo = 920 getTypeInfo(cast<ComplexType>(T)->getElementType()); 921 Width = EltInfo.first*2; 922 Align = EltInfo.second; 923 break; 924 } 925 case Type::ObjCObject: 926 return getTypeInfo(cast<ObjCObjectType>(T)->getBaseType().getTypePtr()); 927 case Type::ObjCInterface: { 928 const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T); 929 const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl()); 930 Width = toBits(Layout.getSize()); 931 Align = toBits(Layout.getAlignment()); 932 break; 933 } 934 case Type::Record: 935 case Type::Enum: { 936 const TagType *TT = cast<TagType>(T); 937 938 if (TT->getDecl()->isInvalidDecl()) { 939 Width = 8; 940 Align = 8; 941 break; 942 } 943 944 if (const EnumType *ET = dyn_cast<EnumType>(TT)) 945 return getTypeInfo(ET->getDecl()->getIntegerType()); 946 947 const RecordType *RT = cast<RecordType>(TT); 948 const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl()); 949 Width = toBits(Layout.getSize()); 950 Align = toBits(Layout.getAlignment()); 951 break; 952 } 953 954 case Type::SubstTemplateTypeParm: 955 return getTypeInfo(cast<SubstTemplateTypeParmType>(T)-> 956 getReplacementType().getTypePtr()); 957 958 case Type::Auto: { 959 const AutoType *A = cast<AutoType>(T); 960 assert(A->isDeduced() && "Cannot request the size of a dependent type"); 961 return getTypeInfo(A->getDeducedType().getTypePtr()); 962 } 963 964 case Type::Paren: 965 return getTypeInfo(cast<ParenType>(T)->getInnerType().getTypePtr()); 966 967 case Type::Typedef: { 968 const TypedefNameDecl *Typedef = cast<TypedefType>(T)->getDecl(); 969 std::pair<uint64_t, unsigned> Info 970 = getTypeInfo(Typedef->getUnderlyingType().getTypePtr()); 971 // If the typedef has an aligned attribute on it, it overrides any computed 972 // alignment we have. This violates the GCC documentation (which says that 973 // attribute(aligned) can only round up) but matches its implementation. 974 if (unsigned AttrAlign = Typedef->getMaxAlignment()) 975 Align = AttrAlign; 976 else 977 Align = Info.second; 978 Width = Info.first; 979 break; 980 } 981 982 case Type::TypeOfExpr: 983 return getTypeInfo(cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType() 984 .getTypePtr()); 985 986 case Type::TypeOf: 987 return getTypeInfo(cast<TypeOfType>(T)->getUnderlyingType().getTypePtr()); 988 989 case Type::Decltype: 990 return getTypeInfo(cast<DecltypeType>(T)->getUnderlyingExpr()->getType() 991 .getTypePtr()); 992 993 case Type::UnaryTransform: 994 return getTypeInfo(cast<UnaryTransformType>(T)->getUnderlyingType()); 995 996 case Type::Elaborated: 997 return getTypeInfo(cast<ElaboratedType>(T)->getNamedType().getTypePtr()); 998 999 case Type::Attributed: 1000 return getTypeInfo( 1001 cast<AttributedType>(T)->getEquivalentType().getTypePtr()); 1002 1003 case Type::TemplateSpecialization: { 1004 assert(getCanonicalType(T) != T && 1005 "Cannot request the size of a dependent type"); 1006 const TemplateSpecializationType *TST = cast<TemplateSpecializationType>(T); 1007 // A type alias template specialization may refer to a typedef with the 1008 // aligned attribute on it. 1009 if (TST->isTypeAlias()) 1010 return getTypeInfo(TST->getAliasedType().getTypePtr()); 1011 else 1012 return getTypeInfo(getCanonicalType(T)); 1013 } 1014 1015 } 1016 1017 assert(Align && (Align & (Align-1)) == 0 && "Alignment must be power of 2"); 1018 return std::make_pair(Width, Align); 1019 } 1020 1021 /// toCharUnitsFromBits - Convert a size in bits to a size in characters. 1022 CharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const { 1023 return CharUnits::fromQuantity(BitSize / getCharWidth()); 1024 } 1025 1026 /// toBits - Convert a size in characters to a size in characters. 1027 int64_t ASTContext::toBits(CharUnits CharSize) const { 1028 return CharSize.getQuantity() * getCharWidth(); 1029 } 1030 1031 /// getTypeSizeInChars - Return the size of the specified type, in characters. 1032 /// This method does not work on incomplete types. 1033 CharUnits ASTContext::getTypeSizeInChars(QualType T) const { 1034 return toCharUnitsFromBits(getTypeSize(T)); 1035 } 1036 CharUnits ASTContext::getTypeSizeInChars(const Type *T) const { 1037 return toCharUnitsFromBits(getTypeSize(T)); 1038 } 1039 1040 /// getTypeAlignInChars - Return the ABI-specified alignment of a type, in 1041 /// characters. This method does not work on incomplete types. 1042 CharUnits ASTContext::getTypeAlignInChars(QualType T) const { 1043 return toCharUnitsFromBits(getTypeAlign(T)); 1044 } 1045 CharUnits ASTContext::getTypeAlignInChars(const Type *T) const { 1046 return toCharUnitsFromBits(getTypeAlign(T)); 1047 } 1048 1049 /// getPreferredTypeAlign - Return the "preferred" alignment of the specified 1050 /// type for the current target in bits. This can be different than the ABI 1051 /// alignment in cases where it is beneficial for performance to overalign 1052 /// a data type. 1053 unsigned ASTContext::getPreferredTypeAlign(const Type *T) const { 1054 unsigned ABIAlign = getTypeAlign(T); 1055 1056 // Double and long long should be naturally aligned if possible. 1057 if (const ComplexType* CT = T->getAs<ComplexType>()) 1058 T = CT->getElementType().getTypePtr(); 1059 if (T->isSpecificBuiltinType(BuiltinType::Double) || 1060 T->isSpecificBuiltinType(BuiltinType::LongLong)) 1061 return std::max(ABIAlign, (unsigned)getTypeSize(T)); 1062 1063 return ABIAlign; 1064 } 1065 1066 /// ShallowCollectObjCIvars - 1067 /// Collect all ivars, including those synthesized, in the current class. 1068 /// 1069 void ASTContext::ShallowCollectObjCIvars(const ObjCInterfaceDecl *OI, 1070 llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars) const { 1071 // FIXME. This need be removed but there are two many places which 1072 // assume const-ness of ObjCInterfaceDecl 1073 ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI); 1074 for (ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv; 1075 Iv= Iv->getNextIvar()) 1076 Ivars.push_back(Iv); 1077 } 1078 1079 /// DeepCollectObjCIvars - 1080 /// This routine first collects all declared, but not synthesized, ivars in 1081 /// super class and then collects all ivars, including those synthesized for 1082 /// current class. This routine is used for implementation of current class 1083 /// when all ivars, declared and synthesized are known. 1084 /// 1085 void ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, 1086 bool leafClass, 1087 llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars) const { 1088 if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass()) 1089 DeepCollectObjCIvars(SuperClass, false, Ivars); 1090 if (!leafClass) { 1091 for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(), 1092 E = OI->ivar_end(); I != E; ++I) 1093 Ivars.push_back(*I); 1094 } 1095 else { 1096 ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI); 1097 for (ObjCIvarDecl *Iv = IDecl->all_declared_ivar_begin(); Iv; 1098 Iv= Iv->getNextIvar()) 1099 Ivars.push_back(Iv); 1100 } 1101 } 1102 1103 /// CollectInheritedProtocols - Collect all protocols in current class and 1104 /// those inherited by it. 1105 void ASTContext::CollectInheritedProtocols(const Decl *CDecl, 1106 llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols) { 1107 if (const ObjCInterfaceDecl *OI = dyn_cast<ObjCInterfaceDecl>(CDecl)) { 1108 // We can use protocol_iterator here instead of 1109 // all_referenced_protocol_iterator since we are walking all categories. 1110 for (ObjCInterfaceDecl::all_protocol_iterator P = OI->all_referenced_protocol_begin(), 1111 PE = OI->all_referenced_protocol_end(); P != PE; ++P) { 1112 ObjCProtocolDecl *Proto = (*P); 1113 Protocols.insert(Proto); 1114 for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1115 PE = Proto->protocol_end(); P != PE; ++P) { 1116 Protocols.insert(*P); 1117 CollectInheritedProtocols(*P, Protocols); 1118 } 1119 } 1120 1121 // Categories of this Interface. 1122 for (const ObjCCategoryDecl *CDeclChain = OI->getCategoryList(); 1123 CDeclChain; CDeclChain = CDeclChain->getNextClassCategory()) 1124 CollectInheritedProtocols(CDeclChain, Protocols); 1125 if (ObjCInterfaceDecl *SD = OI->getSuperClass()) 1126 while (SD) { 1127 CollectInheritedProtocols(SD, Protocols); 1128 SD = SD->getSuperClass(); 1129 } 1130 } else if (const ObjCCategoryDecl *OC = dyn_cast<ObjCCategoryDecl>(CDecl)) { 1131 for (ObjCCategoryDecl::protocol_iterator P = OC->protocol_begin(), 1132 PE = OC->protocol_end(); P != PE; ++P) { 1133 ObjCProtocolDecl *Proto = (*P); 1134 Protocols.insert(Proto); 1135 for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1136 PE = Proto->protocol_end(); P != PE; ++P) 1137 CollectInheritedProtocols(*P, Protocols); 1138 } 1139 } else if (const ObjCProtocolDecl *OP = dyn_cast<ObjCProtocolDecl>(CDecl)) { 1140 for (ObjCProtocolDecl::protocol_iterator P = OP->protocol_begin(), 1141 PE = OP->protocol_end(); P != PE; ++P) { 1142 ObjCProtocolDecl *Proto = (*P); 1143 Protocols.insert(Proto); 1144 for (ObjCProtocolDecl::protocol_iterator P = Proto->protocol_begin(), 1145 PE = Proto->protocol_end(); P != PE; ++P) 1146 CollectInheritedProtocols(*P, Protocols); 1147 } 1148 } 1149 } 1150 1151 unsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const { 1152 unsigned count = 0; 1153 // Count ivars declared in class extension. 1154 for (const ObjCCategoryDecl *CDecl = OI->getFirstClassExtension(); CDecl; 1155 CDecl = CDecl->getNextClassExtension()) 1156 count += CDecl->ivar_size(); 1157 1158 // Count ivar defined in this class's implementation. This 1159 // includes synthesized ivars. 1160 if (ObjCImplementationDecl *ImplDecl = OI->getImplementation()) 1161 count += ImplDecl->ivar_size(); 1162 1163 return count; 1164 } 1165 1166 /// \brief Get the implementation of ObjCInterfaceDecl,or NULL if none exists. 1167 ObjCImplementationDecl *ASTContext::getObjCImplementation(ObjCInterfaceDecl *D) { 1168 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator 1169 I = ObjCImpls.find(D); 1170 if (I != ObjCImpls.end()) 1171 return cast<ObjCImplementationDecl>(I->second); 1172 return 0; 1173 } 1174 /// \brief Get the implementation of ObjCCategoryDecl, or NULL if none exists. 1175 ObjCCategoryImplDecl *ASTContext::getObjCImplementation(ObjCCategoryDecl *D) { 1176 llvm::DenseMap<ObjCContainerDecl*, ObjCImplDecl*>::iterator 1177 I = ObjCImpls.find(D); 1178 if (I != ObjCImpls.end()) 1179 return cast<ObjCCategoryImplDecl>(I->second); 1180 return 0; 1181 } 1182 1183 /// \brief Set the implementation of ObjCInterfaceDecl. 1184 void ASTContext::setObjCImplementation(ObjCInterfaceDecl *IFaceD, 1185 ObjCImplementationDecl *ImplD) { 1186 assert(IFaceD && ImplD && "Passed null params"); 1187 ObjCImpls[IFaceD] = ImplD; 1188 } 1189 /// \brief Set the implementation of ObjCCategoryDecl. 1190 void ASTContext::setObjCImplementation(ObjCCategoryDecl *CatD, 1191 ObjCCategoryImplDecl *ImplD) { 1192 assert(CatD && ImplD && "Passed null params"); 1193 ObjCImpls[CatD] = ImplD; 1194 } 1195 1196 /// \brief Get the copy initialization expression of VarDecl,or NULL if 1197 /// none exists. 1198 Expr *ASTContext::getBlockVarCopyInits(const VarDecl*VD) { 1199 assert(VD && "Passed null params"); 1200 assert(VD->hasAttr<BlocksAttr>() && 1201 "getBlockVarCopyInits - not __block var"); 1202 llvm::DenseMap<const VarDecl*, Expr*>::iterator 1203 I = BlockVarCopyInits.find(VD); 1204 return (I != BlockVarCopyInits.end()) ? cast<Expr>(I->second) : 0; 1205 } 1206 1207 /// \brief Set the copy inialization expression of a block var decl. 1208 void ASTContext::setBlockVarCopyInits(VarDecl*VD, Expr* Init) { 1209 assert(VD && Init && "Passed null params"); 1210 assert(VD->hasAttr<BlocksAttr>() && 1211 "setBlockVarCopyInits - not __block var"); 1212 BlockVarCopyInits[VD] = Init; 1213 } 1214 1215 /// \brief Allocate an uninitialized TypeSourceInfo. 1216 /// 1217 /// The caller should initialize the memory held by TypeSourceInfo using 1218 /// the TypeLoc wrappers. 1219 /// 1220 /// \param T the type that will be the basis for type source info. This type 1221 /// should refer to how the declarator was written in source code, not to 1222 /// what type semantic analysis resolved the declarator to. 1223 TypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T, 1224 unsigned DataSize) const { 1225 if (!DataSize) 1226 DataSize = TypeLoc::getFullDataSizeForType(T); 1227 else 1228 assert(DataSize == TypeLoc::getFullDataSizeForType(T) && 1229 "incorrect data size provided to CreateTypeSourceInfo!"); 1230 1231 TypeSourceInfo *TInfo = 1232 (TypeSourceInfo*)BumpAlloc.Allocate(sizeof(TypeSourceInfo) + DataSize, 8); 1233 new (TInfo) TypeSourceInfo(T); 1234 return TInfo; 1235 } 1236 1237 TypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T, 1238 SourceLocation L) const { 1239 TypeSourceInfo *DI = CreateTypeSourceInfo(T); 1240 DI->getTypeLoc().initialize(const_cast<ASTContext &>(*this), L); 1241 return DI; 1242 } 1243 1244 const ASTRecordLayout & 1245 ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const { 1246 return getObjCLayout(D, 0); 1247 } 1248 1249 const ASTRecordLayout & 1250 ASTContext::getASTObjCImplementationLayout( 1251 const ObjCImplementationDecl *D) const { 1252 return getObjCLayout(D->getClassInterface(), D); 1253 } 1254 1255 //===----------------------------------------------------------------------===// 1256 // Type creation/memoization methods 1257 //===----------------------------------------------------------------------===// 1258 1259 QualType 1260 ASTContext::getExtQualType(const Type *baseType, Qualifiers quals) const { 1261 unsigned fastQuals = quals.getFastQualifiers(); 1262 quals.removeFastQualifiers(); 1263 1264 // Check if we've already instantiated this type. 1265 llvm::FoldingSetNodeID ID; 1266 ExtQuals::Profile(ID, baseType, quals); 1267 void *insertPos = 0; 1268 if (ExtQuals *eq = ExtQualNodes.FindNodeOrInsertPos(ID, insertPos)) { 1269 assert(eq->getQualifiers() == quals); 1270 return QualType(eq, fastQuals); 1271 } 1272 1273 // If the base type is not canonical, make the appropriate canonical type. 1274 QualType canon; 1275 if (!baseType->isCanonicalUnqualified()) { 1276 SplitQualType canonSplit = baseType->getCanonicalTypeInternal().split(); 1277 canonSplit.second.addConsistentQualifiers(quals); 1278 canon = getExtQualType(canonSplit.first, canonSplit.second); 1279 1280 // Re-find the insert position. 1281 (void) ExtQualNodes.FindNodeOrInsertPos(ID, insertPos); 1282 } 1283 1284 ExtQuals *eq = new (*this, TypeAlignment) ExtQuals(baseType, canon, quals); 1285 ExtQualNodes.InsertNode(eq, insertPos); 1286 return QualType(eq, fastQuals); 1287 } 1288 1289 QualType 1290 ASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) const { 1291 QualType CanT = getCanonicalType(T); 1292 if (CanT.getAddressSpace() == AddressSpace) 1293 return T; 1294 1295 // If we are composing extended qualifiers together, merge together 1296 // into one ExtQuals node. 1297 QualifierCollector Quals; 1298 const Type *TypeNode = Quals.strip(T); 1299 1300 // If this type already has an address space specified, it cannot get 1301 // another one. 1302 assert(!Quals.hasAddressSpace() && 1303 "Type cannot be in multiple addr spaces!"); 1304 Quals.addAddressSpace(AddressSpace); 1305 1306 return getExtQualType(TypeNode, Quals); 1307 } 1308 1309 QualType ASTContext::getObjCGCQualType(QualType T, 1310 Qualifiers::GC GCAttr) const { 1311 QualType CanT = getCanonicalType(T); 1312 if (CanT.getObjCGCAttr() == GCAttr) 1313 return T; 1314 1315 if (const PointerType *ptr = T->getAs<PointerType>()) { 1316 QualType Pointee = ptr->getPointeeType(); 1317 if (Pointee->isAnyPointerType()) { 1318 QualType ResultType = getObjCGCQualType(Pointee, GCAttr); 1319 return getPointerType(ResultType); 1320 } 1321 } 1322 1323 // If we are composing extended qualifiers together, merge together 1324 // into one ExtQuals node. 1325 QualifierCollector Quals; 1326 const Type *TypeNode = Quals.strip(T); 1327 1328 // If this type already has an ObjCGC specified, it cannot get 1329 // another one. 1330 assert(!Quals.hasObjCGCAttr() && 1331 "Type cannot have multiple ObjCGCs!"); 1332 Quals.addObjCGCAttr(GCAttr); 1333 1334 return getExtQualType(TypeNode, Quals); 1335 } 1336 1337 const FunctionType *ASTContext::adjustFunctionType(const FunctionType *T, 1338 FunctionType::ExtInfo Info) { 1339 if (T->getExtInfo() == Info) 1340 return T; 1341 1342 QualType Result; 1343 if (const FunctionNoProtoType *FNPT = dyn_cast<FunctionNoProtoType>(T)) { 1344 Result = getFunctionNoProtoType(FNPT->getResultType(), Info); 1345 } else { 1346 const FunctionProtoType *FPT = cast<FunctionProtoType>(T); 1347 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 1348 EPI.ExtInfo = Info; 1349 Result = getFunctionType(FPT->getResultType(), FPT->arg_type_begin(), 1350 FPT->getNumArgs(), EPI); 1351 } 1352 1353 return cast<FunctionType>(Result.getTypePtr()); 1354 } 1355 1356 /// getComplexType - Return the uniqued reference to the type for a complex 1357 /// number with the specified element type. 1358 QualType ASTContext::getComplexType(QualType T) const { 1359 // Unique pointers, to guarantee there is only one pointer of a particular 1360 // structure. 1361 llvm::FoldingSetNodeID ID; 1362 ComplexType::Profile(ID, T); 1363 1364 void *InsertPos = 0; 1365 if (ComplexType *CT = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos)) 1366 return QualType(CT, 0); 1367 1368 // If the pointee type isn't canonical, this won't be a canonical type either, 1369 // so fill in the canonical type field. 1370 QualType Canonical; 1371 if (!T.isCanonical()) { 1372 Canonical = getComplexType(getCanonicalType(T)); 1373 1374 // Get the new insert position for the node we care about. 1375 ComplexType *NewIP = ComplexTypes.FindNodeOrInsertPos(ID, InsertPos); 1376 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1377 } 1378 ComplexType *New = new (*this, TypeAlignment) ComplexType(T, Canonical); 1379 Types.push_back(New); 1380 ComplexTypes.InsertNode(New, InsertPos); 1381 return QualType(New, 0); 1382 } 1383 1384 /// getPointerType - Return the uniqued reference to the type for a pointer to 1385 /// the specified type. 1386 QualType ASTContext::getPointerType(QualType T) const { 1387 // Unique pointers, to guarantee there is only one pointer of a particular 1388 // structure. 1389 llvm::FoldingSetNodeID ID; 1390 PointerType::Profile(ID, T); 1391 1392 void *InsertPos = 0; 1393 if (PointerType *PT = PointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 1394 return QualType(PT, 0); 1395 1396 // If the pointee type isn't canonical, this won't be a canonical type either, 1397 // so fill in the canonical type field. 1398 QualType Canonical; 1399 if (!T.isCanonical()) { 1400 Canonical = getPointerType(getCanonicalType(T)); 1401 1402 // Get the new insert position for the node we care about. 1403 PointerType *NewIP = PointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1404 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1405 } 1406 PointerType *New = new (*this, TypeAlignment) PointerType(T, Canonical); 1407 Types.push_back(New); 1408 PointerTypes.InsertNode(New, InsertPos); 1409 return QualType(New, 0); 1410 } 1411 1412 /// getBlockPointerType - Return the uniqued reference to the type for 1413 /// a pointer to the specified block. 1414 QualType ASTContext::getBlockPointerType(QualType T) const { 1415 assert(T->isFunctionType() && "block of function types only"); 1416 // Unique pointers, to guarantee there is only one block of a particular 1417 // structure. 1418 llvm::FoldingSetNodeID ID; 1419 BlockPointerType::Profile(ID, T); 1420 1421 void *InsertPos = 0; 1422 if (BlockPointerType *PT = 1423 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 1424 return QualType(PT, 0); 1425 1426 // If the block pointee type isn't canonical, this won't be a canonical 1427 // type either so fill in the canonical type field. 1428 QualType Canonical; 1429 if (!T.isCanonical()) { 1430 Canonical = getBlockPointerType(getCanonicalType(T)); 1431 1432 // Get the new insert position for the node we care about. 1433 BlockPointerType *NewIP = 1434 BlockPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1435 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1436 } 1437 BlockPointerType *New 1438 = new (*this, TypeAlignment) BlockPointerType(T, Canonical); 1439 Types.push_back(New); 1440 BlockPointerTypes.InsertNode(New, InsertPos); 1441 return QualType(New, 0); 1442 } 1443 1444 /// getLValueReferenceType - Return the uniqued reference to the type for an 1445 /// lvalue reference to the specified type. 1446 QualType 1447 ASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const { 1448 assert(getCanonicalType(T) != OverloadTy && 1449 "Unresolved overloaded function type"); 1450 1451 // Unique pointers, to guarantee there is only one pointer of a particular 1452 // structure. 1453 llvm::FoldingSetNodeID ID; 1454 ReferenceType::Profile(ID, T, SpelledAsLValue); 1455 1456 void *InsertPos = 0; 1457 if (LValueReferenceType *RT = 1458 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos)) 1459 return QualType(RT, 0); 1460 1461 const ReferenceType *InnerRef = T->getAs<ReferenceType>(); 1462 1463 // If the referencee type isn't canonical, this won't be a canonical type 1464 // either, so fill in the canonical type field. 1465 QualType Canonical; 1466 if (!SpelledAsLValue || InnerRef || !T.isCanonical()) { 1467 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T); 1468 Canonical = getLValueReferenceType(getCanonicalType(PointeeType)); 1469 1470 // Get the new insert position for the node we care about. 1471 LValueReferenceType *NewIP = 1472 LValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos); 1473 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1474 } 1475 1476 LValueReferenceType *New 1477 = new (*this, TypeAlignment) LValueReferenceType(T, Canonical, 1478 SpelledAsLValue); 1479 Types.push_back(New); 1480 LValueReferenceTypes.InsertNode(New, InsertPos); 1481 1482 return QualType(New, 0); 1483 } 1484 1485 /// getRValueReferenceType - Return the uniqued reference to the type for an 1486 /// rvalue reference to the specified type. 1487 QualType ASTContext::getRValueReferenceType(QualType T) const { 1488 // Unique pointers, to guarantee there is only one pointer of a particular 1489 // structure. 1490 llvm::FoldingSetNodeID ID; 1491 ReferenceType::Profile(ID, T, false); 1492 1493 void *InsertPos = 0; 1494 if (RValueReferenceType *RT = 1495 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos)) 1496 return QualType(RT, 0); 1497 1498 const ReferenceType *InnerRef = T->getAs<ReferenceType>(); 1499 1500 // If the referencee type isn't canonical, this won't be a canonical type 1501 // either, so fill in the canonical type field. 1502 QualType Canonical; 1503 if (InnerRef || !T.isCanonical()) { 1504 QualType PointeeType = (InnerRef ? InnerRef->getPointeeType() : T); 1505 Canonical = getRValueReferenceType(getCanonicalType(PointeeType)); 1506 1507 // Get the new insert position for the node we care about. 1508 RValueReferenceType *NewIP = 1509 RValueReferenceTypes.FindNodeOrInsertPos(ID, InsertPos); 1510 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1511 } 1512 1513 RValueReferenceType *New 1514 = new (*this, TypeAlignment) RValueReferenceType(T, Canonical); 1515 Types.push_back(New); 1516 RValueReferenceTypes.InsertNode(New, InsertPos); 1517 return QualType(New, 0); 1518 } 1519 1520 /// getMemberPointerType - Return the uniqued reference to the type for a 1521 /// member pointer to the specified type, in the specified class. 1522 QualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const { 1523 // Unique pointers, to guarantee there is only one pointer of a particular 1524 // structure. 1525 llvm::FoldingSetNodeID ID; 1526 MemberPointerType::Profile(ID, T, Cls); 1527 1528 void *InsertPos = 0; 1529 if (MemberPointerType *PT = 1530 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 1531 return QualType(PT, 0); 1532 1533 // If the pointee or class type isn't canonical, this won't be a canonical 1534 // type either, so fill in the canonical type field. 1535 QualType Canonical; 1536 if (!T.isCanonical() || !Cls->isCanonicalUnqualified()) { 1537 Canonical = getMemberPointerType(getCanonicalType(T),getCanonicalType(Cls)); 1538 1539 // Get the new insert position for the node we care about. 1540 MemberPointerType *NewIP = 1541 MemberPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 1542 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1543 } 1544 MemberPointerType *New 1545 = new (*this, TypeAlignment) MemberPointerType(T, Cls, Canonical); 1546 Types.push_back(New); 1547 MemberPointerTypes.InsertNode(New, InsertPos); 1548 return QualType(New, 0); 1549 } 1550 1551 /// getConstantArrayType - Return the unique reference to the type for an 1552 /// array of the specified element type. 1553 QualType ASTContext::getConstantArrayType(QualType EltTy, 1554 const llvm::APInt &ArySizeIn, 1555 ArrayType::ArraySizeModifier ASM, 1556 unsigned IndexTypeQuals) const { 1557 assert((EltTy->isDependentType() || 1558 EltTy->isIncompleteType() || EltTy->isConstantSizeType()) && 1559 "Constant array of VLAs is illegal!"); 1560 1561 // Convert the array size into a canonical width matching the pointer size for 1562 // the target. 1563 llvm::APInt ArySize(ArySizeIn); 1564 ArySize = 1565 ArySize.zextOrTrunc(Target.getPointerWidth(getTargetAddressSpace(EltTy))); 1566 1567 llvm::FoldingSetNodeID ID; 1568 ConstantArrayType::Profile(ID, EltTy, ArySize, ASM, IndexTypeQuals); 1569 1570 void *InsertPos = 0; 1571 if (ConstantArrayType *ATP = 1572 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos)) 1573 return QualType(ATP, 0); 1574 1575 // If the element type isn't canonical or has qualifiers, this won't 1576 // be a canonical type either, so fill in the canonical type field. 1577 QualType Canon; 1578 if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) { 1579 SplitQualType canonSplit = getCanonicalType(EltTy).split(); 1580 Canon = getConstantArrayType(QualType(canonSplit.first, 0), ArySize, 1581 ASM, IndexTypeQuals); 1582 Canon = getQualifiedType(Canon, canonSplit.second); 1583 1584 // Get the new insert position for the node we care about. 1585 ConstantArrayType *NewIP = 1586 ConstantArrayTypes.FindNodeOrInsertPos(ID, InsertPos); 1587 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1588 } 1589 1590 ConstantArrayType *New = new(*this,TypeAlignment) 1591 ConstantArrayType(EltTy, Canon, ArySize, ASM, IndexTypeQuals); 1592 ConstantArrayTypes.InsertNode(New, InsertPos); 1593 Types.push_back(New); 1594 return QualType(New, 0); 1595 } 1596 1597 /// getVariableArrayDecayedType - Turns the given type, which may be 1598 /// variably-modified, into the corresponding type with all the known 1599 /// sizes replaced with [*]. 1600 QualType ASTContext::getVariableArrayDecayedType(QualType type) const { 1601 // Vastly most common case. 1602 if (!type->isVariablyModifiedType()) return type; 1603 1604 QualType result; 1605 1606 SplitQualType split = type.getSplitDesugaredType(); 1607 const Type *ty = split.first; 1608 switch (ty->getTypeClass()) { 1609 #define TYPE(Class, Base) 1610 #define ABSTRACT_TYPE(Class, Base) 1611 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 1612 #include "clang/AST/TypeNodes.def" 1613 llvm_unreachable("didn't desugar past all non-canonical types?"); 1614 1615 // These types should never be variably-modified. 1616 case Type::Builtin: 1617 case Type::Complex: 1618 case Type::Vector: 1619 case Type::ExtVector: 1620 case Type::DependentSizedExtVector: 1621 case Type::ObjCObject: 1622 case Type::ObjCInterface: 1623 case Type::ObjCObjectPointer: 1624 case Type::Record: 1625 case Type::Enum: 1626 case Type::UnresolvedUsing: 1627 case Type::TypeOfExpr: 1628 case Type::TypeOf: 1629 case Type::Decltype: 1630 case Type::UnaryTransform: 1631 case Type::DependentName: 1632 case Type::InjectedClassName: 1633 case Type::TemplateSpecialization: 1634 case Type::DependentTemplateSpecialization: 1635 case Type::TemplateTypeParm: 1636 case Type::SubstTemplateTypeParmPack: 1637 case Type::Auto: 1638 case Type::PackExpansion: 1639 llvm_unreachable("type should never be variably-modified"); 1640 1641 // These types can be variably-modified but should never need to 1642 // further decay. 1643 case Type::FunctionNoProto: 1644 case Type::FunctionProto: 1645 case Type::BlockPointer: 1646 case Type::MemberPointer: 1647 return type; 1648 1649 // These types can be variably-modified. All these modifications 1650 // preserve structure except as noted by comments. 1651 // TODO: if we ever care about optimizing VLAs, there are no-op 1652 // optimizations available here. 1653 case Type::Pointer: 1654 result = getPointerType(getVariableArrayDecayedType( 1655 cast<PointerType>(ty)->getPointeeType())); 1656 break; 1657 1658 case Type::LValueReference: { 1659 const LValueReferenceType *lv = cast<LValueReferenceType>(ty); 1660 result = getLValueReferenceType( 1661 getVariableArrayDecayedType(lv->getPointeeType()), 1662 lv->isSpelledAsLValue()); 1663 break; 1664 } 1665 1666 case Type::RValueReference: { 1667 const RValueReferenceType *lv = cast<RValueReferenceType>(ty); 1668 result = getRValueReferenceType( 1669 getVariableArrayDecayedType(lv->getPointeeType())); 1670 break; 1671 } 1672 1673 case Type::ConstantArray: { 1674 const ConstantArrayType *cat = cast<ConstantArrayType>(ty); 1675 result = getConstantArrayType( 1676 getVariableArrayDecayedType(cat->getElementType()), 1677 cat->getSize(), 1678 cat->getSizeModifier(), 1679 cat->getIndexTypeCVRQualifiers()); 1680 break; 1681 } 1682 1683 case Type::DependentSizedArray: { 1684 const DependentSizedArrayType *dat = cast<DependentSizedArrayType>(ty); 1685 result = getDependentSizedArrayType( 1686 getVariableArrayDecayedType(dat->getElementType()), 1687 dat->getSizeExpr(), 1688 dat->getSizeModifier(), 1689 dat->getIndexTypeCVRQualifiers(), 1690 dat->getBracketsRange()); 1691 break; 1692 } 1693 1694 // Turn incomplete types into [*] types. 1695 case Type::IncompleteArray: { 1696 const IncompleteArrayType *iat = cast<IncompleteArrayType>(ty); 1697 result = getVariableArrayType( 1698 getVariableArrayDecayedType(iat->getElementType()), 1699 /*size*/ 0, 1700 ArrayType::Normal, 1701 iat->getIndexTypeCVRQualifiers(), 1702 SourceRange()); 1703 break; 1704 } 1705 1706 // Turn VLA types into [*] types. 1707 case Type::VariableArray: { 1708 const VariableArrayType *vat = cast<VariableArrayType>(ty); 1709 result = getVariableArrayType( 1710 getVariableArrayDecayedType(vat->getElementType()), 1711 /*size*/ 0, 1712 ArrayType::Star, 1713 vat->getIndexTypeCVRQualifiers(), 1714 vat->getBracketsRange()); 1715 break; 1716 } 1717 } 1718 1719 // Apply the top-level qualifiers from the original. 1720 return getQualifiedType(result, split.second); 1721 } 1722 1723 /// getVariableArrayType - Returns a non-unique reference to the type for a 1724 /// variable array of the specified element type. 1725 QualType ASTContext::getVariableArrayType(QualType EltTy, 1726 Expr *NumElts, 1727 ArrayType::ArraySizeModifier ASM, 1728 unsigned IndexTypeQuals, 1729 SourceRange Brackets) const { 1730 // Since we don't unique expressions, it isn't possible to unique VLA's 1731 // that have an expression provided for their size. 1732 QualType Canon; 1733 1734 // Be sure to pull qualifiers off the element type. 1735 if (!EltTy.isCanonical() || EltTy.hasLocalQualifiers()) { 1736 SplitQualType canonSplit = getCanonicalType(EltTy).split(); 1737 Canon = getVariableArrayType(QualType(canonSplit.first, 0), NumElts, ASM, 1738 IndexTypeQuals, Brackets); 1739 Canon = getQualifiedType(Canon, canonSplit.second); 1740 } 1741 1742 VariableArrayType *New = new(*this, TypeAlignment) 1743 VariableArrayType(EltTy, Canon, NumElts, ASM, IndexTypeQuals, Brackets); 1744 1745 VariableArrayTypes.push_back(New); 1746 Types.push_back(New); 1747 return QualType(New, 0); 1748 } 1749 1750 /// getDependentSizedArrayType - Returns a non-unique reference to 1751 /// the type for a dependently-sized array of the specified element 1752 /// type. 1753 QualType ASTContext::getDependentSizedArrayType(QualType elementType, 1754 Expr *numElements, 1755 ArrayType::ArraySizeModifier ASM, 1756 unsigned elementTypeQuals, 1757 SourceRange brackets) const { 1758 assert((!numElements || numElements->isTypeDependent() || 1759 numElements->isValueDependent()) && 1760 "Size must be type- or value-dependent!"); 1761 1762 // Dependently-sized array types that do not have a specified number 1763 // of elements will have their sizes deduced from a dependent 1764 // initializer. We do no canonicalization here at all, which is okay 1765 // because they can't be used in most locations. 1766 if (!numElements) { 1767 DependentSizedArrayType *newType 1768 = new (*this, TypeAlignment) 1769 DependentSizedArrayType(*this, elementType, QualType(), 1770 numElements, ASM, elementTypeQuals, 1771 brackets); 1772 Types.push_back(newType); 1773 return QualType(newType, 0); 1774 } 1775 1776 // Otherwise, we actually build a new type every time, but we 1777 // also build a canonical type. 1778 1779 SplitQualType canonElementType = getCanonicalType(elementType).split(); 1780 1781 void *insertPos = 0; 1782 llvm::FoldingSetNodeID ID; 1783 DependentSizedArrayType::Profile(ID, *this, 1784 QualType(canonElementType.first, 0), 1785 ASM, elementTypeQuals, numElements); 1786 1787 // Look for an existing type with these properties. 1788 DependentSizedArrayType *canonTy = 1789 DependentSizedArrayTypes.FindNodeOrInsertPos(ID, insertPos); 1790 1791 // If we don't have one, build one. 1792 if (!canonTy) { 1793 canonTy = new (*this, TypeAlignment) 1794 DependentSizedArrayType(*this, QualType(canonElementType.first, 0), 1795 QualType(), numElements, ASM, elementTypeQuals, 1796 brackets); 1797 DependentSizedArrayTypes.InsertNode(canonTy, insertPos); 1798 Types.push_back(canonTy); 1799 } 1800 1801 // Apply qualifiers from the element type to the array. 1802 QualType canon = getQualifiedType(QualType(canonTy,0), 1803 canonElementType.second); 1804 1805 // If we didn't need extra canonicalization for the element type, 1806 // then just use that as our result. 1807 if (QualType(canonElementType.first, 0) == elementType) 1808 return canon; 1809 1810 // Otherwise, we need to build a type which follows the spelling 1811 // of the element type. 1812 DependentSizedArrayType *sugaredType 1813 = new (*this, TypeAlignment) 1814 DependentSizedArrayType(*this, elementType, canon, numElements, 1815 ASM, elementTypeQuals, brackets); 1816 Types.push_back(sugaredType); 1817 return QualType(sugaredType, 0); 1818 } 1819 1820 QualType ASTContext::getIncompleteArrayType(QualType elementType, 1821 ArrayType::ArraySizeModifier ASM, 1822 unsigned elementTypeQuals) const { 1823 llvm::FoldingSetNodeID ID; 1824 IncompleteArrayType::Profile(ID, elementType, ASM, elementTypeQuals); 1825 1826 void *insertPos = 0; 1827 if (IncompleteArrayType *iat = 1828 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos)) 1829 return QualType(iat, 0); 1830 1831 // If the element type isn't canonical, this won't be a canonical type 1832 // either, so fill in the canonical type field. We also have to pull 1833 // qualifiers off the element type. 1834 QualType canon; 1835 1836 if (!elementType.isCanonical() || elementType.hasLocalQualifiers()) { 1837 SplitQualType canonSplit = getCanonicalType(elementType).split(); 1838 canon = getIncompleteArrayType(QualType(canonSplit.first, 0), 1839 ASM, elementTypeQuals); 1840 canon = getQualifiedType(canon, canonSplit.second); 1841 1842 // Get the new insert position for the node we care about. 1843 IncompleteArrayType *existing = 1844 IncompleteArrayTypes.FindNodeOrInsertPos(ID, insertPos); 1845 assert(!existing && "Shouldn't be in the map!"); (void) existing; 1846 } 1847 1848 IncompleteArrayType *newType = new (*this, TypeAlignment) 1849 IncompleteArrayType(elementType, canon, ASM, elementTypeQuals); 1850 1851 IncompleteArrayTypes.InsertNode(newType, insertPos); 1852 Types.push_back(newType); 1853 return QualType(newType, 0); 1854 } 1855 1856 /// getVectorType - Return the unique reference to a vector type of 1857 /// the specified element type and size. VectorType must be a built-in type. 1858 QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts, 1859 VectorType::VectorKind VecKind) const { 1860 assert(vecType->isBuiltinType()); 1861 1862 // Check if we've already instantiated a vector of this type. 1863 llvm::FoldingSetNodeID ID; 1864 VectorType::Profile(ID, vecType, NumElts, Type::Vector, VecKind); 1865 1866 void *InsertPos = 0; 1867 if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos)) 1868 return QualType(VTP, 0); 1869 1870 // If the element type isn't canonical, this won't be a canonical type either, 1871 // so fill in the canonical type field. 1872 QualType Canonical; 1873 if (!vecType.isCanonical()) { 1874 Canonical = getVectorType(getCanonicalType(vecType), NumElts, VecKind); 1875 1876 // Get the new insert position for the node we care about. 1877 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos); 1878 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1879 } 1880 VectorType *New = new (*this, TypeAlignment) 1881 VectorType(vecType, NumElts, Canonical, VecKind); 1882 VectorTypes.InsertNode(New, InsertPos); 1883 Types.push_back(New); 1884 return QualType(New, 0); 1885 } 1886 1887 /// getExtVectorType - Return the unique reference to an extended vector type of 1888 /// the specified element type and size. VectorType must be a built-in type. 1889 QualType 1890 ASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const { 1891 assert(vecType->isBuiltinType() || vecType->isDependentType()); 1892 1893 // Check if we've already instantiated a vector of this type. 1894 llvm::FoldingSetNodeID ID; 1895 VectorType::Profile(ID, vecType, NumElts, Type::ExtVector, 1896 VectorType::GenericVector); 1897 void *InsertPos = 0; 1898 if (VectorType *VTP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos)) 1899 return QualType(VTP, 0); 1900 1901 // If the element type isn't canonical, this won't be a canonical type either, 1902 // so fill in the canonical type field. 1903 QualType Canonical; 1904 if (!vecType.isCanonical()) { 1905 Canonical = getExtVectorType(getCanonicalType(vecType), NumElts); 1906 1907 // Get the new insert position for the node we care about. 1908 VectorType *NewIP = VectorTypes.FindNodeOrInsertPos(ID, InsertPos); 1909 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1910 } 1911 ExtVectorType *New = new (*this, TypeAlignment) 1912 ExtVectorType(vecType, NumElts, Canonical); 1913 VectorTypes.InsertNode(New, InsertPos); 1914 Types.push_back(New); 1915 return QualType(New, 0); 1916 } 1917 1918 QualType 1919 ASTContext::getDependentSizedExtVectorType(QualType vecType, 1920 Expr *SizeExpr, 1921 SourceLocation AttrLoc) const { 1922 llvm::FoldingSetNodeID ID; 1923 DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType), 1924 SizeExpr); 1925 1926 void *InsertPos = 0; 1927 DependentSizedExtVectorType *Canon 1928 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos); 1929 DependentSizedExtVectorType *New; 1930 if (Canon) { 1931 // We already have a canonical version of this array type; use it as 1932 // the canonical type for a newly-built type. 1933 New = new (*this, TypeAlignment) 1934 DependentSizedExtVectorType(*this, vecType, QualType(Canon, 0), 1935 SizeExpr, AttrLoc); 1936 } else { 1937 QualType CanonVecTy = getCanonicalType(vecType); 1938 if (CanonVecTy == vecType) { 1939 New = new (*this, TypeAlignment) 1940 DependentSizedExtVectorType(*this, vecType, QualType(), SizeExpr, 1941 AttrLoc); 1942 1943 DependentSizedExtVectorType *CanonCheck 1944 = DependentSizedExtVectorTypes.FindNodeOrInsertPos(ID, InsertPos); 1945 assert(!CanonCheck && "Dependent-sized ext_vector canonical type broken"); 1946 (void)CanonCheck; 1947 DependentSizedExtVectorTypes.InsertNode(New, InsertPos); 1948 } else { 1949 QualType Canon = getDependentSizedExtVectorType(CanonVecTy, SizeExpr, 1950 SourceLocation()); 1951 New = new (*this, TypeAlignment) 1952 DependentSizedExtVectorType(*this, vecType, Canon, SizeExpr, AttrLoc); 1953 } 1954 } 1955 1956 Types.push_back(New); 1957 return QualType(New, 0); 1958 } 1959 1960 /// getFunctionNoProtoType - Return a K&R style C function type like 'int()'. 1961 /// 1962 QualType 1963 ASTContext::getFunctionNoProtoType(QualType ResultTy, 1964 const FunctionType::ExtInfo &Info) const { 1965 const CallingConv DefaultCC = Info.getCC(); 1966 const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ? 1967 CC_X86StdCall : DefaultCC; 1968 // Unique functions, to guarantee there is only one function of a particular 1969 // structure. 1970 llvm::FoldingSetNodeID ID; 1971 FunctionNoProtoType::Profile(ID, ResultTy, Info); 1972 1973 void *InsertPos = 0; 1974 if (FunctionNoProtoType *FT = 1975 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) 1976 return QualType(FT, 0); 1977 1978 QualType Canonical; 1979 if (!ResultTy.isCanonical() || 1980 getCanonicalCallConv(CallConv) != CallConv) { 1981 Canonical = 1982 getFunctionNoProtoType(getCanonicalType(ResultTy), 1983 Info.withCallingConv(getCanonicalCallConv(CallConv))); 1984 1985 // Get the new insert position for the node we care about. 1986 FunctionNoProtoType *NewIP = 1987 FunctionNoProtoTypes.FindNodeOrInsertPos(ID, InsertPos); 1988 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 1989 } 1990 1991 FunctionProtoType::ExtInfo newInfo = Info.withCallingConv(CallConv); 1992 FunctionNoProtoType *New = new (*this, TypeAlignment) 1993 FunctionNoProtoType(ResultTy, Canonical, newInfo); 1994 Types.push_back(New); 1995 FunctionNoProtoTypes.InsertNode(New, InsertPos); 1996 return QualType(New, 0); 1997 } 1998 1999 /// getFunctionType - Return a normal function type with a typed argument 2000 /// list. isVariadic indicates whether the argument list includes '...'. 2001 QualType 2002 ASTContext::getFunctionType(QualType ResultTy, 2003 const QualType *ArgArray, unsigned NumArgs, 2004 const FunctionProtoType::ExtProtoInfo &EPI) const { 2005 // Unique functions, to guarantee there is only one function of a particular 2006 // structure. 2007 llvm::FoldingSetNodeID ID; 2008 FunctionProtoType::Profile(ID, ResultTy, ArgArray, NumArgs, EPI, *this); 2009 2010 void *InsertPos = 0; 2011 if (FunctionProtoType *FTP = 2012 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos)) 2013 return QualType(FTP, 0); 2014 2015 // Determine whether the type being created is already canonical or not. 2016 bool isCanonical= EPI.ExceptionSpecType == EST_None && ResultTy.isCanonical(); 2017 for (unsigned i = 0; i != NumArgs && isCanonical; ++i) 2018 if (!ArgArray[i].isCanonicalAsParam()) 2019 isCanonical = false; 2020 2021 const CallingConv DefaultCC = EPI.ExtInfo.getCC(); 2022 const CallingConv CallConv = (LangOpts.MRTD && DefaultCC == CC_Default) ? 2023 CC_X86StdCall : DefaultCC; 2024 2025 // If this type isn't canonical, get the canonical version of it. 2026 // The exception spec is not part of the canonical type. 2027 QualType Canonical; 2028 if (!isCanonical || getCanonicalCallConv(CallConv) != CallConv) { 2029 llvm::SmallVector<QualType, 16> CanonicalArgs; 2030 CanonicalArgs.reserve(NumArgs); 2031 for (unsigned i = 0; i != NumArgs; ++i) 2032 CanonicalArgs.push_back(getCanonicalParamType(ArgArray[i])); 2033 2034 FunctionProtoType::ExtProtoInfo CanonicalEPI = EPI; 2035 CanonicalEPI.ExceptionSpecType = EST_None; 2036 CanonicalEPI.NumExceptions = 0; 2037 CanonicalEPI.ExtInfo 2038 = CanonicalEPI.ExtInfo.withCallingConv(getCanonicalCallConv(CallConv)); 2039 2040 Canonical = getFunctionType(getCanonicalType(ResultTy), 2041 CanonicalArgs.data(), NumArgs, 2042 CanonicalEPI); 2043 2044 // Get the new insert position for the node we care about. 2045 FunctionProtoType *NewIP = 2046 FunctionProtoTypes.FindNodeOrInsertPos(ID, InsertPos); 2047 assert(NewIP == 0 && "Shouldn't be in the map!"); (void)NewIP; 2048 } 2049 2050 // FunctionProtoType objects are allocated with extra bytes after 2051 // them for three variable size arrays at the end: 2052 // - parameter types 2053 // - exception types 2054 // - consumed-arguments flags 2055 // Instead of the exception types, there could be a noexcept 2056 // expression. 2057 size_t Size = sizeof(FunctionProtoType) + 2058 NumArgs * sizeof(QualType); 2059 if (EPI.ExceptionSpecType == EST_Dynamic) 2060 Size += EPI.NumExceptions * sizeof(QualType); 2061 else if (EPI.ExceptionSpecType == EST_ComputedNoexcept) { 2062 Size += sizeof(Expr*); 2063 } 2064 if (EPI.ConsumedArguments) 2065 Size += NumArgs * sizeof(bool); 2066 2067 FunctionProtoType *FTP = (FunctionProtoType*) Allocate(Size, TypeAlignment); 2068 FunctionProtoType::ExtProtoInfo newEPI = EPI; 2069 newEPI.ExtInfo = EPI.ExtInfo.withCallingConv(CallConv); 2070 new (FTP) FunctionProtoType(ResultTy, ArgArray, NumArgs, Canonical, newEPI); 2071 Types.push_back(FTP); 2072 FunctionProtoTypes.InsertNode(FTP, InsertPos); 2073 return QualType(FTP, 0); 2074 } 2075 2076 #ifndef NDEBUG 2077 static bool NeedsInjectedClassNameType(const RecordDecl *D) { 2078 if (!isa<CXXRecordDecl>(D)) return false; 2079 const CXXRecordDecl *RD = cast<CXXRecordDecl>(D); 2080 if (isa<ClassTemplatePartialSpecializationDecl>(RD)) 2081 return true; 2082 if (RD->getDescribedClassTemplate() && 2083 !isa<ClassTemplateSpecializationDecl>(RD)) 2084 return true; 2085 return false; 2086 } 2087 #endif 2088 2089 /// getInjectedClassNameType - Return the unique reference to the 2090 /// injected class name type for the specified templated declaration. 2091 QualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl, 2092 QualType TST) const { 2093 assert(NeedsInjectedClassNameType(Decl)); 2094 if (Decl->TypeForDecl) { 2095 assert(isa<InjectedClassNameType>(Decl->TypeForDecl)); 2096 } else if (CXXRecordDecl *PrevDecl = Decl->getPreviousDeclaration()) { 2097 assert(PrevDecl->TypeForDecl && "previous declaration has no type"); 2098 Decl->TypeForDecl = PrevDecl->TypeForDecl; 2099 assert(isa<InjectedClassNameType>(Decl->TypeForDecl)); 2100 } else { 2101 Type *newType = 2102 new (*this, TypeAlignment) InjectedClassNameType(Decl, TST); 2103 Decl->TypeForDecl = newType; 2104 Types.push_back(newType); 2105 } 2106 return QualType(Decl->TypeForDecl, 0); 2107 } 2108 2109 /// getTypeDeclType - Return the unique reference to the type for the 2110 /// specified type declaration. 2111 QualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const { 2112 assert(Decl && "Passed null for Decl param"); 2113 assert(!Decl->TypeForDecl && "TypeForDecl present in slow case"); 2114 2115 if (const TypedefNameDecl *Typedef = dyn_cast<TypedefNameDecl>(Decl)) 2116 return getTypedefType(Typedef); 2117 2118 assert(!isa<TemplateTypeParmDecl>(Decl) && 2119 "Template type parameter types are always available."); 2120 2121 if (const RecordDecl *Record = dyn_cast<RecordDecl>(Decl)) { 2122 assert(!Record->getPreviousDeclaration() && 2123 "struct/union has previous declaration"); 2124 assert(!NeedsInjectedClassNameType(Record)); 2125 return getRecordType(Record); 2126 } else if (const EnumDecl *Enum = dyn_cast<EnumDecl>(Decl)) { 2127 assert(!Enum->getPreviousDeclaration() && 2128 "enum has previous declaration"); 2129 return getEnumType(Enum); 2130 } else if (const UnresolvedUsingTypenameDecl *Using = 2131 dyn_cast<UnresolvedUsingTypenameDecl>(Decl)) { 2132 Type *newType = new (*this, TypeAlignment) UnresolvedUsingType(Using); 2133 Decl->TypeForDecl = newType; 2134 Types.push_back(newType); 2135 } else 2136 llvm_unreachable("TypeDecl without a type?"); 2137 2138 return QualType(Decl->TypeForDecl, 0); 2139 } 2140 2141 /// getTypedefType - Return the unique reference to the type for the 2142 /// specified typedef name decl. 2143 QualType 2144 ASTContext::getTypedefType(const TypedefNameDecl *Decl, 2145 QualType Canonical) const { 2146 if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2147 2148 if (Canonical.isNull()) 2149 Canonical = getCanonicalType(Decl->getUnderlyingType()); 2150 TypedefType *newType = new(*this, TypeAlignment) 2151 TypedefType(Type::Typedef, Decl, Canonical); 2152 Decl->TypeForDecl = newType; 2153 Types.push_back(newType); 2154 return QualType(newType, 0); 2155 } 2156 2157 QualType ASTContext::getRecordType(const RecordDecl *Decl) const { 2158 if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2159 2160 if (const RecordDecl *PrevDecl = Decl->getPreviousDeclaration()) 2161 if (PrevDecl->TypeForDecl) 2162 return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0); 2163 2164 RecordType *newType = new (*this, TypeAlignment) RecordType(Decl); 2165 Decl->TypeForDecl = newType; 2166 Types.push_back(newType); 2167 return QualType(newType, 0); 2168 } 2169 2170 QualType ASTContext::getEnumType(const EnumDecl *Decl) const { 2171 if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0); 2172 2173 if (const EnumDecl *PrevDecl = Decl->getPreviousDeclaration()) 2174 if (PrevDecl->TypeForDecl) 2175 return QualType(Decl->TypeForDecl = PrevDecl->TypeForDecl, 0); 2176 2177 EnumType *newType = new (*this, TypeAlignment) EnumType(Decl); 2178 Decl->TypeForDecl = newType; 2179 Types.push_back(newType); 2180 return QualType(newType, 0); 2181 } 2182 2183 QualType ASTContext::getAttributedType(AttributedType::Kind attrKind, 2184 QualType modifiedType, 2185 QualType equivalentType) { 2186 llvm::FoldingSetNodeID id; 2187 AttributedType::Profile(id, attrKind, modifiedType, equivalentType); 2188 2189 void *insertPos = 0; 2190 AttributedType *type = AttributedTypes.FindNodeOrInsertPos(id, insertPos); 2191 if (type) return QualType(type, 0); 2192 2193 QualType canon = getCanonicalType(equivalentType); 2194 type = new (*this, TypeAlignment) 2195 AttributedType(canon, attrKind, modifiedType, equivalentType); 2196 2197 Types.push_back(type); 2198 AttributedTypes.InsertNode(type, insertPos); 2199 2200 return QualType(type, 0); 2201 } 2202 2203 2204 /// \brief Retrieve a substitution-result type. 2205 QualType 2206 ASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm, 2207 QualType Replacement) const { 2208 assert(Replacement.isCanonical() 2209 && "replacement types must always be canonical"); 2210 2211 llvm::FoldingSetNodeID ID; 2212 SubstTemplateTypeParmType::Profile(ID, Parm, Replacement); 2213 void *InsertPos = 0; 2214 SubstTemplateTypeParmType *SubstParm 2215 = SubstTemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2216 2217 if (!SubstParm) { 2218 SubstParm = new (*this, TypeAlignment) 2219 SubstTemplateTypeParmType(Parm, Replacement); 2220 Types.push_back(SubstParm); 2221 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); 2222 } 2223 2224 return QualType(SubstParm, 0); 2225 } 2226 2227 /// \brief Retrieve a 2228 QualType ASTContext::getSubstTemplateTypeParmPackType( 2229 const TemplateTypeParmType *Parm, 2230 const TemplateArgument &ArgPack) { 2231 #ifndef NDEBUG 2232 for (TemplateArgument::pack_iterator P = ArgPack.pack_begin(), 2233 PEnd = ArgPack.pack_end(); 2234 P != PEnd; ++P) { 2235 assert(P->getKind() == TemplateArgument::Type &&"Pack contains a non-type"); 2236 assert(P->getAsType().isCanonical() && "Pack contains non-canonical type"); 2237 } 2238 #endif 2239 2240 llvm::FoldingSetNodeID ID; 2241 SubstTemplateTypeParmPackType::Profile(ID, Parm, ArgPack); 2242 void *InsertPos = 0; 2243 if (SubstTemplateTypeParmPackType *SubstParm 2244 = SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos)) 2245 return QualType(SubstParm, 0); 2246 2247 QualType Canon; 2248 if (!Parm->isCanonicalUnqualified()) { 2249 Canon = getCanonicalType(QualType(Parm, 0)); 2250 Canon = getSubstTemplateTypeParmPackType(cast<TemplateTypeParmType>(Canon), 2251 ArgPack); 2252 SubstTemplateTypeParmPackTypes.FindNodeOrInsertPos(ID, InsertPos); 2253 } 2254 2255 SubstTemplateTypeParmPackType *SubstParm 2256 = new (*this, TypeAlignment) SubstTemplateTypeParmPackType(Parm, Canon, 2257 ArgPack); 2258 Types.push_back(SubstParm); 2259 SubstTemplateTypeParmTypes.InsertNode(SubstParm, InsertPos); 2260 return QualType(SubstParm, 0); 2261 } 2262 2263 /// \brief Retrieve the template type parameter type for a template 2264 /// parameter or parameter pack with the given depth, index, and (optionally) 2265 /// name. 2266 QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index, 2267 bool ParameterPack, 2268 TemplateTypeParmDecl *TTPDecl) const { 2269 llvm::FoldingSetNodeID ID; 2270 TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl); 2271 void *InsertPos = 0; 2272 TemplateTypeParmType *TypeParm 2273 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2274 2275 if (TypeParm) 2276 return QualType(TypeParm, 0); 2277 2278 if (TTPDecl) { 2279 QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack); 2280 TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon); 2281 2282 TemplateTypeParmType *TypeCheck 2283 = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos); 2284 assert(!TypeCheck && "Template type parameter canonical type broken"); 2285 (void)TypeCheck; 2286 } else 2287 TypeParm = new (*this, TypeAlignment) 2288 TemplateTypeParmType(Depth, Index, ParameterPack); 2289 2290 Types.push_back(TypeParm); 2291 TemplateTypeParmTypes.InsertNode(TypeParm, InsertPos); 2292 2293 return QualType(TypeParm, 0); 2294 } 2295 2296 TypeSourceInfo * 2297 ASTContext::getTemplateSpecializationTypeInfo(TemplateName Name, 2298 SourceLocation NameLoc, 2299 const TemplateArgumentListInfo &Args, 2300 QualType Underlying) const { 2301 assert(!Name.getAsDependentTemplateName() && 2302 "No dependent template names here!"); 2303 QualType TST = getTemplateSpecializationType(Name, Args, Underlying); 2304 2305 TypeSourceInfo *DI = CreateTypeSourceInfo(TST); 2306 TemplateSpecializationTypeLoc TL 2307 = cast<TemplateSpecializationTypeLoc>(DI->getTypeLoc()); 2308 TL.setTemplateNameLoc(NameLoc); 2309 TL.setLAngleLoc(Args.getLAngleLoc()); 2310 TL.setRAngleLoc(Args.getRAngleLoc()); 2311 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 2312 TL.setArgLocInfo(i, Args[i].getLocInfo()); 2313 return DI; 2314 } 2315 2316 QualType 2317 ASTContext::getTemplateSpecializationType(TemplateName Template, 2318 const TemplateArgumentListInfo &Args, 2319 QualType Underlying) const { 2320 assert(!Template.getAsDependentTemplateName() && 2321 "No dependent template names here!"); 2322 2323 unsigned NumArgs = Args.size(); 2324 2325 llvm::SmallVector<TemplateArgument, 4> ArgVec; 2326 ArgVec.reserve(NumArgs); 2327 for (unsigned i = 0; i != NumArgs; ++i) 2328 ArgVec.push_back(Args[i].getArgument()); 2329 2330 return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs, 2331 Underlying); 2332 } 2333 2334 QualType 2335 ASTContext::getTemplateSpecializationType(TemplateName Template, 2336 const TemplateArgument *Args, 2337 unsigned NumArgs, 2338 QualType Underlying) const { 2339 assert(!Template.getAsDependentTemplateName() && 2340 "No dependent template names here!"); 2341 // Look through qualified template names. 2342 if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 2343 Template = TemplateName(QTN->getTemplateDecl()); 2344 2345 bool isTypeAlias = 2346 Template.getAsTemplateDecl() && 2347 isa<TypeAliasTemplateDecl>(Template.getAsTemplateDecl()); 2348 2349 QualType CanonType; 2350 if (!Underlying.isNull()) 2351 CanonType = getCanonicalType(Underlying); 2352 else { 2353 assert(!isTypeAlias && 2354 "Underlying type for template alias must be computed by caller"); 2355 CanonType = getCanonicalTemplateSpecializationType(Template, Args, 2356 NumArgs); 2357 } 2358 2359 // Allocate the (non-canonical) template specialization type, but don't 2360 // try to unique it: these types typically have location information that 2361 // we don't unique and don't want to lose. 2362 void *Mem = Allocate(sizeof(TemplateSpecializationType) + 2363 sizeof(TemplateArgument) * NumArgs + 2364 (isTypeAlias ? sizeof(QualType) : 0), 2365 TypeAlignment); 2366 TemplateSpecializationType *Spec 2367 = new (Mem) TemplateSpecializationType(Template, 2368 Args, NumArgs, 2369 CanonType, 2370 isTypeAlias ? Underlying : QualType()); 2371 2372 Types.push_back(Spec); 2373 return QualType(Spec, 0); 2374 } 2375 2376 QualType 2377 ASTContext::getCanonicalTemplateSpecializationType(TemplateName Template, 2378 const TemplateArgument *Args, 2379 unsigned NumArgs) const { 2380 assert(!Template.getAsDependentTemplateName() && 2381 "No dependent template names here!"); 2382 assert((!Template.getAsTemplateDecl() || 2383 !isa<TypeAliasTemplateDecl>(Template.getAsTemplateDecl())) && 2384 "Underlying type for template alias must be computed by caller"); 2385 2386 // Look through qualified template names. 2387 if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 2388 Template = TemplateName(QTN->getTemplateDecl()); 2389 2390 // Build the canonical template specialization type. 2391 TemplateName CanonTemplate = getCanonicalTemplateName(Template); 2392 llvm::SmallVector<TemplateArgument, 4> CanonArgs; 2393 CanonArgs.reserve(NumArgs); 2394 for (unsigned I = 0; I != NumArgs; ++I) 2395 CanonArgs.push_back(getCanonicalTemplateArgument(Args[I])); 2396 2397 // Determine whether this canonical template specialization type already 2398 // exists. 2399 llvm::FoldingSetNodeID ID; 2400 TemplateSpecializationType::Profile(ID, CanonTemplate, 2401 CanonArgs.data(), NumArgs, *this); 2402 2403 void *InsertPos = 0; 2404 TemplateSpecializationType *Spec 2405 = TemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 2406 2407 if (!Spec) { 2408 // Allocate a new canonical template specialization type. 2409 void *Mem = Allocate((sizeof(TemplateSpecializationType) + 2410 sizeof(TemplateArgument) * NumArgs), 2411 TypeAlignment); 2412 Spec = new (Mem) TemplateSpecializationType(CanonTemplate, 2413 CanonArgs.data(), NumArgs, 2414 QualType(), QualType()); 2415 Types.push_back(Spec); 2416 TemplateSpecializationTypes.InsertNode(Spec, InsertPos); 2417 } 2418 2419 assert(Spec->isDependentType() && 2420 "Non-dependent template-id type must have a canonical type"); 2421 return QualType(Spec, 0); 2422 } 2423 2424 QualType 2425 ASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword, 2426 NestedNameSpecifier *NNS, 2427 QualType NamedType) const { 2428 llvm::FoldingSetNodeID ID; 2429 ElaboratedType::Profile(ID, Keyword, NNS, NamedType); 2430 2431 void *InsertPos = 0; 2432 ElaboratedType *T = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos); 2433 if (T) 2434 return QualType(T, 0); 2435 2436 QualType Canon = NamedType; 2437 if (!Canon.isCanonical()) { 2438 Canon = getCanonicalType(NamedType); 2439 ElaboratedType *CheckT = ElaboratedTypes.FindNodeOrInsertPos(ID, InsertPos); 2440 assert(!CheckT && "Elaborated canonical type broken"); 2441 (void)CheckT; 2442 } 2443 2444 T = new (*this) ElaboratedType(Keyword, NNS, NamedType, Canon); 2445 Types.push_back(T); 2446 ElaboratedTypes.InsertNode(T, InsertPos); 2447 return QualType(T, 0); 2448 } 2449 2450 QualType 2451 ASTContext::getParenType(QualType InnerType) const { 2452 llvm::FoldingSetNodeID ID; 2453 ParenType::Profile(ID, InnerType); 2454 2455 void *InsertPos = 0; 2456 ParenType *T = ParenTypes.FindNodeOrInsertPos(ID, InsertPos); 2457 if (T) 2458 return QualType(T, 0); 2459 2460 QualType Canon = InnerType; 2461 if (!Canon.isCanonical()) { 2462 Canon = getCanonicalType(InnerType); 2463 ParenType *CheckT = ParenTypes.FindNodeOrInsertPos(ID, InsertPos); 2464 assert(!CheckT && "Paren canonical type broken"); 2465 (void)CheckT; 2466 } 2467 2468 T = new (*this) ParenType(InnerType, Canon); 2469 Types.push_back(T); 2470 ParenTypes.InsertNode(T, InsertPos); 2471 return QualType(T, 0); 2472 } 2473 2474 QualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword, 2475 NestedNameSpecifier *NNS, 2476 const IdentifierInfo *Name, 2477 QualType Canon) const { 2478 assert(NNS->isDependent() && "nested-name-specifier must be dependent"); 2479 2480 if (Canon.isNull()) { 2481 NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 2482 ElaboratedTypeKeyword CanonKeyword = Keyword; 2483 if (Keyword == ETK_None) 2484 CanonKeyword = ETK_Typename; 2485 2486 if (CanonNNS != NNS || CanonKeyword != Keyword) 2487 Canon = getDependentNameType(CanonKeyword, CanonNNS, Name); 2488 } 2489 2490 llvm::FoldingSetNodeID ID; 2491 DependentNameType::Profile(ID, Keyword, NNS, Name); 2492 2493 void *InsertPos = 0; 2494 DependentNameType *T 2495 = DependentNameTypes.FindNodeOrInsertPos(ID, InsertPos); 2496 if (T) 2497 return QualType(T, 0); 2498 2499 T = new (*this) DependentNameType(Keyword, NNS, Name, Canon); 2500 Types.push_back(T); 2501 DependentNameTypes.InsertNode(T, InsertPos); 2502 return QualType(T, 0); 2503 } 2504 2505 QualType 2506 ASTContext::getDependentTemplateSpecializationType( 2507 ElaboratedTypeKeyword Keyword, 2508 NestedNameSpecifier *NNS, 2509 const IdentifierInfo *Name, 2510 const TemplateArgumentListInfo &Args) const { 2511 // TODO: avoid this copy 2512 llvm::SmallVector<TemplateArgument, 16> ArgCopy; 2513 for (unsigned I = 0, E = Args.size(); I != E; ++I) 2514 ArgCopy.push_back(Args[I].getArgument()); 2515 return getDependentTemplateSpecializationType(Keyword, NNS, Name, 2516 ArgCopy.size(), 2517 ArgCopy.data()); 2518 } 2519 2520 QualType 2521 ASTContext::getDependentTemplateSpecializationType( 2522 ElaboratedTypeKeyword Keyword, 2523 NestedNameSpecifier *NNS, 2524 const IdentifierInfo *Name, 2525 unsigned NumArgs, 2526 const TemplateArgument *Args) const { 2527 assert((!NNS || NNS->isDependent()) && 2528 "nested-name-specifier must be dependent"); 2529 2530 llvm::FoldingSetNodeID ID; 2531 DependentTemplateSpecializationType::Profile(ID, *this, Keyword, NNS, 2532 Name, NumArgs, Args); 2533 2534 void *InsertPos = 0; 2535 DependentTemplateSpecializationType *T 2536 = DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 2537 if (T) 2538 return QualType(T, 0); 2539 2540 NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 2541 2542 ElaboratedTypeKeyword CanonKeyword = Keyword; 2543 if (Keyword == ETK_None) CanonKeyword = ETK_Typename; 2544 2545 bool AnyNonCanonArgs = false; 2546 llvm::SmallVector<TemplateArgument, 16> CanonArgs(NumArgs); 2547 for (unsigned I = 0; I != NumArgs; ++I) { 2548 CanonArgs[I] = getCanonicalTemplateArgument(Args[I]); 2549 if (!CanonArgs[I].structurallyEquals(Args[I])) 2550 AnyNonCanonArgs = true; 2551 } 2552 2553 QualType Canon; 2554 if (AnyNonCanonArgs || CanonNNS != NNS || CanonKeyword != Keyword) { 2555 Canon = getDependentTemplateSpecializationType(CanonKeyword, CanonNNS, 2556 Name, NumArgs, 2557 CanonArgs.data()); 2558 2559 // Find the insert position again. 2560 DependentTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); 2561 } 2562 2563 void *Mem = Allocate((sizeof(DependentTemplateSpecializationType) + 2564 sizeof(TemplateArgument) * NumArgs), 2565 TypeAlignment); 2566 T = new (Mem) DependentTemplateSpecializationType(Keyword, NNS, 2567 Name, NumArgs, Args, Canon); 2568 Types.push_back(T); 2569 DependentTemplateSpecializationTypes.InsertNode(T, InsertPos); 2570 return QualType(T, 0); 2571 } 2572 2573 QualType ASTContext::getPackExpansionType(QualType Pattern, 2574 llvm::Optional<unsigned> NumExpansions) { 2575 llvm::FoldingSetNodeID ID; 2576 PackExpansionType::Profile(ID, Pattern, NumExpansions); 2577 2578 assert(Pattern->containsUnexpandedParameterPack() && 2579 "Pack expansions must expand one or more parameter packs"); 2580 void *InsertPos = 0; 2581 PackExpansionType *T 2582 = PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos); 2583 if (T) 2584 return QualType(T, 0); 2585 2586 QualType Canon; 2587 if (!Pattern.isCanonical()) { 2588 Canon = getPackExpansionType(getCanonicalType(Pattern), NumExpansions); 2589 2590 // Find the insert position again. 2591 PackExpansionTypes.FindNodeOrInsertPos(ID, InsertPos); 2592 } 2593 2594 T = new (*this) PackExpansionType(Pattern, Canon, NumExpansions); 2595 Types.push_back(T); 2596 PackExpansionTypes.InsertNode(T, InsertPos); 2597 return QualType(T, 0); 2598 } 2599 2600 /// CmpProtocolNames - Comparison predicate for sorting protocols 2601 /// alphabetically. 2602 static bool CmpProtocolNames(const ObjCProtocolDecl *LHS, 2603 const ObjCProtocolDecl *RHS) { 2604 return LHS->getDeclName() < RHS->getDeclName(); 2605 } 2606 2607 static bool areSortedAndUniqued(ObjCProtocolDecl * const *Protocols, 2608 unsigned NumProtocols) { 2609 if (NumProtocols == 0) return true; 2610 2611 for (unsigned i = 1; i != NumProtocols; ++i) 2612 if (!CmpProtocolNames(Protocols[i-1], Protocols[i])) 2613 return false; 2614 return true; 2615 } 2616 2617 static void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols, 2618 unsigned &NumProtocols) { 2619 ObjCProtocolDecl **ProtocolsEnd = Protocols+NumProtocols; 2620 2621 // Sort protocols, keyed by name. 2622 std::sort(Protocols, Protocols+NumProtocols, CmpProtocolNames); 2623 2624 // Remove duplicates. 2625 ProtocolsEnd = std::unique(Protocols, ProtocolsEnd); 2626 NumProtocols = ProtocolsEnd-Protocols; 2627 } 2628 2629 QualType ASTContext::getObjCObjectType(QualType BaseType, 2630 ObjCProtocolDecl * const *Protocols, 2631 unsigned NumProtocols) const { 2632 // If the base type is an interface and there aren't any protocols 2633 // to add, then the interface type will do just fine. 2634 if (!NumProtocols && isa<ObjCInterfaceType>(BaseType)) 2635 return BaseType; 2636 2637 // Look in the folding set for an existing type. 2638 llvm::FoldingSetNodeID ID; 2639 ObjCObjectTypeImpl::Profile(ID, BaseType, Protocols, NumProtocols); 2640 void *InsertPos = 0; 2641 if (ObjCObjectType *QT = ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos)) 2642 return QualType(QT, 0); 2643 2644 // Build the canonical type, which has the canonical base type and 2645 // a sorted-and-uniqued list of protocols. 2646 QualType Canonical; 2647 bool ProtocolsSorted = areSortedAndUniqued(Protocols, NumProtocols); 2648 if (!ProtocolsSorted || !BaseType.isCanonical()) { 2649 if (!ProtocolsSorted) { 2650 llvm::SmallVector<ObjCProtocolDecl*, 8> Sorted(Protocols, 2651 Protocols + NumProtocols); 2652 unsigned UniqueCount = NumProtocols; 2653 2654 SortAndUniqueProtocols(&Sorted[0], UniqueCount); 2655 Canonical = getObjCObjectType(getCanonicalType(BaseType), 2656 &Sorted[0], UniqueCount); 2657 } else { 2658 Canonical = getObjCObjectType(getCanonicalType(BaseType), 2659 Protocols, NumProtocols); 2660 } 2661 2662 // Regenerate InsertPos. 2663 ObjCObjectTypes.FindNodeOrInsertPos(ID, InsertPos); 2664 } 2665 2666 unsigned Size = sizeof(ObjCObjectTypeImpl); 2667 Size += NumProtocols * sizeof(ObjCProtocolDecl *); 2668 void *Mem = Allocate(Size, TypeAlignment); 2669 ObjCObjectTypeImpl *T = 2670 new (Mem) ObjCObjectTypeImpl(Canonical, BaseType, Protocols, NumProtocols); 2671 2672 Types.push_back(T); 2673 ObjCObjectTypes.InsertNode(T, InsertPos); 2674 return QualType(T, 0); 2675 } 2676 2677 /// getObjCObjectPointerType - Return a ObjCObjectPointerType type for 2678 /// the given object type. 2679 QualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const { 2680 llvm::FoldingSetNodeID ID; 2681 ObjCObjectPointerType::Profile(ID, ObjectT); 2682 2683 void *InsertPos = 0; 2684 if (ObjCObjectPointerType *QT = 2685 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos)) 2686 return QualType(QT, 0); 2687 2688 // Find the canonical object type. 2689 QualType Canonical; 2690 if (!ObjectT.isCanonical()) { 2691 Canonical = getObjCObjectPointerType(getCanonicalType(ObjectT)); 2692 2693 // Regenerate InsertPos. 2694 ObjCObjectPointerTypes.FindNodeOrInsertPos(ID, InsertPos); 2695 } 2696 2697 // No match. 2698 void *Mem = Allocate(sizeof(ObjCObjectPointerType), TypeAlignment); 2699 ObjCObjectPointerType *QType = 2700 new (Mem) ObjCObjectPointerType(Canonical, ObjectT); 2701 2702 Types.push_back(QType); 2703 ObjCObjectPointerTypes.InsertNode(QType, InsertPos); 2704 return QualType(QType, 0); 2705 } 2706 2707 /// getObjCInterfaceType - Return the unique reference to the type for the 2708 /// specified ObjC interface decl. The list of protocols is optional. 2709 QualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl) const { 2710 if (Decl->TypeForDecl) 2711 return QualType(Decl->TypeForDecl, 0); 2712 2713 // FIXME: redeclarations? 2714 void *Mem = Allocate(sizeof(ObjCInterfaceType), TypeAlignment); 2715 ObjCInterfaceType *T = new (Mem) ObjCInterfaceType(Decl); 2716 Decl->TypeForDecl = T; 2717 Types.push_back(T); 2718 return QualType(T, 0); 2719 } 2720 2721 /// getTypeOfExprType - Unlike many "get<Type>" functions, we can't unique 2722 /// TypeOfExprType AST's (since expression's are never shared). For example, 2723 /// multiple declarations that refer to "typeof(x)" all contain different 2724 /// DeclRefExpr's. This doesn't effect the type checker, since it operates 2725 /// on canonical type's (which are always unique). 2726 QualType ASTContext::getTypeOfExprType(Expr *tofExpr) const { 2727 TypeOfExprType *toe; 2728 if (tofExpr->isTypeDependent()) { 2729 llvm::FoldingSetNodeID ID; 2730 DependentTypeOfExprType::Profile(ID, *this, tofExpr); 2731 2732 void *InsertPos = 0; 2733 DependentTypeOfExprType *Canon 2734 = DependentTypeOfExprTypes.FindNodeOrInsertPos(ID, InsertPos); 2735 if (Canon) { 2736 // We already have a "canonical" version of an identical, dependent 2737 // typeof(expr) type. Use that as our canonical type. 2738 toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, 2739 QualType((TypeOfExprType*)Canon, 0)); 2740 } 2741 else { 2742 // Build a new, canonical typeof(expr) type. 2743 Canon 2744 = new (*this, TypeAlignment) DependentTypeOfExprType(*this, tofExpr); 2745 DependentTypeOfExprTypes.InsertNode(Canon, InsertPos); 2746 toe = Canon; 2747 } 2748 } else { 2749 QualType Canonical = getCanonicalType(tofExpr->getType()); 2750 toe = new (*this, TypeAlignment) TypeOfExprType(tofExpr, Canonical); 2751 } 2752 Types.push_back(toe); 2753 return QualType(toe, 0); 2754 } 2755 2756 /// getTypeOfType - Unlike many "get<Type>" functions, we don't unique 2757 /// TypeOfType AST's. The only motivation to unique these nodes would be 2758 /// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be 2759 /// an issue. This doesn't effect the type checker, since it operates 2760 /// on canonical type's (which are always unique). 2761 QualType ASTContext::getTypeOfType(QualType tofType) const { 2762 QualType Canonical = getCanonicalType(tofType); 2763 TypeOfType *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical); 2764 Types.push_back(tot); 2765 return QualType(tot, 0); 2766 } 2767 2768 /// getDecltypeForExpr - Given an expr, will return the decltype for that 2769 /// expression, according to the rules in C++0x [dcl.type.simple]p4 2770 static QualType getDecltypeForExpr(const Expr *e, const ASTContext &Context) { 2771 if (e->isTypeDependent()) 2772 return Context.DependentTy; 2773 2774 // If e is an id expression or a class member access, decltype(e) is defined 2775 // as the type of the entity named by e. 2776 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(e)) { 2777 if (const ValueDecl *VD = dyn_cast<ValueDecl>(DRE->getDecl())) 2778 return VD->getType(); 2779 } 2780 if (const MemberExpr *ME = dyn_cast<MemberExpr>(e)) { 2781 if (const FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl())) 2782 return FD->getType(); 2783 } 2784 // If e is a function call or an invocation of an overloaded operator, 2785 // (parentheses around e are ignored), decltype(e) is defined as the 2786 // return type of that function. 2787 if (const CallExpr *CE = dyn_cast<CallExpr>(e->IgnoreParens())) 2788 return CE->getCallReturnType(); 2789 2790 QualType T = e->getType(); 2791 2792 // Otherwise, where T is the type of e, if e is an lvalue, decltype(e) is 2793 // defined as T&, otherwise decltype(e) is defined as T. 2794 if (e->isLValue()) 2795 T = Context.getLValueReferenceType(T); 2796 2797 return T; 2798 } 2799 2800 /// getDecltypeType - Unlike many "get<Type>" functions, we don't unique 2801 /// DecltypeType AST's. The only motivation to unique these nodes would be 2802 /// memory savings. Since decltype(t) is fairly uncommon, space shouldn't be 2803 /// an issue. This doesn't effect the type checker, since it operates 2804 /// on canonical type's (which are always unique). 2805 QualType ASTContext::getDecltypeType(Expr *e) const { 2806 DecltypeType *dt; 2807 2808 // C++0x [temp.type]p2: 2809 // If an expression e involves a template parameter, decltype(e) denotes a 2810 // unique dependent type. Two such decltype-specifiers refer to the same 2811 // type only if their expressions are equivalent (14.5.6.1). 2812 if (e->isInstantiationDependent()) { 2813 llvm::FoldingSetNodeID ID; 2814 DependentDecltypeType::Profile(ID, *this, e); 2815 2816 void *InsertPos = 0; 2817 DependentDecltypeType *Canon 2818 = DependentDecltypeTypes.FindNodeOrInsertPos(ID, InsertPos); 2819 if (Canon) { 2820 // We already have a "canonical" version of an equivalent, dependent 2821 // decltype type. Use that as our canonical type. 2822 dt = new (*this, TypeAlignment) DecltypeType(e, DependentTy, 2823 QualType((DecltypeType*)Canon, 0)); 2824 } 2825 else { 2826 // Build a new, canonical typeof(expr) type. 2827 Canon = new (*this, TypeAlignment) DependentDecltypeType(*this, e); 2828 DependentDecltypeTypes.InsertNode(Canon, InsertPos); 2829 dt = Canon; 2830 } 2831 } else { 2832 QualType T = getDecltypeForExpr(e, *this); 2833 dt = new (*this, TypeAlignment) DecltypeType(e, T, getCanonicalType(T)); 2834 } 2835 Types.push_back(dt); 2836 return QualType(dt, 0); 2837 } 2838 2839 /// getUnaryTransformationType - We don't unique these, since the memory 2840 /// savings are minimal and these are rare. 2841 QualType ASTContext::getUnaryTransformType(QualType BaseType, 2842 QualType UnderlyingType, 2843 UnaryTransformType::UTTKind Kind) 2844 const { 2845 UnaryTransformType *Ty = 2846 new (*this, TypeAlignment) UnaryTransformType (BaseType, UnderlyingType, 2847 Kind, 2848 UnderlyingType->isDependentType() ? 2849 QualType() : UnderlyingType); 2850 Types.push_back(Ty); 2851 return QualType(Ty, 0); 2852 } 2853 2854 /// getAutoType - We only unique auto types after they've been deduced. 2855 QualType ASTContext::getAutoType(QualType DeducedType) const { 2856 void *InsertPos = 0; 2857 if (!DeducedType.isNull()) { 2858 // Look in the folding set for an existing type. 2859 llvm::FoldingSetNodeID ID; 2860 AutoType::Profile(ID, DeducedType); 2861 if (AutoType *AT = AutoTypes.FindNodeOrInsertPos(ID, InsertPos)) 2862 return QualType(AT, 0); 2863 } 2864 2865 AutoType *AT = new (*this, TypeAlignment) AutoType(DeducedType); 2866 Types.push_back(AT); 2867 if (InsertPos) 2868 AutoTypes.InsertNode(AT, InsertPos); 2869 return QualType(AT, 0); 2870 } 2871 2872 /// getAutoDeductType - Get type pattern for deducing against 'auto'. 2873 QualType ASTContext::getAutoDeductType() const { 2874 if (AutoDeductTy.isNull()) 2875 AutoDeductTy = getAutoType(QualType()); 2876 assert(!AutoDeductTy.isNull() && "can't build 'auto' pattern"); 2877 return AutoDeductTy; 2878 } 2879 2880 /// getAutoRRefDeductType - Get type pattern for deducing against 'auto &&'. 2881 QualType ASTContext::getAutoRRefDeductType() const { 2882 if (AutoRRefDeductTy.isNull()) 2883 AutoRRefDeductTy = getRValueReferenceType(getAutoDeductType()); 2884 assert(!AutoRRefDeductTy.isNull() && "can't build 'auto &&' pattern"); 2885 return AutoRRefDeductTy; 2886 } 2887 2888 /// getTagDeclType - Return the unique reference to the type for the 2889 /// specified TagDecl (struct/union/class/enum) decl. 2890 QualType ASTContext::getTagDeclType(const TagDecl *Decl) const { 2891 assert (Decl); 2892 // FIXME: What is the design on getTagDeclType when it requires casting 2893 // away const? mutable? 2894 return getTypeDeclType(const_cast<TagDecl*>(Decl)); 2895 } 2896 2897 /// getSizeType - Return the unique type for "size_t" (C99 7.17), the result 2898 /// of the sizeof operator (C99 6.5.3.4p4). The value is target dependent and 2899 /// needs to agree with the definition in <stddef.h>. 2900 CanQualType ASTContext::getSizeType() const { 2901 return getFromTargetType(Target.getSizeType()); 2902 } 2903 2904 /// getSignedWCharType - Return the type of "signed wchar_t". 2905 /// Used when in C++, as a GCC extension. 2906 QualType ASTContext::getSignedWCharType() const { 2907 // FIXME: derive from "Target" ? 2908 return WCharTy; 2909 } 2910 2911 /// getUnsignedWCharType - Return the type of "unsigned wchar_t". 2912 /// Used when in C++, as a GCC extension. 2913 QualType ASTContext::getUnsignedWCharType() const { 2914 // FIXME: derive from "Target" ? 2915 return UnsignedIntTy; 2916 } 2917 2918 /// getPointerDiffType - Return the unique type for "ptrdiff_t" (ref?) 2919 /// defined in <stddef.h>. Pointer - pointer requires this (C99 6.5.6p9). 2920 QualType ASTContext::getPointerDiffType() const { 2921 return getFromTargetType(Target.getPtrDiffType(0)); 2922 } 2923 2924 //===----------------------------------------------------------------------===// 2925 // Type Operators 2926 //===----------------------------------------------------------------------===// 2927 2928 CanQualType ASTContext::getCanonicalParamType(QualType T) const { 2929 // Push qualifiers into arrays, and then discard any remaining 2930 // qualifiers. 2931 T = getCanonicalType(T); 2932 T = getVariableArrayDecayedType(T); 2933 const Type *Ty = T.getTypePtr(); 2934 QualType Result; 2935 if (isa<ArrayType>(Ty)) { 2936 Result = getArrayDecayedType(QualType(Ty,0)); 2937 } else if (isa<FunctionType>(Ty)) { 2938 Result = getPointerType(QualType(Ty, 0)); 2939 } else { 2940 Result = QualType(Ty, 0); 2941 } 2942 2943 return CanQualType::CreateUnsafe(Result); 2944 } 2945 2946 QualType ASTContext::getUnqualifiedArrayType(QualType type, 2947 Qualifiers &quals) { 2948 SplitQualType splitType = type.getSplitUnqualifiedType(); 2949 2950 // FIXME: getSplitUnqualifiedType() actually walks all the way to 2951 // the unqualified desugared type and then drops it on the floor. 2952 // We then have to strip that sugar back off with 2953 // getUnqualifiedDesugaredType(), which is silly. 2954 const ArrayType *AT = 2955 dyn_cast<ArrayType>(splitType.first->getUnqualifiedDesugaredType()); 2956 2957 // If we don't have an array, just use the results in splitType. 2958 if (!AT) { 2959 quals = splitType.second; 2960 return QualType(splitType.first, 0); 2961 } 2962 2963 // Otherwise, recurse on the array's element type. 2964 QualType elementType = AT->getElementType(); 2965 QualType unqualElementType = getUnqualifiedArrayType(elementType, quals); 2966 2967 // If that didn't change the element type, AT has no qualifiers, so we 2968 // can just use the results in splitType. 2969 if (elementType == unqualElementType) { 2970 assert(quals.empty()); // from the recursive call 2971 quals = splitType.second; 2972 return QualType(splitType.first, 0); 2973 } 2974 2975 // Otherwise, add in the qualifiers from the outermost type, then 2976 // build the type back up. 2977 quals.addConsistentQualifiers(splitType.second); 2978 2979 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) { 2980 return getConstantArrayType(unqualElementType, CAT->getSize(), 2981 CAT->getSizeModifier(), 0); 2982 } 2983 2984 if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(AT)) { 2985 return getIncompleteArrayType(unqualElementType, IAT->getSizeModifier(), 0); 2986 } 2987 2988 if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(AT)) { 2989 return getVariableArrayType(unqualElementType, 2990 VAT->getSizeExpr(), 2991 VAT->getSizeModifier(), 2992 VAT->getIndexTypeCVRQualifiers(), 2993 VAT->getBracketsRange()); 2994 } 2995 2996 const DependentSizedArrayType *DSAT = cast<DependentSizedArrayType>(AT); 2997 return getDependentSizedArrayType(unqualElementType, DSAT->getSizeExpr(), 2998 DSAT->getSizeModifier(), 0, 2999 SourceRange()); 3000 } 3001 3002 /// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types that 3003 /// may be similar (C++ 4.4), replaces T1 and T2 with the type that 3004 /// they point to and return true. If T1 and T2 aren't pointer types 3005 /// or pointer-to-member types, or if they are not similar at this 3006 /// level, returns false and leaves T1 and T2 unchanged. Top-level 3007 /// qualifiers on T1 and T2 are ignored. This function will typically 3008 /// be called in a loop that successively "unwraps" pointer and 3009 /// pointer-to-member types to compare them at each level. 3010 bool ASTContext::UnwrapSimilarPointerTypes(QualType &T1, QualType &T2) { 3011 const PointerType *T1PtrType = T1->getAs<PointerType>(), 3012 *T2PtrType = T2->getAs<PointerType>(); 3013 if (T1PtrType && T2PtrType) { 3014 T1 = T1PtrType->getPointeeType(); 3015 T2 = T2PtrType->getPointeeType(); 3016 return true; 3017 } 3018 3019 const MemberPointerType *T1MPType = T1->getAs<MemberPointerType>(), 3020 *T2MPType = T2->getAs<MemberPointerType>(); 3021 if (T1MPType && T2MPType && 3022 hasSameUnqualifiedType(QualType(T1MPType->getClass(), 0), 3023 QualType(T2MPType->getClass(), 0))) { 3024 T1 = T1MPType->getPointeeType(); 3025 T2 = T2MPType->getPointeeType(); 3026 return true; 3027 } 3028 3029 if (getLangOptions().ObjC1) { 3030 const ObjCObjectPointerType *T1OPType = T1->getAs<ObjCObjectPointerType>(), 3031 *T2OPType = T2->getAs<ObjCObjectPointerType>(); 3032 if (T1OPType && T2OPType) { 3033 T1 = T1OPType->getPointeeType(); 3034 T2 = T2OPType->getPointeeType(); 3035 return true; 3036 } 3037 } 3038 3039 // FIXME: Block pointers, too? 3040 3041 return false; 3042 } 3043 3044 DeclarationNameInfo 3045 ASTContext::getNameForTemplate(TemplateName Name, 3046 SourceLocation NameLoc) const { 3047 switch (Name.getKind()) { 3048 case TemplateName::QualifiedTemplate: 3049 case TemplateName::Template: 3050 // DNInfo work in progress: CHECKME: what about DNLoc? 3051 return DeclarationNameInfo(Name.getAsTemplateDecl()->getDeclName(), 3052 NameLoc); 3053 3054 case TemplateName::OverloadedTemplate: { 3055 OverloadedTemplateStorage *Storage = Name.getAsOverloadedTemplate(); 3056 // DNInfo work in progress: CHECKME: what about DNLoc? 3057 return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc); 3058 } 3059 3060 case TemplateName::DependentTemplate: { 3061 DependentTemplateName *DTN = Name.getAsDependentTemplateName(); 3062 DeclarationName DName; 3063 if (DTN->isIdentifier()) { 3064 DName = DeclarationNames.getIdentifier(DTN->getIdentifier()); 3065 return DeclarationNameInfo(DName, NameLoc); 3066 } else { 3067 DName = DeclarationNames.getCXXOperatorName(DTN->getOperator()); 3068 // DNInfo work in progress: FIXME: source locations? 3069 DeclarationNameLoc DNLoc; 3070 DNLoc.CXXOperatorName.BeginOpNameLoc = SourceLocation().getRawEncoding(); 3071 DNLoc.CXXOperatorName.EndOpNameLoc = SourceLocation().getRawEncoding(); 3072 return DeclarationNameInfo(DName, NameLoc, DNLoc); 3073 } 3074 } 3075 3076 case TemplateName::SubstTemplateTemplateParm: { 3077 SubstTemplateTemplateParmStorage *subst 3078 = Name.getAsSubstTemplateTemplateParm(); 3079 return DeclarationNameInfo(subst->getParameter()->getDeclName(), 3080 NameLoc); 3081 } 3082 3083 case TemplateName::SubstTemplateTemplateParmPack: { 3084 SubstTemplateTemplateParmPackStorage *subst 3085 = Name.getAsSubstTemplateTemplateParmPack(); 3086 return DeclarationNameInfo(subst->getParameterPack()->getDeclName(), 3087 NameLoc); 3088 } 3089 } 3090 3091 llvm_unreachable("bad template name kind!"); 3092 } 3093 3094 TemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const { 3095 switch (Name.getKind()) { 3096 case TemplateName::QualifiedTemplate: 3097 case TemplateName::Template: { 3098 TemplateDecl *Template = Name.getAsTemplateDecl(); 3099 if (TemplateTemplateParmDecl *TTP 3100 = dyn_cast<TemplateTemplateParmDecl>(Template)) 3101 Template = getCanonicalTemplateTemplateParmDecl(TTP); 3102 3103 // The canonical template name is the canonical template declaration. 3104 return TemplateName(cast<TemplateDecl>(Template->getCanonicalDecl())); 3105 } 3106 3107 case TemplateName::OverloadedTemplate: 3108 llvm_unreachable("cannot canonicalize overloaded template"); 3109 3110 case TemplateName::DependentTemplate: { 3111 DependentTemplateName *DTN = Name.getAsDependentTemplateName(); 3112 assert(DTN && "Non-dependent template names must refer to template decls."); 3113 return DTN->CanonicalTemplateName; 3114 } 3115 3116 case TemplateName::SubstTemplateTemplateParm: { 3117 SubstTemplateTemplateParmStorage *subst 3118 = Name.getAsSubstTemplateTemplateParm(); 3119 return getCanonicalTemplateName(subst->getReplacement()); 3120 } 3121 3122 case TemplateName::SubstTemplateTemplateParmPack: { 3123 SubstTemplateTemplateParmPackStorage *subst 3124 = Name.getAsSubstTemplateTemplateParmPack(); 3125 TemplateTemplateParmDecl *canonParameter 3126 = getCanonicalTemplateTemplateParmDecl(subst->getParameterPack()); 3127 TemplateArgument canonArgPack 3128 = getCanonicalTemplateArgument(subst->getArgumentPack()); 3129 return getSubstTemplateTemplateParmPack(canonParameter, canonArgPack); 3130 } 3131 } 3132 3133 llvm_unreachable("bad template name!"); 3134 } 3135 3136 bool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) { 3137 X = getCanonicalTemplateName(X); 3138 Y = getCanonicalTemplateName(Y); 3139 return X.getAsVoidPointer() == Y.getAsVoidPointer(); 3140 } 3141 3142 TemplateArgument 3143 ASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const { 3144 switch (Arg.getKind()) { 3145 case TemplateArgument::Null: 3146 return Arg; 3147 3148 case TemplateArgument::Expression: 3149 return Arg; 3150 3151 case TemplateArgument::Declaration: 3152 return TemplateArgument(Arg.getAsDecl()->getCanonicalDecl()); 3153 3154 case TemplateArgument::Template: 3155 return TemplateArgument(getCanonicalTemplateName(Arg.getAsTemplate())); 3156 3157 case TemplateArgument::TemplateExpansion: 3158 return TemplateArgument(getCanonicalTemplateName( 3159 Arg.getAsTemplateOrTemplatePattern()), 3160 Arg.getNumTemplateExpansions()); 3161 3162 case TemplateArgument::Integral: 3163 return TemplateArgument(*Arg.getAsIntegral(), 3164 getCanonicalType(Arg.getIntegralType())); 3165 3166 case TemplateArgument::Type: 3167 return TemplateArgument(getCanonicalType(Arg.getAsType())); 3168 3169 case TemplateArgument::Pack: { 3170 if (Arg.pack_size() == 0) 3171 return Arg; 3172 3173 TemplateArgument *CanonArgs 3174 = new (*this) TemplateArgument[Arg.pack_size()]; 3175 unsigned Idx = 0; 3176 for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 3177 AEnd = Arg.pack_end(); 3178 A != AEnd; (void)++A, ++Idx) 3179 CanonArgs[Idx] = getCanonicalTemplateArgument(*A); 3180 3181 return TemplateArgument(CanonArgs, Arg.pack_size()); 3182 } 3183 } 3184 3185 // Silence GCC warning 3186 assert(false && "Unhandled template argument kind"); 3187 return TemplateArgument(); 3188 } 3189 3190 NestedNameSpecifier * 3191 ASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const { 3192 if (!NNS) 3193 return 0; 3194 3195 switch (NNS->getKind()) { 3196 case NestedNameSpecifier::Identifier: 3197 // Canonicalize the prefix but keep the identifier the same. 3198 return NestedNameSpecifier::Create(*this, 3199 getCanonicalNestedNameSpecifier(NNS->getPrefix()), 3200 NNS->getAsIdentifier()); 3201 3202 case NestedNameSpecifier::Namespace: 3203 // A namespace is canonical; build a nested-name-specifier with 3204 // this namespace and no prefix. 3205 return NestedNameSpecifier::Create(*this, 0, 3206 NNS->getAsNamespace()->getOriginalNamespace()); 3207 3208 case NestedNameSpecifier::NamespaceAlias: 3209 // A namespace is canonical; build a nested-name-specifier with 3210 // this namespace and no prefix. 3211 return NestedNameSpecifier::Create(*this, 0, 3212 NNS->getAsNamespaceAlias()->getNamespace() 3213 ->getOriginalNamespace()); 3214 3215 case NestedNameSpecifier::TypeSpec: 3216 case NestedNameSpecifier::TypeSpecWithTemplate: { 3217 QualType T = getCanonicalType(QualType(NNS->getAsType(), 0)); 3218 3219 // If we have some kind of dependent-named type (e.g., "typename T::type"), 3220 // break it apart into its prefix and identifier, then reconsititute those 3221 // as the canonical nested-name-specifier. This is required to canonicalize 3222 // a dependent nested-name-specifier involving typedefs of dependent-name 3223 // types, e.g., 3224 // typedef typename T::type T1; 3225 // typedef typename T1::type T2; 3226 if (const DependentNameType *DNT = T->getAs<DependentNameType>()) { 3227 NestedNameSpecifier *Prefix 3228 = getCanonicalNestedNameSpecifier(DNT->getQualifier()); 3229 return NestedNameSpecifier::Create(*this, Prefix, 3230 const_cast<IdentifierInfo *>(DNT->getIdentifier())); 3231 } 3232 3233 // Do the same thing as above, but with dependent-named specializations. 3234 if (const DependentTemplateSpecializationType *DTST 3235 = T->getAs<DependentTemplateSpecializationType>()) { 3236 NestedNameSpecifier *Prefix 3237 = getCanonicalNestedNameSpecifier(DTST->getQualifier()); 3238 3239 T = getDependentTemplateSpecializationType(DTST->getKeyword(), 3240 Prefix, DTST->getIdentifier(), 3241 DTST->getNumArgs(), 3242 DTST->getArgs()); 3243 T = getCanonicalType(T); 3244 } 3245 3246 return NestedNameSpecifier::Create(*this, 0, false, 3247 const_cast<Type*>(T.getTypePtr())); 3248 } 3249 3250 case NestedNameSpecifier::Global: 3251 // The global specifier is canonical and unique. 3252 return NNS; 3253 } 3254 3255 // Required to silence a GCC warning 3256 return 0; 3257 } 3258 3259 3260 const ArrayType *ASTContext::getAsArrayType(QualType T) const { 3261 // Handle the non-qualified case efficiently. 3262 if (!T.hasLocalQualifiers()) { 3263 // Handle the common positive case fast. 3264 if (const ArrayType *AT = dyn_cast<ArrayType>(T)) 3265 return AT; 3266 } 3267 3268 // Handle the common negative case fast. 3269 if (!isa<ArrayType>(T.getCanonicalType())) 3270 return 0; 3271 3272 // Apply any qualifiers from the array type to the element type. This 3273 // implements C99 6.7.3p8: "If the specification of an array type includes 3274 // any type qualifiers, the element type is so qualified, not the array type." 3275 3276 // If we get here, we either have type qualifiers on the type, or we have 3277 // sugar such as a typedef in the way. If we have type qualifiers on the type 3278 // we must propagate them down into the element type. 3279 3280 SplitQualType split = T.getSplitDesugaredType(); 3281 Qualifiers qs = split.second; 3282 3283 // If we have a simple case, just return now. 3284 const ArrayType *ATy = dyn_cast<ArrayType>(split.first); 3285 if (ATy == 0 || qs.empty()) 3286 return ATy; 3287 3288 // Otherwise, we have an array and we have qualifiers on it. Push the 3289 // qualifiers into the array element type and return a new array type. 3290 QualType NewEltTy = getQualifiedType(ATy->getElementType(), qs); 3291 3292 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(ATy)) 3293 return cast<ArrayType>(getConstantArrayType(NewEltTy, CAT->getSize(), 3294 CAT->getSizeModifier(), 3295 CAT->getIndexTypeCVRQualifiers())); 3296 if (const IncompleteArrayType *IAT = dyn_cast<IncompleteArrayType>(ATy)) 3297 return cast<ArrayType>(getIncompleteArrayType(NewEltTy, 3298 IAT->getSizeModifier(), 3299 IAT->getIndexTypeCVRQualifiers())); 3300 3301 if (const DependentSizedArrayType *DSAT 3302 = dyn_cast<DependentSizedArrayType>(ATy)) 3303 return cast<ArrayType>( 3304 getDependentSizedArrayType(NewEltTy, 3305 DSAT->getSizeExpr(), 3306 DSAT->getSizeModifier(), 3307 DSAT->getIndexTypeCVRQualifiers(), 3308 DSAT->getBracketsRange())); 3309 3310 const VariableArrayType *VAT = cast<VariableArrayType>(ATy); 3311 return cast<ArrayType>(getVariableArrayType(NewEltTy, 3312 VAT->getSizeExpr(), 3313 VAT->getSizeModifier(), 3314 VAT->getIndexTypeCVRQualifiers(), 3315 VAT->getBracketsRange())); 3316 } 3317 3318 QualType ASTContext::getAdjustedParameterType(QualType T) { 3319 // C99 6.7.5.3p7: 3320 // A declaration of a parameter as "array of type" shall be 3321 // adjusted to "qualified pointer to type", where the type 3322 // qualifiers (if any) are those specified within the [ and ] of 3323 // the array type derivation. 3324 if (T->isArrayType()) 3325 return getArrayDecayedType(T); 3326 3327 // C99 6.7.5.3p8: 3328 // A declaration of a parameter as "function returning type" 3329 // shall be adjusted to "pointer to function returning type", as 3330 // in 6.3.2.1. 3331 if (T->isFunctionType()) 3332 return getPointerType(T); 3333 3334 return T; 3335 } 3336 3337 QualType ASTContext::getSignatureParameterType(QualType T) { 3338 T = getVariableArrayDecayedType(T); 3339 T = getAdjustedParameterType(T); 3340 return T.getUnqualifiedType(); 3341 } 3342 3343 /// getArrayDecayedType - Return the properly qualified result of decaying the 3344 /// specified array type to a pointer. This operation is non-trivial when 3345 /// handling typedefs etc. The canonical type of "T" must be an array type, 3346 /// this returns a pointer to a properly qualified element of the array. 3347 /// 3348 /// See C99 6.7.5.3p7 and C99 6.3.2.1p3. 3349 QualType ASTContext::getArrayDecayedType(QualType Ty) const { 3350 // Get the element type with 'getAsArrayType' so that we don't lose any 3351 // typedefs in the element type of the array. This also handles propagation 3352 // of type qualifiers from the array type into the element type if present 3353 // (C99 6.7.3p8). 3354 const ArrayType *PrettyArrayType = getAsArrayType(Ty); 3355 assert(PrettyArrayType && "Not an array type!"); 3356 3357 QualType PtrTy = getPointerType(PrettyArrayType->getElementType()); 3358 3359 // int x[restrict 4] -> int *restrict 3360 return getQualifiedType(PtrTy, PrettyArrayType->getIndexTypeQualifiers()); 3361 } 3362 3363 QualType ASTContext::getBaseElementType(const ArrayType *array) const { 3364 return getBaseElementType(array->getElementType()); 3365 } 3366 3367 QualType ASTContext::getBaseElementType(QualType type) const { 3368 Qualifiers qs; 3369 while (true) { 3370 SplitQualType split = type.getSplitDesugaredType(); 3371 const ArrayType *array = split.first->getAsArrayTypeUnsafe(); 3372 if (!array) break; 3373 3374 type = array->getElementType(); 3375 qs.addConsistentQualifiers(split.second); 3376 } 3377 3378 return getQualifiedType(type, qs); 3379 } 3380 3381 /// getConstantArrayElementCount - Returns number of constant array elements. 3382 uint64_t 3383 ASTContext::getConstantArrayElementCount(const ConstantArrayType *CA) const { 3384 uint64_t ElementCount = 1; 3385 do { 3386 ElementCount *= CA->getSize().getZExtValue(); 3387 CA = dyn_cast<ConstantArrayType>(CA->getElementType()); 3388 } while (CA); 3389 return ElementCount; 3390 } 3391 3392 /// getFloatingRank - Return a relative rank for floating point types. 3393 /// This routine will assert if passed a built-in type that isn't a float. 3394 static FloatingRank getFloatingRank(QualType T) { 3395 if (const ComplexType *CT = T->getAs<ComplexType>()) 3396 return getFloatingRank(CT->getElementType()); 3397 3398 assert(T->getAs<BuiltinType>() && "getFloatingRank(): not a floating type"); 3399 switch (T->getAs<BuiltinType>()->getKind()) { 3400 default: assert(0 && "getFloatingRank(): not a floating type"); 3401 case BuiltinType::Float: return FloatRank; 3402 case BuiltinType::Double: return DoubleRank; 3403 case BuiltinType::LongDouble: return LongDoubleRank; 3404 } 3405 } 3406 3407 /// getFloatingTypeOfSizeWithinDomain - Returns a real floating 3408 /// point or a complex type (based on typeDomain/typeSize). 3409 /// 'typeDomain' is a real floating point or complex type. 3410 /// 'typeSize' is a real floating point or complex type. 3411 QualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size, 3412 QualType Domain) const { 3413 FloatingRank EltRank = getFloatingRank(Size); 3414 if (Domain->isComplexType()) { 3415 switch (EltRank) { 3416 default: assert(0 && "getFloatingRank(): illegal value for rank"); 3417 case FloatRank: return FloatComplexTy; 3418 case DoubleRank: return DoubleComplexTy; 3419 case LongDoubleRank: return LongDoubleComplexTy; 3420 } 3421 } 3422 3423 assert(Domain->isRealFloatingType() && "Unknown domain!"); 3424 switch (EltRank) { 3425 default: assert(0 && "getFloatingRank(): illegal value for rank"); 3426 case FloatRank: return FloatTy; 3427 case DoubleRank: return DoubleTy; 3428 case LongDoubleRank: return LongDoubleTy; 3429 } 3430 } 3431 3432 /// getFloatingTypeOrder - Compare the rank of the two specified floating 3433 /// point types, ignoring the domain of the type (i.e. 'double' == 3434 /// '_Complex double'). If LHS > RHS, return 1. If LHS == RHS, return 0. If 3435 /// LHS < RHS, return -1. 3436 int ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const { 3437 FloatingRank LHSR = getFloatingRank(LHS); 3438 FloatingRank RHSR = getFloatingRank(RHS); 3439 3440 if (LHSR == RHSR) 3441 return 0; 3442 if (LHSR > RHSR) 3443 return 1; 3444 return -1; 3445 } 3446 3447 /// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This 3448 /// routine will assert if passed a built-in type that isn't an integer or enum, 3449 /// or if it is not canonicalized. 3450 unsigned ASTContext::getIntegerRank(const Type *T) const { 3451 assert(T->isCanonicalUnqualified() && "T should be canonicalized"); 3452 if (const EnumType* ET = dyn_cast<EnumType>(T)) 3453 T = ET->getDecl()->getPromotionType().getTypePtr(); 3454 3455 if (T->isSpecificBuiltinType(BuiltinType::WChar_S) || 3456 T->isSpecificBuiltinType(BuiltinType::WChar_U)) 3457 T = getFromTargetType(Target.getWCharType()).getTypePtr(); 3458 3459 if (T->isSpecificBuiltinType(BuiltinType::Char16)) 3460 T = getFromTargetType(Target.getChar16Type()).getTypePtr(); 3461 3462 if (T->isSpecificBuiltinType(BuiltinType::Char32)) 3463 T = getFromTargetType(Target.getChar32Type()).getTypePtr(); 3464 3465 switch (cast<BuiltinType>(T)->getKind()) { 3466 default: assert(0 && "getIntegerRank(): not a built-in integer"); 3467 case BuiltinType::Bool: 3468 return 1 + (getIntWidth(BoolTy) << 3); 3469 case BuiltinType::Char_S: 3470 case BuiltinType::Char_U: 3471 case BuiltinType::SChar: 3472 case BuiltinType::UChar: 3473 return 2 + (getIntWidth(CharTy) << 3); 3474 case BuiltinType::Short: 3475 case BuiltinType::UShort: 3476 return 3 + (getIntWidth(ShortTy) << 3); 3477 case BuiltinType::Int: 3478 case BuiltinType::UInt: 3479 return 4 + (getIntWidth(IntTy) << 3); 3480 case BuiltinType::Long: 3481 case BuiltinType::ULong: 3482 return 5 + (getIntWidth(LongTy) << 3); 3483 case BuiltinType::LongLong: 3484 case BuiltinType::ULongLong: 3485 return 6 + (getIntWidth(LongLongTy) << 3); 3486 case BuiltinType::Int128: 3487 case BuiltinType::UInt128: 3488 return 7 + (getIntWidth(Int128Ty) << 3); 3489 } 3490 } 3491 3492 /// \brief Whether this is a promotable bitfield reference according 3493 /// to C99 6.3.1.1p2, bullet 2 (and GCC extensions). 3494 /// 3495 /// \returns the type this bit-field will promote to, or NULL if no 3496 /// promotion occurs. 3497 QualType ASTContext::isPromotableBitField(Expr *E) const { 3498 if (E->isTypeDependent() || E->isValueDependent()) 3499 return QualType(); 3500 3501 FieldDecl *Field = E->getBitField(); 3502 if (!Field) 3503 return QualType(); 3504 3505 QualType FT = Field->getType(); 3506 3507 llvm::APSInt BitWidthAP = Field->getBitWidth()->EvaluateAsInt(*this); 3508 uint64_t BitWidth = BitWidthAP.getZExtValue(); 3509 uint64_t IntSize = getTypeSize(IntTy); 3510 // GCC extension compatibility: if the bit-field size is less than or equal 3511 // to the size of int, it gets promoted no matter what its type is. 3512 // For instance, unsigned long bf : 4 gets promoted to signed int. 3513 if (BitWidth < IntSize) 3514 return IntTy; 3515 3516 if (BitWidth == IntSize) 3517 return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy; 3518 3519 // Types bigger than int are not subject to promotions, and therefore act 3520 // like the base type. 3521 // FIXME: This doesn't quite match what gcc does, but what gcc does here 3522 // is ridiculous. 3523 return QualType(); 3524 } 3525 3526 /// getPromotedIntegerType - Returns the type that Promotable will 3527 /// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable 3528 /// integer type. 3529 QualType ASTContext::getPromotedIntegerType(QualType Promotable) const { 3530 assert(!Promotable.isNull()); 3531 assert(Promotable->isPromotableIntegerType()); 3532 if (const EnumType *ET = Promotable->getAs<EnumType>()) 3533 return ET->getDecl()->getPromotionType(); 3534 if (Promotable->isSignedIntegerType()) 3535 return IntTy; 3536 uint64_t PromotableSize = getTypeSize(Promotable); 3537 uint64_t IntSize = getTypeSize(IntTy); 3538 assert(Promotable->isUnsignedIntegerType() && PromotableSize <= IntSize); 3539 return (PromotableSize != IntSize) ? IntTy : UnsignedIntTy; 3540 } 3541 3542 /// \brief Recurses in pointer/array types until it finds an objc retainable 3543 /// type and returns its ownership. 3544 Qualifiers::ObjCLifetime ASTContext::getInnerObjCOwnership(QualType T) const { 3545 while (!T.isNull()) { 3546 if (T.getObjCLifetime() != Qualifiers::OCL_None) 3547 return T.getObjCLifetime(); 3548 if (T->isArrayType()) 3549 T = getBaseElementType(T); 3550 else if (const PointerType *PT = T->getAs<PointerType>()) 3551 T = PT->getPointeeType(); 3552 else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 3553 T = RT->getPointeeType(); 3554 else 3555 break; 3556 } 3557 3558 return Qualifiers::OCL_None; 3559 } 3560 3561 /// getIntegerTypeOrder - Returns the highest ranked integer type: 3562 /// C99 6.3.1.8p1. If LHS > RHS, return 1. If LHS == RHS, return 0. If 3563 /// LHS < RHS, return -1. 3564 int ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const { 3565 const Type *LHSC = getCanonicalType(LHS).getTypePtr(); 3566 const Type *RHSC = getCanonicalType(RHS).getTypePtr(); 3567 if (LHSC == RHSC) return 0; 3568 3569 bool LHSUnsigned = LHSC->isUnsignedIntegerType(); 3570 bool RHSUnsigned = RHSC->isUnsignedIntegerType(); 3571 3572 unsigned LHSRank = getIntegerRank(LHSC); 3573 unsigned RHSRank = getIntegerRank(RHSC); 3574 3575 if (LHSUnsigned == RHSUnsigned) { // Both signed or both unsigned. 3576 if (LHSRank == RHSRank) return 0; 3577 return LHSRank > RHSRank ? 1 : -1; 3578 } 3579 3580 // Otherwise, the LHS is signed and the RHS is unsigned or visa versa. 3581 if (LHSUnsigned) { 3582 // If the unsigned [LHS] type is larger, return it. 3583 if (LHSRank >= RHSRank) 3584 return 1; 3585 3586 // If the signed type can represent all values of the unsigned type, it 3587 // wins. Because we are dealing with 2's complement and types that are 3588 // powers of two larger than each other, this is always safe. 3589 return -1; 3590 } 3591 3592 // If the unsigned [RHS] type is larger, return it. 3593 if (RHSRank >= LHSRank) 3594 return -1; 3595 3596 // If the signed type can represent all values of the unsigned type, it 3597 // wins. Because we are dealing with 2's complement and types that are 3598 // powers of two larger than each other, this is always safe. 3599 return 1; 3600 } 3601 3602 static RecordDecl * 3603 CreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK, 3604 DeclContext *DC, IdentifierInfo *Id) { 3605 SourceLocation Loc; 3606 if (Ctx.getLangOptions().CPlusPlus) 3607 return CXXRecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 3608 else 3609 return RecordDecl::Create(Ctx, TK, DC, Loc, Loc, Id); 3610 } 3611 3612 // getCFConstantStringType - Return the type used for constant CFStrings. 3613 QualType ASTContext::getCFConstantStringType() const { 3614 if (!CFConstantStringTypeDecl) { 3615 CFConstantStringTypeDecl = 3616 CreateRecordDecl(*this, TTK_Struct, TUDecl, 3617 &Idents.get("NSConstantString")); 3618 CFConstantStringTypeDecl->startDefinition(); 3619 3620 QualType FieldTypes[4]; 3621 3622 // const int *isa; 3623 FieldTypes[0] = getPointerType(IntTy.withConst()); 3624 // int flags; 3625 FieldTypes[1] = IntTy; 3626 // const char *str; 3627 FieldTypes[2] = getPointerType(CharTy.withConst()); 3628 // long length; 3629 FieldTypes[3] = LongTy; 3630 3631 // Create fields 3632 for (unsigned i = 0; i < 4; ++i) { 3633 FieldDecl *Field = FieldDecl::Create(*this, CFConstantStringTypeDecl, 3634 SourceLocation(), 3635 SourceLocation(), 0, 3636 FieldTypes[i], /*TInfo=*/0, 3637 /*BitWidth=*/0, 3638 /*Mutable=*/false, 3639 /*HasInit=*/false); 3640 Field->setAccess(AS_public); 3641 CFConstantStringTypeDecl->addDecl(Field); 3642 } 3643 3644 CFConstantStringTypeDecl->completeDefinition(); 3645 } 3646 3647 return getTagDeclType(CFConstantStringTypeDecl); 3648 } 3649 3650 void ASTContext::setCFConstantStringType(QualType T) { 3651 const RecordType *Rec = T->getAs<RecordType>(); 3652 assert(Rec && "Invalid CFConstantStringType"); 3653 CFConstantStringTypeDecl = Rec->getDecl(); 3654 } 3655 3656 // getNSConstantStringType - Return the type used for constant NSStrings. 3657 QualType ASTContext::getNSConstantStringType() const { 3658 if (!NSConstantStringTypeDecl) { 3659 NSConstantStringTypeDecl = 3660 CreateRecordDecl(*this, TTK_Struct, TUDecl, 3661 &Idents.get("__builtin_NSString")); 3662 NSConstantStringTypeDecl->startDefinition(); 3663 3664 QualType FieldTypes[3]; 3665 3666 // const int *isa; 3667 FieldTypes[0] = getPointerType(IntTy.withConst()); 3668 // const char *str; 3669 FieldTypes[1] = getPointerType(CharTy.withConst()); 3670 // unsigned int length; 3671 FieldTypes[2] = UnsignedIntTy; 3672 3673 // Create fields 3674 for (unsigned i = 0; i < 3; ++i) { 3675 FieldDecl *Field = FieldDecl::Create(*this, NSConstantStringTypeDecl, 3676 SourceLocation(), 3677 SourceLocation(), 0, 3678 FieldTypes[i], /*TInfo=*/0, 3679 /*BitWidth=*/0, 3680 /*Mutable=*/false, 3681 /*HasInit=*/false); 3682 Field->setAccess(AS_public); 3683 NSConstantStringTypeDecl->addDecl(Field); 3684 } 3685 3686 NSConstantStringTypeDecl->completeDefinition(); 3687 } 3688 3689 return getTagDeclType(NSConstantStringTypeDecl); 3690 } 3691 3692 void ASTContext::setNSConstantStringType(QualType T) { 3693 const RecordType *Rec = T->getAs<RecordType>(); 3694 assert(Rec && "Invalid NSConstantStringType"); 3695 NSConstantStringTypeDecl = Rec->getDecl(); 3696 } 3697 3698 QualType ASTContext::getObjCFastEnumerationStateType() const { 3699 if (!ObjCFastEnumerationStateTypeDecl) { 3700 ObjCFastEnumerationStateTypeDecl = 3701 CreateRecordDecl(*this, TTK_Struct, TUDecl, 3702 &Idents.get("__objcFastEnumerationState")); 3703 ObjCFastEnumerationStateTypeDecl->startDefinition(); 3704 3705 QualType FieldTypes[] = { 3706 UnsignedLongTy, 3707 getPointerType(ObjCIdTypedefType), 3708 getPointerType(UnsignedLongTy), 3709 getConstantArrayType(UnsignedLongTy, 3710 llvm::APInt(32, 5), ArrayType::Normal, 0) 3711 }; 3712 3713 for (size_t i = 0; i < 4; ++i) { 3714 FieldDecl *Field = FieldDecl::Create(*this, 3715 ObjCFastEnumerationStateTypeDecl, 3716 SourceLocation(), 3717 SourceLocation(), 0, 3718 FieldTypes[i], /*TInfo=*/0, 3719 /*BitWidth=*/0, 3720 /*Mutable=*/false, 3721 /*HasInit=*/false); 3722 Field->setAccess(AS_public); 3723 ObjCFastEnumerationStateTypeDecl->addDecl(Field); 3724 } 3725 3726 ObjCFastEnumerationStateTypeDecl->completeDefinition(); 3727 } 3728 3729 return getTagDeclType(ObjCFastEnumerationStateTypeDecl); 3730 } 3731 3732 QualType ASTContext::getBlockDescriptorType() const { 3733 if (BlockDescriptorType) 3734 return getTagDeclType(BlockDescriptorType); 3735 3736 RecordDecl *T; 3737 // FIXME: Needs the FlagAppleBlock bit. 3738 T = CreateRecordDecl(*this, TTK_Struct, TUDecl, 3739 &Idents.get("__block_descriptor")); 3740 T->startDefinition(); 3741 3742 QualType FieldTypes[] = { 3743 UnsignedLongTy, 3744 UnsignedLongTy, 3745 }; 3746 3747 const char *FieldNames[] = { 3748 "reserved", 3749 "Size" 3750 }; 3751 3752 for (size_t i = 0; i < 2; ++i) { 3753 FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 3754 SourceLocation(), 3755 &Idents.get(FieldNames[i]), 3756 FieldTypes[i], /*TInfo=*/0, 3757 /*BitWidth=*/0, 3758 /*Mutable=*/false, 3759 /*HasInit=*/false); 3760 Field->setAccess(AS_public); 3761 T->addDecl(Field); 3762 } 3763 3764 T->completeDefinition(); 3765 3766 BlockDescriptorType = T; 3767 3768 return getTagDeclType(BlockDescriptorType); 3769 } 3770 3771 void ASTContext::setBlockDescriptorType(QualType T) { 3772 const RecordType *Rec = T->getAs<RecordType>(); 3773 assert(Rec && "Invalid BlockDescriptorType"); 3774 BlockDescriptorType = Rec->getDecl(); 3775 } 3776 3777 QualType ASTContext::getBlockDescriptorExtendedType() const { 3778 if (BlockDescriptorExtendedType) 3779 return getTagDeclType(BlockDescriptorExtendedType); 3780 3781 RecordDecl *T; 3782 // FIXME: Needs the FlagAppleBlock bit. 3783 T = CreateRecordDecl(*this, TTK_Struct, TUDecl, 3784 &Idents.get("__block_descriptor_withcopydispose")); 3785 T->startDefinition(); 3786 3787 QualType FieldTypes[] = { 3788 UnsignedLongTy, 3789 UnsignedLongTy, 3790 getPointerType(VoidPtrTy), 3791 getPointerType(VoidPtrTy) 3792 }; 3793 3794 const char *FieldNames[] = { 3795 "reserved", 3796 "Size", 3797 "CopyFuncPtr", 3798 "DestroyFuncPtr" 3799 }; 3800 3801 for (size_t i = 0; i < 4; ++i) { 3802 FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 3803 SourceLocation(), 3804 &Idents.get(FieldNames[i]), 3805 FieldTypes[i], /*TInfo=*/0, 3806 /*BitWidth=*/0, 3807 /*Mutable=*/false, 3808 /*HasInit=*/false); 3809 Field->setAccess(AS_public); 3810 T->addDecl(Field); 3811 } 3812 3813 T->completeDefinition(); 3814 3815 BlockDescriptorExtendedType = T; 3816 3817 return getTagDeclType(BlockDescriptorExtendedType); 3818 } 3819 3820 void ASTContext::setBlockDescriptorExtendedType(QualType T) { 3821 const RecordType *Rec = T->getAs<RecordType>(); 3822 assert(Rec && "Invalid BlockDescriptorType"); 3823 BlockDescriptorExtendedType = Rec->getDecl(); 3824 } 3825 3826 bool ASTContext::BlockRequiresCopying(QualType Ty) const { 3827 if (Ty->isObjCRetainableType()) 3828 return true; 3829 if (getLangOptions().CPlusPlus) { 3830 if (const RecordType *RT = Ty->getAs<RecordType>()) { 3831 CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 3832 return RD->hasConstCopyConstructor(); 3833 3834 } 3835 } 3836 return false; 3837 } 3838 3839 QualType 3840 ASTContext::BuildByRefType(llvm::StringRef DeclName, QualType Ty) const { 3841 // type = struct __Block_byref_1_X { 3842 // void *__isa; 3843 // struct __Block_byref_1_X *__forwarding; 3844 // unsigned int __flags; 3845 // unsigned int __size; 3846 // void *__copy_helper; // as needed 3847 // void *__destroy_help // as needed 3848 // int X; 3849 // } * 3850 3851 bool HasCopyAndDispose = BlockRequiresCopying(Ty); 3852 3853 // FIXME: Move up 3854 llvm::SmallString<36> Name; 3855 llvm::raw_svector_ostream(Name) << "__Block_byref_" << 3856 ++UniqueBlockByRefTypeID << '_' << DeclName; 3857 RecordDecl *T; 3858 T = CreateRecordDecl(*this, TTK_Struct, TUDecl, &Idents.get(Name.str())); 3859 T->startDefinition(); 3860 QualType Int32Ty = IntTy; 3861 assert(getIntWidth(IntTy) == 32 && "non-32bit int not supported"); 3862 QualType FieldTypes[] = { 3863 getPointerType(VoidPtrTy), 3864 getPointerType(getTagDeclType(T)), 3865 Int32Ty, 3866 Int32Ty, 3867 getPointerType(VoidPtrTy), 3868 getPointerType(VoidPtrTy), 3869 Ty 3870 }; 3871 3872 llvm::StringRef FieldNames[] = { 3873 "__isa", 3874 "__forwarding", 3875 "__flags", 3876 "__size", 3877 "__copy_helper", 3878 "__destroy_helper", 3879 DeclName, 3880 }; 3881 3882 for (size_t i = 0; i < 7; ++i) { 3883 if (!HasCopyAndDispose && i >=4 && i <= 5) 3884 continue; 3885 FieldDecl *Field = FieldDecl::Create(*this, T, SourceLocation(), 3886 SourceLocation(), 3887 &Idents.get(FieldNames[i]), 3888 FieldTypes[i], /*TInfo=*/0, 3889 /*BitWidth=*/0, /*Mutable=*/false, 3890 /*HasInit=*/false); 3891 Field->setAccess(AS_public); 3892 T->addDecl(Field); 3893 } 3894 3895 T->completeDefinition(); 3896 3897 return getPointerType(getTagDeclType(T)); 3898 } 3899 3900 void ASTContext::setObjCFastEnumerationStateType(QualType T) { 3901 const RecordType *Rec = T->getAs<RecordType>(); 3902 assert(Rec && "Invalid ObjCFAstEnumerationStateType"); 3903 ObjCFastEnumerationStateTypeDecl = Rec->getDecl(); 3904 } 3905 3906 // This returns true if a type has been typedefed to BOOL: 3907 // typedef <type> BOOL; 3908 static bool isTypeTypedefedAsBOOL(QualType T) { 3909 if (const TypedefType *TT = dyn_cast<TypedefType>(T)) 3910 if (IdentifierInfo *II = TT->getDecl()->getIdentifier()) 3911 return II->isStr("BOOL"); 3912 3913 return false; 3914 } 3915 3916 /// getObjCEncodingTypeSize returns size of type for objective-c encoding 3917 /// purpose. 3918 CharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const { 3919 if (!type->isIncompleteArrayType() && type->isIncompleteType()) 3920 return CharUnits::Zero(); 3921 3922 CharUnits sz = getTypeSizeInChars(type); 3923 3924 // Make all integer and enum types at least as large as an int 3925 if (sz.isPositive() && type->isIntegralOrEnumerationType()) 3926 sz = std::max(sz, getTypeSizeInChars(IntTy)); 3927 // Treat arrays as pointers, since that's how they're passed in. 3928 else if (type->isArrayType()) 3929 sz = getTypeSizeInChars(VoidPtrTy); 3930 return sz; 3931 } 3932 3933 static inline 3934 std::string charUnitsToString(const CharUnits &CU) { 3935 return llvm::itostr(CU.getQuantity()); 3936 } 3937 3938 /// getObjCEncodingForBlock - Return the encoded type for this block 3939 /// declaration. 3940 std::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const { 3941 std::string S; 3942 3943 const BlockDecl *Decl = Expr->getBlockDecl(); 3944 QualType BlockTy = 3945 Expr->getType()->getAs<BlockPointerType>()->getPointeeType(); 3946 // Encode result type. 3947 getObjCEncodingForType(BlockTy->getAs<FunctionType>()->getResultType(), S); 3948 // Compute size of all parameters. 3949 // Start with computing size of a pointer in number of bytes. 3950 // FIXME: There might(should) be a better way of doing this computation! 3951 SourceLocation Loc; 3952 CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy); 3953 CharUnits ParmOffset = PtrSize; 3954 for (BlockDecl::param_const_iterator PI = Decl->param_begin(), 3955 E = Decl->param_end(); PI != E; ++PI) { 3956 QualType PType = (*PI)->getType(); 3957 CharUnits sz = getObjCEncodingTypeSize(PType); 3958 assert (sz.isPositive() && "BlockExpr - Incomplete param type"); 3959 ParmOffset += sz; 3960 } 3961 // Size of the argument frame 3962 S += charUnitsToString(ParmOffset); 3963 // Block pointer and offset. 3964 S += "@?0"; 3965 ParmOffset = PtrSize; 3966 3967 // Argument types. 3968 ParmOffset = PtrSize; 3969 for (BlockDecl::param_const_iterator PI = Decl->param_begin(), E = 3970 Decl->param_end(); PI != E; ++PI) { 3971 ParmVarDecl *PVDecl = *PI; 3972 QualType PType = PVDecl->getOriginalType(); 3973 if (const ArrayType *AT = 3974 dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 3975 // Use array's original type only if it has known number of 3976 // elements. 3977 if (!isa<ConstantArrayType>(AT)) 3978 PType = PVDecl->getType(); 3979 } else if (PType->isFunctionType()) 3980 PType = PVDecl->getType(); 3981 getObjCEncodingForType(PType, S); 3982 S += charUnitsToString(ParmOffset); 3983 ParmOffset += getObjCEncodingTypeSize(PType); 3984 } 3985 3986 return S; 3987 } 3988 3989 bool ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl, 3990 std::string& S) { 3991 // Encode result type. 3992 getObjCEncodingForType(Decl->getResultType(), S); 3993 CharUnits ParmOffset; 3994 // Compute size of all parameters. 3995 for (FunctionDecl::param_const_iterator PI = Decl->param_begin(), 3996 E = Decl->param_end(); PI != E; ++PI) { 3997 QualType PType = (*PI)->getType(); 3998 CharUnits sz = getObjCEncodingTypeSize(PType); 3999 if (sz.isZero()) 4000 return true; 4001 4002 assert (sz.isPositive() && 4003 "getObjCEncodingForFunctionDecl - Incomplete param type"); 4004 ParmOffset += sz; 4005 } 4006 S += charUnitsToString(ParmOffset); 4007 ParmOffset = CharUnits::Zero(); 4008 4009 // Argument types. 4010 for (FunctionDecl::param_const_iterator PI = Decl->param_begin(), 4011 E = Decl->param_end(); PI != E; ++PI) { 4012 ParmVarDecl *PVDecl = *PI; 4013 QualType PType = PVDecl->getOriginalType(); 4014 if (const ArrayType *AT = 4015 dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 4016 // Use array's original type only if it has known number of 4017 // elements. 4018 if (!isa<ConstantArrayType>(AT)) 4019 PType = PVDecl->getType(); 4020 } else if (PType->isFunctionType()) 4021 PType = PVDecl->getType(); 4022 getObjCEncodingForType(PType, S); 4023 S += charUnitsToString(ParmOffset); 4024 ParmOffset += getObjCEncodingTypeSize(PType); 4025 } 4026 4027 return false; 4028 } 4029 4030 /// getObjCEncodingForMethodDecl - Return the encoded type for this method 4031 /// declaration. 4032 bool ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, 4033 std::string& S) const { 4034 // FIXME: This is not very efficient. 4035 // Encode type qualifer, 'in', 'inout', etc. for the return type. 4036 getObjCEncodingForTypeQualifier(Decl->getObjCDeclQualifier(), S); 4037 // Encode result type. 4038 getObjCEncodingForType(Decl->getResultType(), S); 4039 // Compute size of all parameters. 4040 // Start with computing size of a pointer in number of bytes. 4041 // FIXME: There might(should) be a better way of doing this computation! 4042 SourceLocation Loc; 4043 CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy); 4044 // The first two arguments (self and _cmd) are pointers; account for 4045 // their size. 4046 CharUnits ParmOffset = 2 * PtrSize; 4047 for (ObjCMethodDecl::param_iterator PI = Decl->param_begin(), 4048 E = Decl->sel_param_end(); PI != E; ++PI) { 4049 QualType PType = (*PI)->getType(); 4050 CharUnits sz = getObjCEncodingTypeSize(PType); 4051 if (sz.isZero()) 4052 return true; 4053 4054 assert (sz.isPositive() && 4055 "getObjCEncodingForMethodDecl - Incomplete param type"); 4056 ParmOffset += sz; 4057 } 4058 S += charUnitsToString(ParmOffset); 4059 S += "@0:"; 4060 S += charUnitsToString(PtrSize); 4061 4062 // Argument types. 4063 ParmOffset = 2 * PtrSize; 4064 for (ObjCMethodDecl::param_iterator PI = Decl->param_begin(), 4065 E = Decl->sel_param_end(); PI != E; ++PI) { 4066 ParmVarDecl *PVDecl = *PI; 4067 QualType PType = PVDecl->getOriginalType(); 4068 if (const ArrayType *AT = 4069 dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) { 4070 // Use array's original type only if it has known number of 4071 // elements. 4072 if (!isa<ConstantArrayType>(AT)) 4073 PType = PVDecl->getType(); 4074 } else if (PType->isFunctionType()) 4075 PType = PVDecl->getType(); 4076 // Process argument qualifiers for user supplied arguments; such as, 4077 // 'in', 'inout', etc. 4078 getObjCEncodingForTypeQualifier(PVDecl->getObjCDeclQualifier(), S); 4079 getObjCEncodingForType(PType, S); 4080 S += charUnitsToString(ParmOffset); 4081 ParmOffset += getObjCEncodingTypeSize(PType); 4082 } 4083 4084 return false; 4085 } 4086 4087 /// getObjCEncodingForPropertyDecl - Return the encoded type for this 4088 /// property declaration. If non-NULL, Container must be either an 4089 /// ObjCCategoryImplDecl or ObjCImplementationDecl; it should only be 4090 /// NULL when getting encodings for protocol properties. 4091 /// Property attributes are stored as a comma-delimited C string. The simple 4092 /// attributes readonly and bycopy are encoded as single characters. The 4093 /// parametrized attributes, getter=name, setter=name, and ivar=name, are 4094 /// encoded as single characters, followed by an identifier. Property types 4095 /// are also encoded as a parametrized attribute. The characters used to encode 4096 /// these attributes are defined by the following enumeration: 4097 /// @code 4098 /// enum PropertyAttributes { 4099 /// kPropertyReadOnly = 'R', // property is read-only. 4100 /// kPropertyBycopy = 'C', // property is a copy of the value last assigned 4101 /// kPropertyByref = '&', // property is a reference to the value last assigned 4102 /// kPropertyDynamic = 'D', // property is dynamic 4103 /// kPropertyGetter = 'G', // followed by getter selector name 4104 /// kPropertySetter = 'S', // followed by setter selector name 4105 /// kPropertyInstanceVariable = 'V' // followed by instance variable name 4106 /// kPropertyType = 't' // followed by old-style type encoding. 4107 /// kPropertyWeak = 'W' // 'weak' property 4108 /// kPropertyStrong = 'P' // property GC'able 4109 /// kPropertyNonAtomic = 'N' // property non-atomic 4110 /// }; 4111 /// @endcode 4112 void ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, 4113 const Decl *Container, 4114 std::string& S) const { 4115 // Collect information from the property implementation decl(s). 4116 bool Dynamic = false; 4117 ObjCPropertyImplDecl *SynthesizePID = 0; 4118 4119 // FIXME: Duplicated code due to poor abstraction. 4120 if (Container) { 4121 if (const ObjCCategoryImplDecl *CID = 4122 dyn_cast<ObjCCategoryImplDecl>(Container)) { 4123 for (ObjCCategoryImplDecl::propimpl_iterator 4124 i = CID->propimpl_begin(), e = CID->propimpl_end(); 4125 i != e; ++i) { 4126 ObjCPropertyImplDecl *PID = *i; 4127 if (PID->getPropertyDecl() == PD) { 4128 if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) { 4129 Dynamic = true; 4130 } else { 4131 SynthesizePID = PID; 4132 } 4133 } 4134 } 4135 } else { 4136 const ObjCImplementationDecl *OID=cast<ObjCImplementationDecl>(Container); 4137 for (ObjCCategoryImplDecl::propimpl_iterator 4138 i = OID->propimpl_begin(), e = OID->propimpl_end(); 4139 i != e; ++i) { 4140 ObjCPropertyImplDecl *PID = *i; 4141 if (PID->getPropertyDecl() == PD) { 4142 if (PID->getPropertyImplementation()==ObjCPropertyImplDecl::Dynamic) { 4143 Dynamic = true; 4144 } else { 4145 SynthesizePID = PID; 4146 } 4147 } 4148 } 4149 } 4150 } 4151 4152 // FIXME: This is not very efficient. 4153 S = "T"; 4154 4155 // Encode result type. 4156 // GCC has some special rules regarding encoding of properties which 4157 // closely resembles encoding of ivars. 4158 getObjCEncodingForTypeImpl(PD->getType(), S, true, true, 0, 4159 true /* outermost type */, 4160 true /* encoding for property */); 4161 4162 if (PD->isReadOnly()) { 4163 S += ",R"; 4164 } else { 4165 switch (PD->getSetterKind()) { 4166 case ObjCPropertyDecl::Assign: break; 4167 case ObjCPropertyDecl::Copy: S += ",C"; break; 4168 case ObjCPropertyDecl::Retain: S += ",&"; break; 4169 } 4170 } 4171 4172 // It really isn't clear at all what this means, since properties 4173 // are "dynamic by default". 4174 if (Dynamic) 4175 S += ",D"; 4176 4177 if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nonatomic) 4178 S += ",N"; 4179 4180 if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) { 4181 S += ",G"; 4182 S += PD->getGetterName().getAsString(); 4183 } 4184 4185 if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) { 4186 S += ",S"; 4187 S += PD->getSetterName().getAsString(); 4188 } 4189 4190 if (SynthesizePID) { 4191 const ObjCIvarDecl *OID = SynthesizePID->getPropertyIvarDecl(); 4192 S += ",V"; 4193 S += OID->getNameAsString(); 4194 } 4195 4196 // FIXME: OBJCGC: weak & strong 4197 } 4198 4199 /// getLegacyIntegralTypeEncoding - 4200 /// Another legacy compatibility encoding: 32-bit longs are encoded as 4201 /// 'l' or 'L' , but not always. For typedefs, we need to use 4202 /// 'i' or 'I' instead if encoding a struct field, or a pointer! 4203 /// 4204 void ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const { 4205 if (isa<TypedefType>(PointeeTy.getTypePtr())) { 4206 if (const BuiltinType *BT = PointeeTy->getAs<BuiltinType>()) { 4207 if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32) 4208 PointeeTy = UnsignedIntTy; 4209 else 4210 if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32) 4211 PointeeTy = IntTy; 4212 } 4213 } 4214 } 4215 4216 void ASTContext::getObjCEncodingForType(QualType T, std::string& S, 4217 const FieldDecl *Field) const { 4218 // We follow the behavior of gcc, expanding structures which are 4219 // directly pointed to, and expanding embedded structures. Note that 4220 // these rules are sufficient to prevent recursive encoding of the 4221 // same type. 4222 getObjCEncodingForTypeImpl(T, S, true, true, Field, 4223 true /* outermost type */); 4224 } 4225 4226 static char ObjCEncodingForPrimitiveKind(const ASTContext *C, QualType T) { 4227 switch (T->getAs<BuiltinType>()->getKind()) { 4228 default: assert(0 && "Unhandled builtin type kind"); 4229 case BuiltinType::Void: return 'v'; 4230 case BuiltinType::Bool: return 'B'; 4231 case BuiltinType::Char_U: 4232 case BuiltinType::UChar: return 'C'; 4233 case BuiltinType::UShort: return 'S'; 4234 case BuiltinType::UInt: return 'I'; 4235 case BuiltinType::ULong: 4236 return C->getIntWidth(T) == 32 ? 'L' : 'Q'; 4237 case BuiltinType::UInt128: return 'T'; 4238 case BuiltinType::ULongLong: return 'Q'; 4239 case BuiltinType::Char_S: 4240 case BuiltinType::SChar: return 'c'; 4241 case BuiltinType::Short: return 's'; 4242 case BuiltinType::WChar_S: 4243 case BuiltinType::WChar_U: 4244 case BuiltinType::Int: return 'i'; 4245 case BuiltinType::Long: 4246 return C->getIntWidth(T) == 32 ? 'l' : 'q'; 4247 case BuiltinType::LongLong: return 'q'; 4248 case BuiltinType::Int128: return 't'; 4249 case BuiltinType::Float: return 'f'; 4250 case BuiltinType::Double: return 'd'; 4251 case BuiltinType::LongDouble: return 'D'; 4252 } 4253 } 4254 4255 static void EncodeBitField(const ASTContext *Ctx, std::string& S, 4256 QualType T, const FieldDecl *FD) { 4257 const Expr *E = FD->getBitWidth(); 4258 assert(E && "bitfield width not there - getObjCEncodingForTypeImpl"); 4259 S += 'b'; 4260 // The NeXT runtime encodes bit fields as b followed by the number of bits. 4261 // The GNU runtime requires more information; bitfields are encoded as b, 4262 // then the offset (in bits) of the first element, then the type of the 4263 // bitfield, then the size in bits. For example, in this structure: 4264 // 4265 // struct 4266 // { 4267 // int integer; 4268 // int flags:2; 4269 // }; 4270 // On a 32-bit system, the encoding for flags would be b2 for the NeXT 4271 // runtime, but b32i2 for the GNU runtime. The reason for this extra 4272 // information is not especially sensible, but we're stuck with it for 4273 // compatibility with GCC, although providing it breaks anything that 4274 // actually uses runtime introspection and wants to work on both runtimes... 4275 if (!Ctx->getLangOptions().NeXTRuntime) { 4276 const RecordDecl *RD = FD->getParent(); 4277 const ASTRecordLayout &RL = Ctx->getASTRecordLayout(RD); 4278 S += llvm::utostr(RL.getFieldOffset(FD->getFieldIndex())); 4279 if (T->isEnumeralType()) 4280 S += 'i'; 4281 else 4282 S += ObjCEncodingForPrimitiveKind(Ctx, T); 4283 } 4284 unsigned N = E->EvaluateAsInt(*Ctx).getZExtValue(); 4285 S += llvm::utostr(N); 4286 } 4287 4288 // FIXME: Use SmallString for accumulating string. 4289 void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, 4290 bool ExpandPointedToStructures, 4291 bool ExpandStructures, 4292 const FieldDecl *FD, 4293 bool OutermostType, 4294 bool EncodingProperty, 4295 bool StructField) const { 4296 if (T->getAs<BuiltinType>()) { 4297 if (FD && FD->isBitField()) 4298 return EncodeBitField(this, S, T, FD); 4299 S += ObjCEncodingForPrimitiveKind(this, T); 4300 return; 4301 } 4302 4303 if (const ComplexType *CT = T->getAs<ComplexType>()) { 4304 S += 'j'; 4305 getObjCEncodingForTypeImpl(CT->getElementType(), S, false, false, 0, false, 4306 false); 4307 return; 4308 } 4309 4310 // encoding for pointer or r3eference types. 4311 QualType PointeeTy; 4312 if (const PointerType *PT = T->getAs<PointerType>()) { 4313 if (PT->isObjCSelType()) { 4314 S += ':'; 4315 return; 4316 } 4317 PointeeTy = PT->getPointeeType(); 4318 } 4319 else if (const ReferenceType *RT = T->getAs<ReferenceType>()) 4320 PointeeTy = RT->getPointeeType(); 4321 if (!PointeeTy.isNull()) { 4322 bool isReadOnly = false; 4323 // For historical/compatibility reasons, the read-only qualifier of the 4324 // pointee gets emitted _before_ the '^'. The read-only qualifier of 4325 // the pointer itself gets ignored, _unless_ we are looking at a typedef! 4326 // Also, do not emit the 'r' for anything but the outermost type! 4327 if (isa<TypedefType>(T.getTypePtr())) { 4328 if (OutermostType && T.isConstQualified()) { 4329 isReadOnly = true; 4330 S += 'r'; 4331 } 4332 } else if (OutermostType) { 4333 QualType P = PointeeTy; 4334 while (P->getAs<PointerType>()) 4335 P = P->getAs<PointerType>()->getPointeeType(); 4336 if (P.isConstQualified()) { 4337 isReadOnly = true; 4338 S += 'r'; 4339 } 4340 } 4341 if (isReadOnly) { 4342 // Another legacy compatibility encoding. Some ObjC qualifier and type 4343 // combinations need to be rearranged. 4344 // Rewrite "in const" from "nr" to "rn" 4345 if (llvm::StringRef(S).endswith("nr")) 4346 S.replace(S.end()-2, S.end(), "rn"); 4347 } 4348 4349 if (PointeeTy->isCharType()) { 4350 // char pointer types should be encoded as '*' unless it is a 4351 // type that has been typedef'd to 'BOOL'. 4352 if (!isTypeTypedefedAsBOOL(PointeeTy)) { 4353 S += '*'; 4354 return; 4355 } 4356 } else if (const RecordType *RTy = PointeeTy->getAs<RecordType>()) { 4357 // GCC binary compat: Need to convert "struct objc_class *" to "#". 4358 if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_class")) { 4359 S += '#'; 4360 return; 4361 } 4362 // GCC binary compat: Need to convert "struct objc_object *" to "@". 4363 if (RTy->getDecl()->getIdentifier() == &Idents.get("objc_object")) { 4364 S += '@'; 4365 return; 4366 } 4367 // fall through... 4368 } 4369 S += '^'; 4370 getLegacyIntegralTypeEncoding(PointeeTy); 4371 4372 getObjCEncodingForTypeImpl(PointeeTy, S, false, ExpandPointedToStructures, 4373 NULL); 4374 return; 4375 } 4376 4377 if (const ArrayType *AT = 4378 // Ignore type qualifiers etc. 4379 dyn_cast<ArrayType>(T->getCanonicalTypeInternal())) { 4380 if (isa<IncompleteArrayType>(AT) && !StructField) { 4381 // Incomplete arrays are encoded as a pointer to the array element. 4382 S += '^'; 4383 4384 getObjCEncodingForTypeImpl(AT->getElementType(), S, 4385 false, ExpandStructures, FD); 4386 } else { 4387 S += '['; 4388 4389 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) { 4390 if (getTypeSize(CAT->getElementType()) == 0) 4391 S += '0'; 4392 else 4393 S += llvm::utostr(CAT->getSize().getZExtValue()); 4394 } else { 4395 //Variable length arrays are encoded as a regular array with 0 elements. 4396 assert((isa<VariableArrayType>(AT) || isa<IncompleteArrayType>(AT)) && 4397 "Unknown array type!"); 4398 S += '0'; 4399 } 4400 4401 getObjCEncodingForTypeImpl(AT->getElementType(), S, 4402 false, ExpandStructures, FD); 4403 S += ']'; 4404 } 4405 return; 4406 } 4407 4408 if (T->getAs<FunctionType>()) { 4409 S += '?'; 4410 return; 4411 } 4412 4413 if (const RecordType *RTy = T->getAs<RecordType>()) { 4414 RecordDecl *RDecl = RTy->getDecl(); 4415 S += RDecl->isUnion() ? '(' : '{'; 4416 // Anonymous structures print as '?' 4417 if (const IdentifierInfo *II = RDecl->getIdentifier()) { 4418 S += II->getName(); 4419 if (ClassTemplateSpecializationDecl *Spec 4420 = dyn_cast<ClassTemplateSpecializationDecl>(RDecl)) { 4421 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 4422 std::string TemplateArgsStr 4423 = TemplateSpecializationType::PrintTemplateArgumentList( 4424 TemplateArgs.data(), 4425 TemplateArgs.size(), 4426 (*this).PrintingPolicy); 4427 4428 S += TemplateArgsStr; 4429 } 4430 } else { 4431 S += '?'; 4432 } 4433 if (ExpandStructures) { 4434 S += '='; 4435 if (!RDecl->isUnion()) { 4436 getObjCEncodingForStructureImpl(RDecl, S, FD); 4437 } else { 4438 for (RecordDecl::field_iterator Field = RDecl->field_begin(), 4439 FieldEnd = RDecl->field_end(); 4440 Field != FieldEnd; ++Field) { 4441 if (FD) { 4442 S += '"'; 4443 S += Field->getNameAsString(); 4444 S += '"'; 4445 } 4446 4447 // Special case bit-fields. 4448 if (Field->isBitField()) { 4449 getObjCEncodingForTypeImpl(Field->getType(), S, false, true, 4450 (*Field)); 4451 } else { 4452 QualType qt = Field->getType(); 4453 getLegacyIntegralTypeEncoding(qt); 4454 getObjCEncodingForTypeImpl(qt, S, false, true, 4455 FD, /*OutermostType*/false, 4456 /*EncodingProperty*/false, 4457 /*StructField*/true); 4458 } 4459 } 4460 } 4461 } 4462 S += RDecl->isUnion() ? ')' : '}'; 4463 return; 4464 } 4465 4466 if (T->isEnumeralType()) { 4467 if (FD && FD->isBitField()) 4468 EncodeBitField(this, S, T, FD); 4469 else 4470 S += 'i'; 4471 return; 4472 } 4473 4474 if (T->isBlockPointerType()) { 4475 S += "@?"; // Unlike a pointer-to-function, which is "^?". 4476 return; 4477 } 4478 4479 // Ignore protocol qualifiers when mangling at this level. 4480 if (const ObjCObjectType *OT = T->getAs<ObjCObjectType>()) 4481 T = OT->getBaseType(); 4482 4483 if (const ObjCInterfaceType *OIT = T->getAs<ObjCInterfaceType>()) { 4484 // @encode(class_name) 4485 ObjCInterfaceDecl *OI = OIT->getDecl(); 4486 S += '{'; 4487 const IdentifierInfo *II = OI->getIdentifier(); 4488 S += II->getName(); 4489 S += '='; 4490 llvm::SmallVector<ObjCIvarDecl*, 32> Ivars; 4491 DeepCollectObjCIvars(OI, true, Ivars); 4492 for (unsigned i = 0, e = Ivars.size(); i != e; ++i) { 4493 FieldDecl *Field = cast<FieldDecl>(Ivars[i]); 4494 if (Field->isBitField()) 4495 getObjCEncodingForTypeImpl(Field->getType(), S, false, true, Field); 4496 else 4497 getObjCEncodingForTypeImpl(Field->getType(), S, false, true, FD); 4498 } 4499 S += '}'; 4500 return; 4501 } 4502 4503 if (const ObjCObjectPointerType *OPT = T->getAs<ObjCObjectPointerType>()) { 4504 if (OPT->isObjCIdType()) { 4505 S += '@'; 4506 return; 4507 } 4508 4509 if (OPT->isObjCClassType() || OPT->isObjCQualifiedClassType()) { 4510 // FIXME: Consider if we need to output qualifiers for 'Class<p>'. 4511 // Since this is a binary compatibility issue, need to consult with runtime 4512 // folks. Fortunately, this is a *very* obsure construct. 4513 S += '#'; 4514 return; 4515 } 4516 4517 if (OPT->isObjCQualifiedIdType()) { 4518 getObjCEncodingForTypeImpl(getObjCIdType(), S, 4519 ExpandPointedToStructures, 4520 ExpandStructures, FD); 4521 if (FD || EncodingProperty) { 4522 // Note that we do extended encoding of protocol qualifer list 4523 // Only when doing ivar or property encoding. 4524 S += '"'; 4525 for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 4526 E = OPT->qual_end(); I != E; ++I) { 4527 S += '<'; 4528 S += (*I)->getNameAsString(); 4529 S += '>'; 4530 } 4531 S += '"'; 4532 } 4533 return; 4534 } 4535 4536 QualType PointeeTy = OPT->getPointeeType(); 4537 if (!EncodingProperty && 4538 isa<TypedefType>(PointeeTy.getTypePtr())) { 4539 // Another historical/compatibility reason. 4540 // We encode the underlying type which comes out as 4541 // {...}; 4542 S += '^'; 4543 getObjCEncodingForTypeImpl(PointeeTy, S, 4544 false, ExpandPointedToStructures, 4545 NULL); 4546 return; 4547 } 4548 4549 S += '@'; 4550 if (OPT->getInterfaceDecl() && (FD || EncodingProperty)) { 4551 S += '"'; 4552 S += OPT->getInterfaceDecl()->getIdentifier()->getName(); 4553 for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(), 4554 E = OPT->qual_end(); I != E; ++I) { 4555 S += '<'; 4556 S += (*I)->getNameAsString(); 4557 S += '>'; 4558 } 4559 S += '"'; 4560 } 4561 return; 4562 } 4563 4564 // gcc just blithely ignores member pointers. 4565 // TODO: maybe there should be a mangling for these 4566 if (T->getAs<MemberPointerType>()) 4567 return; 4568 4569 if (T->isVectorType()) { 4570 // This matches gcc's encoding, even though technically it is 4571 // insufficient. 4572 // FIXME. We should do a better job than gcc. 4573 return; 4574 } 4575 4576 assert(0 && "@encode for type not implemented!"); 4577 } 4578 4579 void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl, 4580 std::string &S, 4581 const FieldDecl *FD, 4582 bool includeVBases) const { 4583 assert(RDecl && "Expected non-null RecordDecl"); 4584 assert(!RDecl->isUnion() && "Should not be called for unions"); 4585 if (!RDecl->getDefinition()) 4586 return; 4587 4588 CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(RDecl); 4589 std::multimap<uint64_t, NamedDecl *> FieldOrBaseOffsets; 4590 const ASTRecordLayout &layout = getASTRecordLayout(RDecl); 4591 4592 if (CXXRec) { 4593 for (CXXRecordDecl::base_class_iterator 4594 BI = CXXRec->bases_begin(), 4595 BE = CXXRec->bases_end(); BI != BE; ++BI) { 4596 if (!BI->isVirtual()) { 4597 CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); 4598 if (base->isEmpty()) 4599 continue; 4600 uint64_t offs = layout.getBaseClassOffsetInBits(base); 4601 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 4602 std::make_pair(offs, base)); 4603 } 4604 } 4605 } 4606 4607 unsigned i = 0; 4608 for (RecordDecl::field_iterator Field = RDecl->field_begin(), 4609 FieldEnd = RDecl->field_end(); 4610 Field != FieldEnd; ++Field, ++i) { 4611 uint64_t offs = layout.getFieldOffset(i); 4612 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 4613 std::make_pair(offs, *Field)); 4614 } 4615 4616 if (CXXRec && includeVBases) { 4617 for (CXXRecordDecl::base_class_iterator 4618 BI = CXXRec->vbases_begin(), 4619 BE = CXXRec->vbases_end(); BI != BE; ++BI) { 4620 CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl(); 4621 if (base->isEmpty()) 4622 continue; 4623 uint64_t offs = layout.getVBaseClassOffsetInBits(base); 4624 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 4625 std::make_pair(offs, base)); 4626 } 4627 } 4628 4629 CharUnits size; 4630 if (CXXRec) { 4631 size = includeVBases ? layout.getSize() : layout.getNonVirtualSize(); 4632 } else { 4633 size = layout.getSize(); 4634 } 4635 4636 uint64_t CurOffs = 0; 4637 std::multimap<uint64_t, NamedDecl *>::iterator 4638 CurLayObj = FieldOrBaseOffsets.begin(); 4639 4640 if (CurLayObj != FieldOrBaseOffsets.end() && CurLayObj->first != 0) { 4641 assert(CXXRec && CXXRec->isDynamicClass() && 4642 "Offset 0 was empty but no VTable ?"); 4643 if (FD) { 4644 S += "\"_vptr$"; 4645 std::string recname = CXXRec->getNameAsString(); 4646 if (recname.empty()) recname = "?"; 4647 S += recname; 4648 S += '"'; 4649 } 4650 S += "^^?"; 4651 CurOffs += getTypeSize(VoidPtrTy); 4652 } 4653 4654 if (!RDecl->hasFlexibleArrayMember()) { 4655 // Mark the end of the structure. 4656 uint64_t offs = toBits(size); 4657 FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs), 4658 std::make_pair(offs, (NamedDecl*)0)); 4659 } 4660 4661 for (; CurLayObj != FieldOrBaseOffsets.end(); ++CurLayObj) { 4662 assert(CurOffs <= CurLayObj->first); 4663 4664 if (CurOffs < CurLayObj->first) { 4665 uint64_t padding = CurLayObj->first - CurOffs; 4666 // FIXME: There doesn't seem to be a way to indicate in the encoding that 4667 // packing/alignment of members is different that normal, in which case 4668 // the encoding will be out-of-sync with the real layout. 4669 // If the runtime switches to just consider the size of types without 4670 // taking into account alignment, we could make padding explicit in the 4671 // encoding (e.g. using arrays of chars). The encoding strings would be 4672 // longer then though. 4673 CurOffs += padding; 4674 } 4675 4676 NamedDecl *dcl = CurLayObj->second; 4677 if (dcl == 0) 4678 break; // reached end of structure. 4679 4680 if (CXXRecordDecl *base = dyn_cast<CXXRecordDecl>(dcl)) { 4681 // We expand the bases without their virtual bases since those are going 4682 // in the initial structure. Note that this differs from gcc which 4683 // expands virtual bases each time one is encountered in the hierarchy, 4684 // making the encoding type bigger than it really is. 4685 getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false); 4686 assert(!base->isEmpty()); 4687 CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize()); 4688 } else { 4689 FieldDecl *field = cast<FieldDecl>(dcl); 4690 if (FD) { 4691 S += '"'; 4692 S += field->getNameAsString(); 4693 S += '"'; 4694 } 4695 4696 if (field->isBitField()) { 4697 EncodeBitField(this, S, field->getType(), field); 4698 CurOffs += field->getBitWidth()->EvaluateAsInt(*this).getZExtValue(); 4699 } else { 4700 QualType qt = field->getType(); 4701 getLegacyIntegralTypeEncoding(qt); 4702 getObjCEncodingForTypeImpl(qt, S, false, true, FD, 4703 /*OutermostType*/false, 4704 /*EncodingProperty*/false, 4705 /*StructField*/true); 4706 CurOffs += getTypeSize(field->getType()); 4707 } 4708 } 4709 } 4710 } 4711 4712 void ASTContext::getObjCEncodingForTypeQualifier(Decl::ObjCDeclQualifier QT, 4713 std::string& S) const { 4714 if (QT & Decl::OBJC_TQ_In) 4715 S += 'n'; 4716 if (QT & Decl::OBJC_TQ_Inout) 4717 S += 'N'; 4718 if (QT & Decl::OBJC_TQ_Out) 4719 S += 'o'; 4720 if (QT & Decl::OBJC_TQ_Bycopy) 4721 S += 'O'; 4722 if (QT & Decl::OBJC_TQ_Byref) 4723 S += 'R'; 4724 if (QT & Decl::OBJC_TQ_Oneway) 4725 S += 'V'; 4726 } 4727 4728 void ASTContext::setBuiltinVaListType(QualType T) { 4729 assert(BuiltinVaListType.isNull() && "__builtin_va_list type already set!"); 4730 4731 BuiltinVaListType = T; 4732 } 4733 4734 void ASTContext::setObjCIdType(QualType T) { 4735 ObjCIdTypedefType = T; 4736 } 4737 4738 void ASTContext::setObjCSelType(QualType T) { 4739 ObjCSelTypedefType = T; 4740 } 4741 4742 void ASTContext::setObjCProtoType(QualType QT) { 4743 ObjCProtoType = QT; 4744 } 4745 4746 void ASTContext::setObjCClassType(QualType T) { 4747 ObjCClassTypedefType = T; 4748 } 4749 4750 void ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) { 4751 assert(ObjCConstantStringType.isNull() && 4752 "'NSConstantString' type already set!"); 4753 4754 ObjCConstantStringType = getObjCInterfaceType(Decl); 4755 } 4756 4757 /// \brief Retrieve the template name that corresponds to a non-empty 4758 /// lookup. 4759 TemplateName 4760 ASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin, 4761 UnresolvedSetIterator End) const { 4762 unsigned size = End - Begin; 4763 assert(size > 1 && "set is not overloaded!"); 4764 4765 void *memory = Allocate(sizeof(OverloadedTemplateStorage) + 4766 size * sizeof(FunctionTemplateDecl*)); 4767 OverloadedTemplateStorage *OT = new(memory) OverloadedTemplateStorage(size); 4768 4769 NamedDecl **Storage = OT->getStorage(); 4770 for (UnresolvedSetIterator I = Begin; I != End; ++I) { 4771 NamedDecl *D = *I; 4772 assert(isa<FunctionTemplateDecl>(D) || 4773 (isa<UsingShadowDecl>(D) && 4774 isa<FunctionTemplateDecl>(D->getUnderlyingDecl()))); 4775 *Storage++ = D; 4776 } 4777 4778 return TemplateName(OT); 4779 } 4780 4781 /// \brief Retrieve the template name that represents a qualified 4782 /// template name such as \c std::vector. 4783 TemplateName 4784 ASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS, 4785 bool TemplateKeyword, 4786 TemplateDecl *Template) const { 4787 assert(NNS && "Missing nested-name-specifier in qualified template name"); 4788 4789 // FIXME: Canonicalization? 4790 llvm::FoldingSetNodeID ID; 4791 QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template); 4792 4793 void *InsertPos = 0; 4794 QualifiedTemplateName *QTN = 4795 QualifiedTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 4796 if (!QTN) { 4797 QTN = new (*this,4) QualifiedTemplateName(NNS, TemplateKeyword, Template); 4798 QualifiedTemplateNames.InsertNode(QTN, InsertPos); 4799 } 4800 4801 return TemplateName(QTN); 4802 } 4803 4804 /// \brief Retrieve the template name that represents a dependent 4805 /// template name such as \c MetaFun::template apply. 4806 TemplateName 4807 ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS, 4808 const IdentifierInfo *Name) const { 4809 assert((!NNS || NNS->isDependent()) && 4810 "Nested name specifier must be dependent"); 4811 4812 llvm::FoldingSetNodeID ID; 4813 DependentTemplateName::Profile(ID, NNS, Name); 4814 4815 void *InsertPos = 0; 4816 DependentTemplateName *QTN = 4817 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 4818 4819 if (QTN) 4820 return TemplateName(QTN); 4821 4822 NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 4823 if (CanonNNS == NNS) { 4824 QTN = new (*this,4) DependentTemplateName(NNS, Name); 4825 } else { 4826 TemplateName Canon = getDependentTemplateName(CanonNNS, Name); 4827 QTN = new (*this,4) DependentTemplateName(NNS, Name, Canon); 4828 DependentTemplateName *CheckQTN = 4829 DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 4830 assert(!CheckQTN && "Dependent type name canonicalization broken"); 4831 (void)CheckQTN; 4832 } 4833 4834 DependentTemplateNames.InsertNode(QTN, InsertPos); 4835 return TemplateName(QTN); 4836 } 4837 4838 /// \brief Retrieve the template name that represents a dependent 4839 /// template name such as \c MetaFun::template operator+. 4840 TemplateName 4841 ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS, 4842 OverloadedOperatorKind Operator) const { 4843 assert((!NNS || NNS->isDependent()) && 4844 "Nested name specifier must be dependent"); 4845 4846 llvm::FoldingSetNodeID ID; 4847 DependentTemplateName::Profile(ID, NNS, Operator); 4848 4849 void *InsertPos = 0; 4850 DependentTemplateName *QTN 4851 = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 4852 4853 if (QTN) 4854 return TemplateName(QTN); 4855 4856 NestedNameSpecifier *CanonNNS = getCanonicalNestedNameSpecifier(NNS); 4857 if (CanonNNS == NNS) { 4858 QTN = new (*this,4) DependentTemplateName(NNS, Operator); 4859 } else { 4860 TemplateName Canon = getDependentTemplateName(CanonNNS, Operator); 4861 QTN = new (*this,4) DependentTemplateName(NNS, Operator, Canon); 4862 4863 DependentTemplateName *CheckQTN 4864 = DependentTemplateNames.FindNodeOrInsertPos(ID, InsertPos); 4865 assert(!CheckQTN && "Dependent template name canonicalization broken"); 4866 (void)CheckQTN; 4867 } 4868 4869 DependentTemplateNames.InsertNode(QTN, InsertPos); 4870 return TemplateName(QTN); 4871 } 4872 4873 TemplateName 4874 ASTContext::getSubstTemplateTemplateParm(TemplateTemplateParmDecl *param, 4875 TemplateName replacement) const { 4876 llvm::FoldingSetNodeID ID; 4877 SubstTemplateTemplateParmStorage::Profile(ID, param, replacement); 4878 4879 void *insertPos = 0; 4880 SubstTemplateTemplateParmStorage *subst 4881 = SubstTemplateTemplateParms.FindNodeOrInsertPos(ID, insertPos); 4882 4883 if (!subst) { 4884 subst = new (*this) SubstTemplateTemplateParmStorage(param, replacement); 4885 SubstTemplateTemplateParms.InsertNode(subst, insertPos); 4886 } 4887 4888 return TemplateName(subst); 4889 } 4890 4891 TemplateName 4892 ASTContext::getSubstTemplateTemplateParmPack(TemplateTemplateParmDecl *Param, 4893 const TemplateArgument &ArgPack) const { 4894 ASTContext &Self = const_cast<ASTContext &>(*this); 4895 llvm::FoldingSetNodeID ID; 4896 SubstTemplateTemplateParmPackStorage::Profile(ID, Self, Param, ArgPack); 4897 4898 void *InsertPos = 0; 4899 SubstTemplateTemplateParmPackStorage *Subst 4900 = SubstTemplateTemplateParmPacks.FindNodeOrInsertPos(ID, InsertPos); 4901 4902 if (!Subst) { 4903 Subst = new (*this) SubstTemplateTemplateParmPackStorage(Param, 4904 ArgPack.pack_size(), 4905 ArgPack.pack_begin()); 4906 SubstTemplateTemplateParmPacks.InsertNode(Subst, InsertPos); 4907 } 4908 4909 return TemplateName(Subst); 4910 } 4911 4912 /// getFromTargetType - Given one of the integer types provided by 4913 /// TargetInfo, produce the corresponding type. The unsigned @p Type 4914 /// is actually a value of type @c TargetInfo::IntType. 4915 CanQualType ASTContext::getFromTargetType(unsigned Type) const { 4916 switch (Type) { 4917 case TargetInfo::NoInt: return CanQualType(); 4918 case TargetInfo::SignedShort: return ShortTy; 4919 case TargetInfo::UnsignedShort: return UnsignedShortTy; 4920 case TargetInfo::SignedInt: return IntTy; 4921 case TargetInfo::UnsignedInt: return UnsignedIntTy; 4922 case TargetInfo::SignedLong: return LongTy; 4923 case TargetInfo::UnsignedLong: return UnsignedLongTy; 4924 case TargetInfo::SignedLongLong: return LongLongTy; 4925 case TargetInfo::UnsignedLongLong: return UnsignedLongLongTy; 4926 } 4927 4928 assert(false && "Unhandled TargetInfo::IntType value"); 4929 return CanQualType(); 4930 } 4931 4932 //===----------------------------------------------------------------------===// 4933 // Type Predicates. 4934 //===----------------------------------------------------------------------===// 4935 4936 /// getObjCGCAttr - Returns one of GCNone, Weak or Strong objc's 4937 /// garbage collection attribute. 4938 /// 4939 Qualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const { 4940 if (getLangOptions().getGCMode() == LangOptions::NonGC) 4941 return Qualifiers::GCNone; 4942 4943 assert(getLangOptions().ObjC1); 4944 Qualifiers::GC GCAttrs = Ty.getObjCGCAttr(); 4945 4946 // Default behaviour under objective-C's gc is for ObjC pointers 4947 // (or pointers to them) be treated as though they were declared 4948 // as __strong. 4949 if (GCAttrs == Qualifiers::GCNone) { 4950 if (Ty->isObjCObjectPointerType() || Ty->isBlockPointerType()) 4951 return Qualifiers::Strong; 4952 else if (Ty->isPointerType()) 4953 return getObjCGCAttrKind(Ty->getAs<PointerType>()->getPointeeType()); 4954 } else { 4955 // It's not valid to set GC attributes on anything that isn't a 4956 // pointer. 4957 #ifndef NDEBUG 4958 QualType CT = Ty->getCanonicalTypeInternal(); 4959 while (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 4960 CT = AT->getElementType(); 4961 assert(CT->isAnyPointerType() || CT->isBlockPointerType()); 4962 #endif 4963 } 4964 return GCAttrs; 4965 } 4966 4967 //===----------------------------------------------------------------------===// 4968 // Type Compatibility Testing 4969 //===----------------------------------------------------------------------===// 4970 4971 /// areCompatVectorTypes - Return true if the two specified vector types are 4972 /// compatible. 4973 static bool areCompatVectorTypes(const VectorType *LHS, 4974 const VectorType *RHS) { 4975 assert(LHS->isCanonicalUnqualified() && RHS->isCanonicalUnqualified()); 4976 return LHS->getElementType() == RHS->getElementType() && 4977 LHS->getNumElements() == RHS->getNumElements(); 4978 } 4979 4980 bool ASTContext::areCompatibleVectorTypes(QualType FirstVec, 4981 QualType SecondVec) { 4982 assert(FirstVec->isVectorType() && "FirstVec should be a vector type"); 4983 assert(SecondVec->isVectorType() && "SecondVec should be a vector type"); 4984 4985 if (hasSameUnqualifiedType(FirstVec, SecondVec)) 4986 return true; 4987 4988 // Treat Neon vector types and most AltiVec vector types as if they are the 4989 // equivalent GCC vector types. 4990 const VectorType *First = FirstVec->getAs<VectorType>(); 4991 const VectorType *Second = SecondVec->getAs<VectorType>(); 4992 if (First->getNumElements() == Second->getNumElements() && 4993 hasSameType(First->getElementType(), Second->getElementType()) && 4994 First->getVectorKind() != VectorType::AltiVecPixel && 4995 First->getVectorKind() != VectorType::AltiVecBool && 4996 Second->getVectorKind() != VectorType::AltiVecPixel && 4997 Second->getVectorKind() != VectorType::AltiVecBool) 4998 return true; 4999 5000 return false; 5001 } 5002 5003 //===----------------------------------------------------------------------===// 5004 // ObjCQualifiedIdTypesAreCompatible - Compatibility testing for qualified id's. 5005 //===----------------------------------------------------------------------===// 5006 5007 /// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the 5008 /// inheritance hierarchy of 'rProto'. 5009 bool 5010 ASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto, 5011 ObjCProtocolDecl *rProto) const { 5012 if (lProto == rProto) 5013 return true; 5014 for (ObjCProtocolDecl::protocol_iterator PI = rProto->protocol_begin(), 5015 E = rProto->protocol_end(); PI != E; ++PI) 5016 if (ProtocolCompatibleWithProtocol(lProto, *PI)) 5017 return true; 5018 return false; 5019 } 5020 5021 /// QualifiedIdConformsQualifiedId - compare id<p,...> with id<p1,...> 5022 /// return true if lhs's protocols conform to rhs's protocol; false 5023 /// otherwise. 5024 bool ASTContext::QualifiedIdConformsQualifiedId(QualType lhs, QualType rhs) { 5025 if (lhs->isObjCQualifiedIdType() && rhs->isObjCQualifiedIdType()) 5026 return ObjCQualifiedIdTypesAreCompatible(lhs, rhs, false); 5027 return false; 5028 } 5029 5030 /// ObjCQualifiedClassTypesAreCompatible - compare Class<p,...> and 5031 /// Class<p1, ...>. 5032 bool ASTContext::ObjCQualifiedClassTypesAreCompatible(QualType lhs, 5033 QualType rhs) { 5034 const ObjCObjectPointerType *lhsQID = lhs->getAs<ObjCObjectPointerType>(); 5035 const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>(); 5036 assert ((lhsQID && rhsOPT) && "ObjCQualifiedClassTypesAreCompatible"); 5037 5038 for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 5039 E = lhsQID->qual_end(); I != E; ++I) { 5040 bool match = false; 5041 ObjCProtocolDecl *lhsProto = *I; 5042 for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(), 5043 E = rhsOPT->qual_end(); J != E; ++J) { 5044 ObjCProtocolDecl *rhsProto = *J; 5045 if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto)) { 5046 match = true; 5047 break; 5048 } 5049 } 5050 if (!match) 5051 return false; 5052 } 5053 return true; 5054 } 5055 5056 /// ObjCQualifiedIdTypesAreCompatible - We know that one of lhs/rhs is an 5057 /// ObjCQualifiedIDType. 5058 bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs, QualType rhs, 5059 bool compare) { 5060 // Allow id<P..> and an 'id' or void* type in all cases. 5061 if (lhs->isVoidPointerType() || 5062 lhs->isObjCIdType() || lhs->isObjCClassType()) 5063 return true; 5064 else if (rhs->isVoidPointerType() || 5065 rhs->isObjCIdType() || rhs->isObjCClassType()) 5066 return true; 5067 5068 if (const ObjCObjectPointerType *lhsQID = lhs->getAsObjCQualifiedIdType()) { 5069 const ObjCObjectPointerType *rhsOPT = rhs->getAs<ObjCObjectPointerType>(); 5070 5071 if (!rhsOPT) return false; 5072 5073 if (rhsOPT->qual_empty()) { 5074 // If the RHS is a unqualified interface pointer "NSString*", 5075 // make sure we check the class hierarchy. 5076 if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) { 5077 for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 5078 E = lhsQID->qual_end(); I != E; ++I) { 5079 // when comparing an id<P> on lhs with a static type on rhs, 5080 // see if static class implements all of id's protocols, directly or 5081 // through its super class and categories. 5082 if (!rhsID->ClassImplementsProtocol(*I, true)) 5083 return false; 5084 } 5085 } 5086 // If there are no qualifiers and no interface, we have an 'id'. 5087 return true; 5088 } 5089 // Both the right and left sides have qualifiers. 5090 for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 5091 E = lhsQID->qual_end(); I != E; ++I) { 5092 ObjCProtocolDecl *lhsProto = *I; 5093 bool match = false; 5094 5095 // when comparing an id<P> on lhs with a static type on rhs, 5096 // see if static class implements all of id's protocols, directly or 5097 // through its super class and categories. 5098 for (ObjCObjectPointerType::qual_iterator J = rhsOPT->qual_begin(), 5099 E = rhsOPT->qual_end(); J != E; ++J) { 5100 ObjCProtocolDecl *rhsProto = *J; 5101 if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 5102 (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 5103 match = true; 5104 break; 5105 } 5106 } 5107 // If the RHS is a qualified interface pointer "NSString<P>*", 5108 // make sure we check the class hierarchy. 5109 if (ObjCInterfaceDecl *rhsID = rhsOPT->getInterfaceDecl()) { 5110 for (ObjCObjectPointerType::qual_iterator I = lhsQID->qual_begin(), 5111 E = lhsQID->qual_end(); I != E; ++I) { 5112 // when comparing an id<P> on lhs with a static type on rhs, 5113 // see if static class implements all of id's protocols, directly or 5114 // through its super class and categories. 5115 if (rhsID->ClassImplementsProtocol(*I, true)) { 5116 match = true; 5117 break; 5118 } 5119 } 5120 } 5121 if (!match) 5122 return false; 5123 } 5124 5125 return true; 5126 } 5127 5128 const ObjCObjectPointerType *rhsQID = rhs->getAsObjCQualifiedIdType(); 5129 assert(rhsQID && "One of the LHS/RHS should be id<x>"); 5130 5131 if (const ObjCObjectPointerType *lhsOPT = 5132 lhs->getAsObjCInterfacePointerType()) { 5133 // If both the right and left sides have qualifiers. 5134 for (ObjCObjectPointerType::qual_iterator I = lhsOPT->qual_begin(), 5135 E = lhsOPT->qual_end(); I != E; ++I) { 5136 ObjCProtocolDecl *lhsProto = *I; 5137 bool match = false; 5138 5139 // when comparing an id<P> on rhs with a static type on lhs, 5140 // see if static class implements all of id's protocols, directly or 5141 // through its super class and categories. 5142 // First, lhs protocols in the qualifier list must be found, direct 5143 // or indirect in rhs's qualifier list or it is a mismatch. 5144 for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(), 5145 E = rhsQID->qual_end(); J != E; ++J) { 5146 ObjCProtocolDecl *rhsProto = *J; 5147 if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 5148 (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 5149 match = true; 5150 break; 5151 } 5152 } 5153 if (!match) 5154 return false; 5155 } 5156 5157 // Static class's protocols, or its super class or category protocols 5158 // must be found, direct or indirect in rhs's qualifier list or it is a mismatch. 5159 if (ObjCInterfaceDecl *lhsID = lhsOPT->getInterfaceDecl()) { 5160 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols; 5161 CollectInheritedProtocols(lhsID, LHSInheritedProtocols); 5162 // This is rather dubious but matches gcc's behavior. If lhs has 5163 // no type qualifier and its class has no static protocol(s) 5164 // assume that it is mismatch. 5165 if (LHSInheritedProtocols.empty() && lhsOPT->qual_empty()) 5166 return false; 5167 for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5168 LHSInheritedProtocols.begin(), 5169 E = LHSInheritedProtocols.end(); I != E; ++I) { 5170 bool match = false; 5171 ObjCProtocolDecl *lhsProto = (*I); 5172 for (ObjCObjectPointerType::qual_iterator J = rhsQID->qual_begin(), 5173 E = rhsQID->qual_end(); J != E; ++J) { 5174 ObjCProtocolDecl *rhsProto = *J; 5175 if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) || 5176 (compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto))) { 5177 match = true; 5178 break; 5179 } 5180 } 5181 if (!match) 5182 return false; 5183 } 5184 } 5185 return true; 5186 } 5187 return false; 5188 } 5189 5190 /// canAssignObjCInterfaces - Return true if the two interface types are 5191 /// compatible for assignment from RHS to LHS. This handles validation of any 5192 /// protocol qualifiers on the LHS or RHS. 5193 /// 5194 bool ASTContext::canAssignObjCInterfaces(const ObjCObjectPointerType *LHSOPT, 5195 const ObjCObjectPointerType *RHSOPT) { 5196 const ObjCObjectType* LHS = LHSOPT->getObjectType(); 5197 const ObjCObjectType* RHS = RHSOPT->getObjectType(); 5198 5199 // If either type represents the built-in 'id' or 'Class' types, return true. 5200 if (LHS->isObjCUnqualifiedIdOrClass() || 5201 RHS->isObjCUnqualifiedIdOrClass()) 5202 return true; 5203 5204 if (LHS->isObjCQualifiedId() || RHS->isObjCQualifiedId()) 5205 return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0), 5206 QualType(RHSOPT,0), 5207 false); 5208 5209 if (LHS->isObjCQualifiedClass() && RHS->isObjCQualifiedClass()) 5210 return ObjCQualifiedClassTypesAreCompatible(QualType(LHSOPT,0), 5211 QualType(RHSOPT,0)); 5212 5213 // If we have 2 user-defined types, fall into that path. 5214 if (LHS->getInterface() && RHS->getInterface()) 5215 return canAssignObjCInterfaces(LHS, RHS); 5216 5217 return false; 5218 } 5219 5220 /// canAssignObjCInterfacesInBlockPointer - This routine is specifically written 5221 /// for providing type-safety for objective-c pointers used to pass/return 5222 /// arguments in block literals. When passed as arguments, passing 'A*' where 5223 /// 'id' is expected is not OK. Passing 'Sub *" where 'Super *" is expected is 5224 /// not OK. For the return type, the opposite is not OK. 5225 bool ASTContext::canAssignObjCInterfacesInBlockPointer( 5226 const ObjCObjectPointerType *LHSOPT, 5227 const ObjCObjectPointerType *RHSOPT, 5228 bool BlockReturnType) { 5229 if (RHSOPT->isObjCBuiltinType() || LHSOPT->isObjCIdType()) 5230 return true; 5231 5232 if (LHSOPT->isObjCBuiltinType()) { 5233 return RHSOPT->isObjCBuiltinType() || RHSOPT->isObjCQualifiedIdType(); 5234 } 5235 5236 if (LHSOPT->isObjCQualifiedIdType() || RHSOPT->isObjCQualifiedIdType()) 5237 return ObjCQualifiedIdTypesAreCompatible(QualType(LHSOPT,0), 5238 QualType(RHSOPT,0), 5239 false); 5240 5241 const ObjCInterfaceType* LHS = LHSOPT->getInterfaceType(); 5242 const ObjCInterfaceType* RHS = RHSOPT->getInterfaceType(); 5243 if (LHS && RHS) { // We have 2 user-defined types. 5244 if (LHS != RHS) { 5245 if (LHS->getDecl()->isSuperClassOf(RHS->getDecl())) 5246 return BlockReturnType; 5247 if (RHS->getDecl()->isSuperClassOf(LHS->getDecl())) 5248 return !BlockReturnType; 5249 } 5250 else 5251 return true; 5252 } 5253 return false; 5254 } 5255 5256 /// getIntersectionOfProtocols - This routine finds the intersection of set 5257 /// of protocols inherited from two distinct objective-c pointer objects. 5258 /// It is used to build composite qualifier list of the composite type of 5259 /// the conditional expression involving two objective-c pointer objects. 5260 static 5261 void getIntersectionOfProtocols(ASTContext &Context, 5262 const ObjCObjectPointerType *LHSOPT, 5263 const ObjCObjectPointerType *RHSOPT, 5264 llvm::SmallVectorImpl<ObjCProtocolDecl *> &IntersectionOfProtocols) { 5265 5266 const ObjCObjectType* LHS = LHSOPT->getObjectType(); 5267 const ObjCObjectType* RHS = RHSOPT->getObjectType(); 5268 assert(LHS->getInterface() && "LHS must have an interface base"); 5269 assert(RHS->getInterface() && "RHS must have an interface base"); 5270 5271 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> InheritedProtocolSet; 5272 unsigned LHSNumProtocols = LHS->getNumProtocols(); 5273 if (LHSNumProtocols > 0) 5274 InheritedProtocolSet.insert(LHS->qual_begin(), LHS->qual_end()); 5275 else { 5276 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSInheritedProtocols; 5277 Context.CollectInheritedProtocols(LHS->getInterface(), 5278 LHSInheritedProtocols); 5279 InheritedProtocolSet.insert(LHSInheritedProtocols.begin(), 5280 LHSInheritedProtocols.end()); 5281 } 5282 5283 unsigned RHSNumProtocols = RHS->getNumProtocols(); 5284 if (RHSNumProtocols > 0) { 5285 ObjCProtocolDecl **RHSProtocols = 5286 const_cast<ObjCProtocolDecl **>(RHS->qual_begin()); 5287 for (unsigned i = 0; i < RHSNumProtocols; ++i) 5288 if (InheritedProtocolSet.count(RHSProtocols[i])) 5289 IntersectionOfProtocols.push_back(RHSProtocols[i]); 5290 } 5291 else { 5292 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSInheritedProtocols; 5293 Context.CollectInheritedProtocols(RHS->getInterface(), 5294 RHSInheritedProtocols); 5295 for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5296 RHSInheritedProtocols.begin(), 5297 E = RHSInheritedProtocols.end(); I != E; ++I) 5298 if (InheritedProtocolSet.count((*I))) 5299 IntersectionOfProtocols.push_back((*I)); 5300 } 5301 } 5302 5303 /// areCommonBaseCompatible - Returns common base class of the two classes if 5304 /// one found. Note that this is O'2 algorithm. But it will be called as the 5305 /// last type comparison in a ?-exp of ObjC pointer types before a 5306 /// warning is issued. So, its invokation is extremely rare. 5307 QualType ASTContext::areCommonBaseCompatible( 5308 const ObjCObjectPointerType *Lptr, 5309 const ObjCObjectPointerType *Rptr) { 5310 const ObjCObjectType *LHS = Lptr->getObjectType(); 5311 const ObjCObjectType *RHS = Rptr->getObjectType(); 5312 const ObjCInterfaceDecl* LDecl = LHS->getInterface(); 5313 const ObjCInterfaceDecl* RDecl = RHS->getInterface(); 5314 if (!LDecl || !RDecl || (LDecl == RDecl)) 5315 return QualType(); 5316 5317 do { 5318 LHS = cast<ObjCInterfaceType>(getObjCInterfaceType(LDecl)); 5319 if (canAssignObjCInterfaces(LHS, RHS)) { 5320 llvm::SmallVector<ObjCProtocolDecl *, 8> Protocols; 5321 getIntersectionOfProtocols(*this, Lptr, Rptr, Protocols); 5322 5323 QualType Result = QualType(LHS, 0); 5324 if (!Protocols.empty()) 5325 Result = getObjCObjectType(Result, Protocols.data(), Protocols.size()); 5326 Result = getObjCObjectPointerType(Result); 5327 return Result; 5328 } 5329 } while ((LDecl = LDecl->getSuperClass())); 5330 5331 return QualType(); 5332 } 5333 5334 bool ASTContext::canAssignObjCInterfaces(const ObjCObjectType *LHS, 5335 const ObjCObjectType *RHS) { 5336 assert(LHS->getInterface() && "LHS is not an interface type"); 5337 assert(RHS->getInterface() && "RHS is not an interface type"); 5338 5339 // Verify that the base decls are compatible: the RHS must be a subclass of 5340 // the LHS. 5341 if (!LHS->getInterface()->isSuperClassOf(RHS->getInterface())) 5342 return false; 5343 5344 // RHS must have a superset of the protocols in the LHS. If the LHS is not 5345 // protocol qualified at all, then we are good. 5346 if (LHS->getNumProtocols() == 0) 5347 return true; 5348 5349 // Okay, we know the LHS has protocol qualifiers. If the RHS doesn't, 5350 // more detailed analysis is required. 5351 if (RHS->getNumProtocols() == 0) { 5352 // OK, if LHS is a superclass of RHS *and* 5353 // this superclass is assignment compatible with LHS. 5354 // false otherwise. 5355 bool IsSuperClass = 5356 LHS->getInterface()->isSuperClassOf(RHS->getInterface()); 5357 if (IsSuperClass) { 5358 // OK if conversion of LHS to SuperClass results in narrowing of types 5359 // ; i.e., SuperClass may implement at least one of the protocols 5360 // in LHS's protocol list. Example, SuperObj<P1> = lhs<P1,P2> is ok. 5361 // But not SuperObj<P1,P2,P3> = lhs<P1,P2>. 5362 llvm::SmallPtrSet<ObjCProtocolDecl *, 8> SuperClassInheritedProtocols; 5363 CollectInheritedProtocols(RHS->getInterface(), SuperClassInheritedProtocols); 5364 // If super class has no protocols, it is not a match. 5365 if (SuperClassInheritedProtocols.empty()) 5366 return false; 5367 5368 for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(), 5369 LHSPE = LHS->qual_end(); 5370 LHSPI != LHSPE; LHSPI++) { 5371 bool SuperImplementsProtocol = false; 5372 ObjCProtocolDecl *LHSProto = (*LHSPI); 5373 5374 for (llvm::SmallPtrSet<ObjCProtocolDecl*,8>::iterator I = 5375 SuperClassInheritedProtocols.begin(), 5376 E = SuperClassInheritedProtocols.end(); I != E; ++I) { 5377 ObjCProtocolDecl *SuperClassProto = (*I); 5378 if (SuperClassProto->lookupProtocolNamed(LHSProto->getIdentifier())) { 5379 SuperImplementsProtocol = true; 5380 break; 5381 } 5382 } 5383 if (!SuperImplementsProtocol) 5384 return false; 5385 } 5386 return true; 5387 } 5388 return false; 5389 } 5390 5391 for (ObjCObjectType::qual_iterator LHSPI = LHS->qual_begin(), 5392 LHSPE = LHS->qual_end(); 5393 LHSPI != LHSPE; LHSPI++) { 5394 bool RHSImplementsProtocol = false; 5395 5396 // If the RHS doesn't implement the protocol on the left, the types 5397 // are incompatible. 5398 for (ObjCObjectType::qual_iterator RHSPI = RHS->qual_begin(), 5399 RHSPE = RHS->qual_end(); 5400 RHSPI != RHSPE; RHSPI++) { 5401 if ((*RHSPI)->lookupProtocolNamed((*LHSPI)->getIdentifier())) { 5402 RHSImplementsProtocol = true; 5403 break; 5404 } 5405 } 5406 // FIXME: For better diagnostics, consider passing back the protocol name. 5407 if (!RHSImplementsProtocol) 5408 return false; 5409 } 5410 // The RHS implements all protocols listed on the LHS. 5411 return true; 5412 } 5413 5414 bool ASTContext::areComparableObjCPointerTypes(QualType LHS, QualType RHS) { 5415 // get the "pointed to" types 5416 const ObjCObjectPointerType *LHSOPT = LHS->getAs<ObjCObjectPointerType>(); 5417 const ObjCObjectPointerType *RHSOPT = RHS->getAs<ObjCObjectPointerType>(); 5418 5419 if (!LHSOPT || !RHSOPT) 5420 return false; 5421 5422 return canAssignObjCInterfaces(LHSOPT, RHSOPT) || 5423 canAssignObjCInterfaces(RHSOPT, LHSOPT); 5424 } 5425 5426 bool ASTContext::canBindObjCObjectType(QualType To, QualType From) { 5427 return canAssignObjCInterfaces( 5428 getObjCObjectPointerType(To)->getAs<ObjCObjectPointerType>(), 5429 getObjCObjectPointerType(From)->getAs<ObjCObjectPointerType>()); 5430 } 5431 5432 /// typesAreCompatible - C99 6.7.3p9: For two qualified types to be compatible, 5433 /// both shall have the identically qualified version of a compatible type. 5434 /// C99 6.2.7p1: Two types have compatible types if their types are the 5435 /// same. See 6.7.[2,3,5] for additional rules. 5436 bool ASTContext::typesAreCompatible(QualType LHS, QualType RHS, 5437 bool CompareUnqualified) { 5438 if (getLangOptions().CPlusPlus) 5439 return hasSameType(LHS, RHS); 5440 5441 return !mergeTypes(LHS, RHS, false, CompareUnqualified).isNull(); 5442 } 5443 5444 bool ASTContext::propertyTypesAreCompatible(QualType LHS, QualType RHS) { 5445 return typesAreCompatible(LHS, RHS); 5446 } 5447 5448 bool ASTContext::typesAreBlockPointerCompatible(QualType LHS, QualType RHS) { 5449 return !mergeTypes(LHS, RHS, true).isNull(); 5450 } 5451 5452 /// mergeTransparentUnionType - if T is a transparent union type and a member 5453 /// of T is compatible with SubType, return the merged type, else return 5454 /// QualType() 5455 QualType ASTContext::mergeTransparentUnionType(QualType T, QualType SubType, 5456 bool OfBlockPointer, 5457 bool Unqualified) { 5458 if (const RecordType *UT = T->getAsUnionType()) { 5459 RecordDecl *UD = UT->getDecl(); 5460 if (UD->hasAttr<TransparentUnionAttr>()) { 5461 for (RecordDecl::field_iterator it = UD->field_begin(), 5462 itend = UD->field_end(); it != itend; ++it) { 5463 QualType ET = it->getType().getUnqualifiedType(); 5464 QualType MT = mergeTypes(ET, SubType, OfBlockPointer, Unqualified); 5465 if (!MT.isNull()) 5466 return MT; 5467 } 5468 } 5469 } 5470 5471 return QualType(); 5472 } 5473 5474 /// mergeFunctionArgumentTypes - merge two types which appear as function 5475 /// argument types 5476 QualType ASTContext::mergeFunctionArgumentTypes(QualType lhs, QualType rhs, 5477 bool OfBlockPointer, 5478 bool Unqualified) { 5479 // GNU extension: two types are compatible if they appear as a function 5480 // argument, one of the types is a transparent union type and the other 5481 // type is compatible with a union member 5482 QualType lmerge = mergeTransparentUnionType(lhs, rhs, OfBlockPointer, 5483 Unqualified); 5484 if (!lmerge.isNull()) 5485 return lmerge; 5486 5487 QualType rmerge = mergeTransparentUnionType(rhs, lhs, OfBlockPointer, 5488 Unqualified); 5489 if (!rmerge.isNull()) 5490 return rmerge; 5491 5492 return mergeTypes(lhs, rhs, OfBlockPointer, Unqualified); 5493 } 5494 5495 QualType ASTContext::mergeFunctionTypes(QualType lhs, QualType rhs, 5496 bool OfBlockPointer, 5497 bool Unqualified) { 5498 const FunctionType *lbase = lhs->getAs<FunctionType>(); 5499 const FunctionType *rbase = rhs->getAs<FunctionType>(); 5500 const FunctionProtoType *lproto = dyn_cast<FunctionProtoType>(lbase); 5501 const FunctionProtoType *rproto = dyn_cast<FunctionProtoType>(rbase); 5502 bool allLTypes = true; 5503 bool allRTypes = true; 5504 5505 // Check return type 5506 QualType retType; 5507 if (OfBlockPointer) { 5508 QualType RHS = rbase->getResultType(); 5509 QualType LHS = lbase->getResultType(); 5510 bool UnqualifiedResult = Unqualified; 5511 if (!UnqualifiedResult) 5512 UnqualifiedResult = (!RHS.hasQualifiers() && LHS.hasQualifiers()); 5513 retType = mergeTypes(LHS, RHS, true, UnqualifiedResult, true); 5514 } 5515 else 5516 retType = mergeTypes(lbase->getResultType(), rbase->getResultType(), false, 5517 Unqualified); 5518 if (retType.isNull()) return QualType(); 5519 5520 if (Unqualified) 5521 retType = retType.getUnqualifiedType(); 5522 5523 CanQualType LRetType = getCanonicalType(lbase->getResultType()); 5524 CanQualType RRetType = getCanonicalType(rbase->getResultType()); 5525 if (Unqualified) { 5526 LRetType = LRetType.getUnqualifiedType(); 5527 RRetType = RRetType.getUnqualifiedType(); 5528 } 5529 5530 if (getCanonicalType(retType) != LRetType) 5531 allLTypes = false; 5532 if (getCanonicalType(retType) != RRetType) 5533 allRTypes = false; 5534 5535 // FIXME: double check this 5536 // FIXME: should we error if lbase->getRegParmAttr() != 0 && 5537 // rbase->getRegParmAttr() != 0 && 5538 // lbase->getRegParmAttr() != rbase->getRegParmAttr()? 5539 FunctionType::ExtInfo lbaseInfo = lbase->getExtInfo(); 5540 FunctionType::ExtInfo rbaseInfo = rbase->getExtInfo(); 5541 5542 // Compatible functions must have compatible calling conventions 5543 if (!isSameCallConv(lbaseInfo.getCC(), rbaseInfo.getCC())) 5544 return QualType(); 5545 5546 // Regparm is part of the calling convention. 5547 if (lbaseInfo.getHasRegParm() != rbaseInfo.getHasRegParm()) 5548 return QualType(); 5549 if (lbaseInfo.getRegParm() != rbaseInfo.getRegParm()) 5550 return QualType(); 5551 5552 if (lbaseInfo.getProducesResult() != rbaseInfo.getProducesResult()) 5553 return QualType(); 5554 5555 // It's noreturn if either type is. 5556 // FIXME: some uses, e.g. conditional exprs, really want this to be 'both'. 5557 bool NoReturn = lbaseInfo.getNoReturn() || rbaseInfo.getNoReturn(); 5558 if (NoReturn != lbaseInfo.getNoReturn()) 5559 allLTypes = false; 5560 if (NoReturn != rbaseInfo.getNoReturn()) 5561 allRTypes = false; 5562 5563 FunctionType::ExtInfo einfo = lbaseInfo.withNoReturn(NoReturn); 5564 5565 if (lproto && rproto) { // two C99 style function prototypes 5566 assert(!lproto->hasExceptionSpec() && !rproto->hasExceptionSpec() && 5567 "C++ shouldn't be here"); 5568 unsigned lproto_nargs = lproto->getNumArgs(); 5569 unsigned rproto_nargs = rproto->getNumArgs(); 5570 5571 // Compatible functions must have the same number of arguments 5572 if (lproto_nargs != rproto_nargs) 5573 return QualType(); 5574 5575 // Variadic and non-variadic functions aren't compatible 5576 if (lproto->isVariadic() != rproto->isVariadic()) 5577 return QualType(); 5578 5579 if (lproto->getTypeQuals() != rproto->getTypeQuals()) 5580 return QualType(); 5581 5582 // Check argument compatibility 5583 llvm::SmallVector<QualType, 10> types; 5584 for (unsigned i = 0; i < lproto_nargs; i++) { 5585 QualType largtype = lproto->getArgType(i).getUnqualifiedType(); 5586 QualType rargtype = rproto->getArgType(i).getUnqualifiedType(); 5587 QualType argtype = mergeFunctionArgumentTypes(largtype, rargtype, 5588 OfBlockPointer, 5589 Unqualified); 5590 if (argtype.isNull()) return QualType(); 5591 5592 if (Unqualified) 5593 argtype = argtype.getUnqualifiedType(); 5594 5595 types.push_back(argtype); 5596 if (Unqualified) { 5597 largtype = largtype.getUnqualifiedType(); 5598 rargtype = rargtype.getUnqualifiedType(); 5599 } 5600 5601 if (getCanonicalType(argtype) != getCanonicalType(largtype)) 5602 allLTypes = false; 5603 if (getCanonicalType(argtype) != getCanonicalType(rargtype)) 5604 allRTypes = false; 5605 } 5606 if (allLTypes) return lhs; 5607 if (allRTypes) return rhs; 5608 5609 FunctionProtoType::ExtProtoInfo EPI = lproto->getExtProtoInfo(); 5610 EPI.ExtInfo = einfo; 5611 return getFunctionType(retType, types.begin(), types.size(), EPI); 5612 } 5613 5614 if (lproto) allRTypes = false; 5615 if (rproto) allLTypes = false; 5616 5617 const FunctionProtoType *proto = lproto ? lproto : rproto; 5618 if (proto) { 5619 assert(!proto->hasExceptionSpec() && "C++ shouldn't be here"); 5620 if (proto->isVariadic()) return QualType(); 5621 // Check that the types are compatible with the types that 5622 // would result from default argument promotions (C99 6.7.5.3p15). 5623 // The only types actually affected are promotable integer 5624 // types and floats, which would be passed as a different 5625 // type depending on whether the prototype is visible. 5626 unsigned proto_nargs = proto->getNumArgs(); 5627 for (unsigned i = 0; i < proto_nargs; ++i) { 5628 QualType argTy = proto->getArgType(i); 5629 5630 // Look at the promotion type of enum types, since that is the type used 5631 // to pass enum values. 5632 if (const EnumType *Enum = argTy->getAs<EnumType>()) 5633 argTy = Enum->getDecl()->getPromotionType(); 5634 5635 if (argTy->isPromotableIntegerType() || 5636 getCanonicalType(argTy).getUnqualifiedType() == FloatTy) 5637 return QualType(); 5638 } 5639 5640 if (allLTypes) return lhs; 5641 if (allRTypes) return rhs; 5642 5643 FunctionProtoType::ExtProtoInfo EPI = proto->getExtProtoInfo(); 5644 EPI.ExtInfo = einfo; 5645 return getFunctionType(retType, proto->arg_type_begin(), 5646 proto->getNumArgs(), EPI); 5647 } 5648 5649 if (allLTypes) return lhs; 5650 if (allRTypes) return rhs; 5651 return getFunctionNoProtoType(retType, einfo); 5652 } 5653 5654 QualType ASTContext::mergeTypes(QualType LHS, QualType RHS, 5655 bool OfBlockPointer, 5656 bool Unqualified, bool BlockReturnType) { 5657 // C++ [expr]: If an expression initially has the type "reference to T", the 5658 // type is adjusted to "T" prior to any further analysis, the expression 5659 // designates the object or function denoted by the reference, and the 5660 // expression is an lvalue unless the reference is an rvalue reference and 5661 // the expression is a function call (possibly inside parentheses). 5662 assert(!LHS->getAs<ReferenceType>() && "LHS is a reference type?"); 5663 assert(!RHS->getAs<ReferenceType>() && "RHS is a reference type?"); 5664 5665 if (Unqualified) { 5666 LHS = LHS.getUnqualifiedType(); 5667 RHS = RHS.getUnqualifiedType(); 5668 } 5669 5670 QualType LHSCan = getCanonicalType(LHS), 5671 RHSCan = getCanonicalType(RHS); 5672 5673 // If two types are identical, they are compatible. 5674 if (LHSCan == RHSCan) 5675 return LHS; 5676 5677 // If the qualifiers are different, the types aren't compatible... mostly. 5678 Qualifiers LQuals = LHSCan.getLocalQualifiers(); 5679 Qualifiers RQuals = RHSCan.getLocalQualifiers(); 5680 if (LQuals != RQuals) { 5681 // If any of these qualifiers are different, we have a type 5682 // mismatch. 5683 if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() || 5684 LQuals.getAddressSpace() != RQuals.getAddressSpace() || 5685 LQuals.getObjCLifetime() != RQuals.getObjCLifetime()) 5686 return QualType(); 5687 5688 // Exactly one GC qualifier difference is allowed: __strong is 5689 // okay if the other type has no GC qualifier but is an Objective 5690 // C object pointer (i.e. implicitly strong by default). We fix 5691 // this by pretending that the unqualified type was actually 5692 // qualified __strong. 5693 Qualifiers::GC GC_L = LQuals.getObjCGCAttr(); 5694 Qualifiers::GC GC_R = RQuals.getObjCGCAttr(); 5695 assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements"); 5696 5697 if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak) 5698 return QualType(); 5699 5700 if (GC_L == Qualifiers::Strong && RHSCan->isObjCObjectPointerType()) { 5701 return mergeTypes(LHS, getObjCGCQualType(RHS, Qualifiers::Strong)); 5702 } 5703 if (GC_R == Qualifiers::Strong && LHSCan->isObjCObjectPointerType()) { 5704 return mergeTypes(getObjCGCQualType(LHS, Qualifiers::Strong), RHS); 5705 } 5706 return QualType(); 5707 } 5708 5709 // Okay, qualifiers are equal. 5710 5711 Type::TypeClass LHSClass = LHSCan->getTypeClass(); 5712 Type::TypeClass RHSClass = RHSCan->getTypeClass(); 5713 5714 // We want to consider the two function types to be the same for these 5715 // comparisons, just force one to the other. 5716 if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto; 5717 if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto; 5718 5719 // Same as above for arrays 5720 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray) 5721 LHSClass = Type::ConstantArray; 5722 if (RHSClass == Type::VariableArray || RHSClass == Type::IncompleteArray) 5723 RHSClass = Type::ConstantArray; 5724 5725 // ObjCInterfaces are just specialized ObjCObjects. 5726 if (LHSClass == Type::ObjCInterface) LHSClass = Type::ObjCObject; 5727 if (RHSClass == Type::ObjCInterface) RHSClass = Type::ObjCObject; 5728 5729 // Canonicalize ExtVector -> Vector. 5730 if (LHSClass == Type::ExtVector) LHSClass = Type::Vector; 5731 if (RHSClass == Type::ExtVector) RHSClass = Type::Vector; 5732 5733 // If the canonical type classes don't match. 5734 if (LHSClass != RHSClass) { 5735 // C99 6.7.2.2p4: Each enumerated type shall be compatible with char, 5736 // a signed integer type, or an unsigned integer type. 5737 // Compatibility is based on the underlying type, not the promotion 5738 // type. 5739 if (const EnumType* ETy = LHS->getAs<EnumType>()) { 5740 if (ETy->getDecl()->getIntegerType() == RHSCan.getUnqualifiedType()) 5741 return RHS; 5742 } 5743 if (const EnumType* ETy = RHS->getAs<EnumType>()) { 5744 if (ETy->getDecl()->getIntegerType() == LHSCan.getUnqualifiedType()) 5745 return LHS; 5746 } 5747 5748 return QualType(); 5749 } 5750 5751 // The canonical type classes match. 5752 switch (LHSClass) { 5753 #define TYPE(Class, Base) 5754 #define ABSTRACT_TYPE(Class, Base) 5755 #define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) case Type::Class: 5756 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class: 5757 #define DEPENDENT_TYPE(Class, Base) case Type::Class: 5758 #include "clang/AST/TypeNodes.def" 5759 assert(false && "Non-canonical and dependent types shouldn't get here"); 5760 return QualType(); 5761 5762 case Type::LValueReference: 5763 case Type::RValueReference: 5764 case Type::MemberPointer: 5765 assert(false && "C++ should never be in mergeTypes"); 5766 return QualType(); 5767 5768 case Type::ObjCInterface: 5769 case Type::IncompleteArray: 5770 case Type::VariableArray: 5771 case Type::FunctionProto: 5772 case Type::ExtVector: 5773 assert(false && "Types are eliminated above"); 5774 return QualType(); 5775 5776 case Type::Pointer: 5777 { 5778 // Merge two pointer types, while trying to preserve typedef info 5779 QualType LHSPointee = LHS->getAs<PointerType>()->getPointeeType(); 5780 QualType RHSPointee = RHS->getAs<PointerType>()->getPointeeType(); 5781 if (Unqualified) { 5782 LHSPointee = LHSPointee.getUnqualifiedType(); 5783 RHSPointee = RHSPointee.getUnqualifiedType(); 5784 } 5785 QualType ResultType = mergeTypes(LHSPointee, RHSPointee, false, 5786 Unqualified); 5787 if (ResultType.isNull()) return QualType(); 5788 if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) 5789 return LHS; 5790 if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) 5791 return RHS; 5792 return getPointerType(ResultType); 5793 } 5794 case Type::BlockPointer: 5795 { 5796 // Merge two block pointer types, while trying to preserve typedef info 5797 QualType LHSPointee = LHS->getAs<BlockPointerType>()->getPointeeType(); 5798 QualType RHSPointee = RHS->getAs<BlockPointerType>()->getPointeeType(); 5799 if (Unqualified) { 5800 LHSPointee = LHSPointee.getUnqualifiedType(); 5801 RHSPointee = RHSPointee.getUnqualifiedType(); 5802 } 5803 QualType ResultType = mergeTypes(LHSPointee, RHSPointee, OfBlockPointer, 5804 Unqualified); 5805 if (ResultType.isNull()) return QualType(); 5806 if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) 5807 return LHS; 5808 if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) 5809 return RHS; 5810 return getBlockPointerType(ResultType); 5811 } 5812 case Type::ConstantArray: 5813 { 5814 const ConstantArrayType* LCAT = getAsConstantArrayType(LHS); 5815 const ConstantArrayType* RCAT = getAsConstantArrayType(RHS); 5816 if (LCAT && RCAT && RCAT->getSize() != LCAT->getSize()) 5817 return QualType(); 5818 5819 QualType LHSElem = getAsArrayType(LHS)->getElementType(); 5820 QualType RHSElem = getAsArrayType(RHS)->getElementType(); 5821 if (Unqualified) { 5822 LHSElem = LHSElem.getUnqualifiedType(); 5823 RHSElem = RHSElem.getUnqualifiedType(); 5824 } 5825 5826 QualType ResultType = mergeTypes(LHSElem, RHSElem, false, Unqualified); 5827 if (ResultType.isNull()) return QualType(); 5828 if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) 5829 return LHS; 5830 if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) 5831 return RHS; 5832 if (LCAT) return getConstantArrayType(ResultType, LCAT->getSize(), 5833 ArrayType::ArraySizeModifier(), 0); 5834 if (RCAT) return getConstantArrayType(ResultType, RCAT->getSize(), 5835 ArrayType::ArraySizeModifier(), 0); 5836 const VariableArrayType* LVAT = getAsVariableArrayType(LHS); 5837 const VariableArrayType* RVAT = getAsVariableArrayType(RHS); 5838 if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) 5839 return LHS; 5840 if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) 5841 return RHS; 5842 if (LVAT) { 5843 // FIXME: This isn't correct! But tricky to implement because 5844 // the array's size has to be the size of LHS, but the type 5845 // has to be different. 5846 return LHS; 5847 } 5848 if (RVAT) { 5849 // FIXME: This isn't correct! But tricky to implement because 5850 // the array's size has to be the size of RHS, but the type 5851 // has to be different. 5852 return RHS; 5853 } 5854 if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS; 5855 if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS; 5856 return getIncompleteArrayType(ResultType, 5857 ArrayType::ArraySizeModifier(), 0); 5858 } 5859 case Type::FunctionNoProto: 5860 return mergeFunctionTypes(LHS, RHS, OfBlockPointer, Unqualified); 5861 case Type::Record: 5862 case Type::Enum: 5863 return QualType(); 5864 case Type::Builtin: 5865 // Only exactly equal builtin types are compatible, which is tested above. 5866 return QualType(); 5867 case Type::Complex: 5868 // Distinct complex types are incompatible. 5869 return QualType(); 5870 case Type::Vector: 5871 // FIXME: The merged type should be an ExtVector! 5872 if (areCompatVectorTypes(LHSCan->getAs<VectorType>(), 5873 RHSCan->getAs<VectorType>())) 5874 return LHS; 5875 return QualType(); 5876 case Type::ObjCObject: { 5877 // Check if the types are assignment compatible. 5878 // FIXME: This should be type compatibility, e.g. whether 5879 // "LHS x; RHS x;" at global scope is legal. 5880 const ObjCObjectType* LHSIface = LHS->getAs<ObjCObjectType>(); 5881 const ObjCObjectType* RHSIface = RHS->getAs<ObjCObjectType>(); 5882 if (canAssignObjCInterfaces(LHSIface, RHSIface)) 5883 return LHS; 5884 5885 return QualType(); 5886 } 5887 case Type::ObjCObjectPointer: { 5888 if (OfBlockPointer) { 5889 if (canAssignObjCInterfacesInBlockPointer( 5890 LHS->getAs<ObjCObjectPointerType>(), 5891 RHS->getAs<ObjCObjectPointerType>(), 5892 BlockReturnType)) 5893 return LHS; 5894 return QualType(); 5895 } 5896 if (canAssignObjCInterfaces(LHS->getAs<ObjCObjectPointerType>(), 5897 RHS->getAs<ObjCObjectPointerType>())) 5898 return LHS; 5899 5900 return QualType(); 5901 } 5902 } 5903 5904 return QualType(); 5905 } 5906 5907 /// mergeObjCGCQualifiers - This routine merges ObjC's GC attribute of 'LHS' and 5908 /// 'RHS' attributes and returns the merged version; including for function 5909 /// return types. 5910 QualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) { 5911 QualType LHSCan = getCanonicalType(LHS), 5912 RHSCan = getCanonicalType(RHS); 5913 // If two types are identical, they are compatible. 5914 if (LHSCan == RHSCan) 5915 return LHS; 5916 if (RHSCan->isFunctionType()) { 5917 if (!LHSCan->isFunctionType()) 5918 return QualType(); 5919 QualType OldReturnType = 5920 cast<FunctionType>(RHSCan.getTypePtr())->getResultType(); 5921 QualType NewReturnType = 5922 cast<FunctionType>(LHSCan.getTypePtr())->getResultType(); 5923 QualType ResReturnType = 5924 mergeObjCGCQualifiers(NewReturnType, OldReturnType); 5925 if (ResReturnType.isNull()) 5926 return QualType(); 5927 if (ResReturnType == NewReturnType || ResReturnType == OldReturnType) { 5928 // id foo(); ... __strong id foo(); or: __strong id foo(); ... id foo(); 5929 // In either case, use OldReturnType to build the new function type. 5930 const FunctionType *F = LHS->getAs<FunctionType>(); 5931 if (const FunctionProtoType *FPT = cast<FunctionProtoType>(F)) { 5932 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo(); 5933 EPI.ExtInfo = getFunctionExtInfo(LHS); 5934 QualType ResultType 5935 = getFunctionType(OldReturnType, FPT->arg_type_begin(), 5936 FPT->getNumArgs(), EPI); 5937 return ResultType; 5938 } 5939 } 5940 return QualType(); 5941 } 5942 5943 // If the qualifiers are different, the types can still be merged. 5944 Qualifiers LQuals = LHSCan.getLocalQualifiers(); 5945 Qualifiers RQuals = RHSCan.getLocalQualifiers(); 5946 if (LQuals != RQuals) { 5947 // If any of these qualifiers are different, we have a type mismatch. 5948 if (LQuals.getCVRQualifiers() != RQuals.getCVRQualifiers() || 5949 LQuals.getAddressSpace() != RQuals.getAddressSpace()) 5950 return QualType(); 5951 5952 // Exactly one GC qualifier difference is allowed: __strong is 5953 // okay if the other type has no GC qualifier but is an Objective 5954 // C object pointer (i.e. implicitly strong by default). We fix 5955 // this by pretending that the unqualified type was actually 5956 // qualified __strong. 5957 Qualifiers::GC GC_L = LQuals.getObjCGCAttr(); 5958 Qualifiers::GC GC_R = RQuals.getObjCGCAttr(); 5959 assert((GC_L != GC_R) && "unequal qualifier sets had only equal elements"); 5960 5961 if (GC_L == Qualifiers::Weak || GC_R == Qualifiers::Weak) 5962 return QualType(); 5963 5964 if (GC_L == Qualifiers::Strong) 5965 return LHS; 5966 if (GC_R == Qualifiers::Strong) 5967 return RHS; 5968 return QualType(); 5969 } 5970 5971 if (LHSCan->isObjCObjectPointerType() && RHSCan->isObjCObjectPointerType()) { 5972 QualType LHSBaseQT = LHS->getAs<ObjCObjectPointerType>()->getPointeeType(); 5973 QualType RHSBaseQT = RHS->getAs<ObjCObjectPointerType>()->getPointeeType(); 5974 QualType ResQT = mergeObjCGCQualifiers(LHSBaseQT, RHSBaseQT); 5975 if (ResQT == LHSBaseQT) 5976 return LHS; 5977 if (ResQT == RHSBaseQT) 5978 return RHS; 5979 } 5980 return QualType(); 5981 } 5982 5983 //===----------------------------------------------------------------------===// 5984 // Integer Predicates 5985 //===----------------------------------------------------------------------===// 5986 5987 unsigned ASTContext::getIntWidth(QualType T) const { 5988 if (const EnumType *ET = dyn_cast<EnumType>(T)) 5989 T = ET->getDecl()->getIntegerType(); 5990 if (T->isBooleanType()) 5991 return 1; 5992 // For builtin types, just use the standard type sizing method 5993 return (unsigned)getTypeSize(T); 5994 } 5995 5996 QualType ASTContext::getCorrespondingUnsignedType(QualType T) { 5997 assert(T->hasSignedIntegerRepresentation() && "Unexpected type"); 5998 5999 // Turn <4 x signed int> -> <4 x unsigned int> 6000 if (const VectorType *VTy = T->getAs<VectorType>()) 6001 return getVectorType(getCorrespondingUnsignedType(VTy->getElementType()), 6002 VTy->getNumElements(), VTy->getVectorKind()); 6003 6004 // For enums, we return the unsigned version of the base type. 6005 if (const EnumType *ETy = T->getAs<EnumType>()) 6006 T = ETy->getDecl()->getIntegerType(); 6007 6008 const BuiltinType *BTy = T->getAs<BuiltinType>(); 6009 assert(BTy && "Unexpected signed integer type"); 6010 switch (BTy->getKind()) { 6011 case BuiltinType::Char_S: 6012 case BuiltinType::SChar: 6013 return UnsignedCharTy; 6014 case BuiltinType::Short: 6015 return UnsignedShortTy; 6016 case BuiltinType::Int: 6017 return UnsignedIntTy; 6018 case BuiltinType::Long: 6019 return UnsignedLongTy; 6020 case BuiltinType::LongLong: 6021 return UnsignedLongLongTy; 6022 case BuiltinType::Int128: 6023 return UnsignedInt128Ty; 6024 default: 6025 assert(0 && "Unexpected signed integer type"); 6026 return QualType(); 6027 } 6028 } 6029 6030 ASTMutationListener::~ASTMutationListener() { } 6031 6032 6033 //===----------------------------------------------------------------------===// 6034 // Builtin Type Computation 6035 //===----------------------------------------------------------------------===// 6036 6037 /// DecodeTypeFromStr - This decodes one type descriptor from Str, advancing the 6038 /// pointer over the consumed characters. This returns the resultant type. If 6039 /// AllowTypeModifiers is false then modifier like * are not parsed, just basic 6040 /// types. This allows "v2i*" to be parsed as a pointer to a v2i instead of 6041 /// a vector of "i*". 6042 /// 6043 /// RequiresICE is filled in on return to indicate whether the value is required 6044 /// to be an Integer Constant Expression. 6045 static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context, 6046 ASTContext::GetBuiltinTypeError &Error, 6047 bool &RequiresICE, 6048 bool AllowTypeModifiers) { 6049 // Modifiers. 6050 int HowLong = 0; 6051 bool Signed = false, Unsigned = false; 6052 RequiresICE = false; 6053 6054 // Read the prefixed modifiers first. 6055 bool Done = false; 6056 while (!Done) { 6057 switch (*Str++) { 6058 default: Done = true; --Str; break; 6059 case 'I': 6060 RequiresICE = true; 6061 break; 6062 case 'S': 6063 assert(!Unsigned && "Can't use both 'S' and 'U' modifiers!"); 6064 assert(!Signed && "Can't use 'S' modifier multiple times!"); 6065 Signed = true; 6066 break; 6067 case 'U': 6068 assert(!Signed && "Can't use both 'S' and 'U' modifiers!"); 6069 assert(!Unsigned && "Can't use 'S' modifier multiple times!"); 6070 Unsigned = true; 6071 break; 6072 case 'L': 6073 assert(HowLong <= 2 && "Can't have LLLL modifier"); 6074 ++HowLong; 6075 break; 6076 } 6077 } 6078 6079 QualType Type; 6080 6081 // Read the base type. 6082 switch (*Str++) { 6083 default: assert(0 && "Unknown builtin type letter!"); 6084 case 'v': 6085 assert(HowLong == 0 && !Signed && !Unsigned && 6086 "Bad modifiers used with 'v'!"); 6087 Type = Context.VoidTy; 6088 break; 6089 case 'f': 6090 assert(HowLong == 0 && !Signed && !Unsigned && 6091 "Bad modifiers used with 'f'!"); 6092 Type = Context.FloatTy; 6093 break; 6094 case 'd': 6095 assert(HowLong < 2 && !Signed && !Unsigned && 6096 "Bad modifiers used with 'd'!"); 6097 if (HowLong) 6098 Type = Context.LongDoubleTy; 6099 else 6100 Type = Context.DoubleTy; 6101 break; 6102 case 's': 6103 assert(HowLong == 0 && "Bad modifiers used with 's'!"); 6104 if (Unsigned) 6105 Type = Context.UnsignedShortTy; 6106 else 6107 Type = Context.ShortTy; 6108 break; 6109 case 'i': 6110 if (HowLong == 3) 6111 Type = Unsigned ? Context.UnsignedInt128Ty : Context.Int128Ty; 6112 else if (HowLong == 2) 6113 Type = Unsigned ? Context.UnsignedLongLongTy : Context.LongLongTy; 6114 else if (HowLong == 1) 6115 Type = Unsigned ? Context.UnsignedLongTy : Context.LongTy; 6116 else 6117 Type = Unsigned ? Context.UnsignedIntTy : Context.IntTy; 6118 break; 6119 case 'c': 6120 assert(HowLong == 0 && "Bad modifiers used with 'c'!"); 6121 if (Signed) 6122 Type = Context.SignedCharTy; 6123 else if (Unsigned) 6124 Type = Context.UnsignedCharTy; 6125 else 6126 Type = Context.CharTy; 6127 break; 6128 case 'b': // boolean 6129 assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'b'!"); 6130 Type = Context.BoolTy; 6131 break; 6132 case 'z': // size_t. 6133 assert(HowLong == 0 && !Signed && !Unsigned && "Bad modifiers for 'z'!"); 6134 Type = Context.getSizeType(); 6135 break; 6136 case 'F': 6137 Type = Context.getCFConstantStringType(); 6138 break; 6139 case 'G': 6140 Type = Context.getObjCIdType(); 6141 break; 6142 case 'H': 6143 Type = Context.getObjCSelType(); 6144 break; 6145 case 'a': 6146 Type = Context.getBuiltinVaListType(); 6147 assert(!Type.isNull() && "builtin va list type not initialized!"); 6148 break; 6149 case 'A': 6150 // This is a "reference" to a va_list; however, what exactly 6151 // this means depends on how va_list is defined. There are two 6152 // different kinds of va_list: ones passed by value, and ones 6153 // passed by reference. An example of a by-value va_list is 6154 // x86, where va_list is a char*. An example of by-ref va_list 6155 // is x86-64, where va_list is a __va_list_tag[1]. For x86, 6156 // we want this argument to be a char*&; for x86-64, we want 6157 // it to be a __va_list_tag*. 6158 Type = Context.getBuiltinVaListType(); 6159 assert(!Type.isNull() && "builtin va list type not initialized!"); 6160 if (Type->isArrayType()) 6161 Type = Context.getArrayDecayedType(Type); 6162 else 6163 Type = Context.getLValueReferenceType(Type); 6164 break; 6165 case 'V': { 6166 char *End; 6167 unsigned NumElements = strtoul(Str, &End, 10); 6168 assert(End != Str && "Missing vector size"); 6169 Str = End; 6170 6171 QualType ElementType = DecodeTypeFromStr(Str, Context, Error, 6172 RequiresICE, false); 6173 assert(!RequiresICE && "Can't require vector ICE"); 6174 6175 // TODO: No way to make AltiVec vectors in builtins yet. 6176 Type = Context.getVectorType(ElementType, NumElements, 6177 VectorType::GenericVector); 6178 break; 6179 } 6180 case 'X': { 6181 QualType ElementType = DecodeTypeFromStr(Str, Context, Error, RequiresICE, 6182 false); 6183 assert(!RequiresICE && "Can't require complex ICE"); 6184 Type = Context.getComplexType(ElementType); 6185 break; 6186 } 6187 case 'P': 6188 Type = Context.getFILEType(); 6189 if (Type.isNull()) { 6190 Error = ASTContext::GE_Missing_stdio; 6191 return QualType(); 6192 } 6193 break; 6194 case 'J': 6195 if (Signed) 6196 Type = Context.getsigjmp_bufType(); 6197 else 6198 Type = Context.getjmp_bufType(); 6199 6200 if (Type.isNull()) { 6201 Error = ASTContext::GE_Missing_setjmp; 6202 return QualType(); 6203 } 6204 break; 6205 } 6206 6207 // If there are modifiers and if we're allowed to parse them, go for it. 6208 Done = !AllowTypeModifiers; 6209 while (!Done) { 6210 switch (char c = *Str++) { 6211 default: Done = true; --Str; break; 6212 case '*': 6213 case '&': { 6214 // Both pointers and references can have their pointee types 6215 // qualified with an address space. 6216 char *End; 6217 unsigned AddrSpace = strtoul(Str, &End, 10); 6218 if (End != Str && AddrSpace != 0) { 6219 Type = Context.getAddrSpaceQualType(Type, AddrSpace); 6220 Str = End; 6221 } 6222 if (c == '*') 6223 Type = Context.getPointerType(Type); 6224 else 6225 Type = Context.getLValueReferenceType(Type); 6226 break; 6227 } 6228 // FIXME: There's no way to have a built-in with an rvalue ref arg. 6229 case 'C': 6230 Type = Type.withConst(); 6231 break; 6232 case 'D': 6233 Type = Context.getVolatileType(Type); 6234 break; 6235 } 6236 } 6237 6238 assert((!RequiresICE || Type->isIntegralOrEnumerationType()) && 6239 "Integer constant 'I' type must be an integer"); 6240 6241 return Type; 6242 } 6243 6244 /// GetBuiltinType - Return the type for the specified builtin. 6245 QualType ASTContext::GetBuiltinType(unsigned Id, 6246 GetBuiltinTypeError &Error, 6247 unsigned *IntegerConstantArgs) const { 6248 const char *TypeStr = BuiltinInfo.GetTypeString(Id); 6249 6250 llvm::SmallVector<QualType, 8> ArgTypes; 6251 6252 bool RequiresICE = false; 6253 Error = GE_None; 6254 QualType ResType = DecodeTypeFromStr(TypeStr, *this, Error, 6255 RequiresICE, true); 6256 if (Error != GE_None) 6257 return QualType(); 6258 6259 assert(!RequiresICE && "Result of intrinsic cannot be required to be an ICE"); 6260 6261 while (TypeStr[0] && TypeStr[0] != '.') { 6262 QualType Ty = DecodeTypeFromStr(TypeStr, *this, Error, RequiresICE, true); 6263 if (Error != GE_None) 6264 return QualType(); 6265 6266 // If this argument is required to be an IntegerConstantExpression and the 6267 // caller cares, fill in the bitmask we return. 6268 if (RequiresICE && IntegerConstantArgs) 6269 *IntegerConstantArgs |= 1 << ArgTypes.size(); 6270 6271 // Do array -> pointer decay. The builtin should use the decayed type. 6272 if (Ty->isArrayType()) 6273 Ty = getArrayDecayedType(Ty); 6274 6275 ArgTypes.push_back(Ty); 6276 } 6277 6278 assert((TypeStr[0] != '.' || TypeStr[1] == 0) && 6279 "'.' should only occur at end of builtin type list!"); 6280 6281 FunctionType::ExtInfo EI; 6282 if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true); 6283 6284 bool Variadic = (TypeStr[0] == '.'); 6285 6286 // We really shouldn't be making a no-proto type here, especially in C++. 6287 if (ArgTypes.empty() && Variadic) 6288 return getFunctionNoProtoType(ResType, EI); 6289 6290 FunctionProtoType::ExtProtoInfo EPI; 6291 EPI.ExtInfo = EI; 6292 EPI.Variadic = Variadic; 6293 6294 return getFunctionType(ResType, ArgTypes.data(), ArgTypes.size(), EPI); 6295 } 6296 6297 GVALinkage ASTContext::GetGVALinkageForFunction(const FunctionDecl *FD) { 6298 GVALinkage External = GVA_StrongExternal; 6299 6300 Linkage L = FD->getLinkage(); 6301 switch (L) { 6302 case NoLinkage: 6303 case InternalLinkage: 6304 case UniqueExternalLinkage: 6305 return GVA_Internal; 6306 6307 case ExternalLinkage: 6308 switch (FD->getTemplateSpecializationKind()) { 6309 case TSK_Undeclared: 6310 case TSK_ExplicitSpecialization: 6311 External = GVA_StrongExternal; 6312 break; 6313 6314 case TSK_ExplicitInstantiationDefinition: 6315 return GVA_ExplicitTemplateInstantiation; 6316 6317 case TSK_ExplicitInstantiationDeclaration: 6318 case TSK_ImplicitInstantiation: 6319 External = GVA_TemplateInstantiation; 6320 break; 6321 } 6322 } 6323 6324 if (!FD->isInlined()) 6325 return External; 6326 6327 if (!getLangOptions().CPlusPlus || FD->hasAttr<GNUInlineAttr>()) { 6328 // GNU or C99 inline semantics. Determine whether this symbol should be 6329 // externally visible. 6330 if (FD->isInlineDefinitionExternallyVisible()) 6331 return External; 6332 6333 // C99 inline semantics, where the symbol is not externally visible. 6334 return GVA_C99Inline; 6335 } 6336 6337 // C++0x [temp.explicit]p9: 6338 // [ Note: The intent is that an inline function that is the subject of 6339 // an explicit instantiation declaration will still be implicitly 6340 // instantiated when used so that the body can be considered for 6341 // inlining, but that no out-of-line copy of the inline function would be 6342 // generated in the translation unit. -- end note ] 6343 if (FD->getTemplateSpecializationKind() 6344 == TSK_ExplicitInstantiationDeclaration) 6345 return GVA_C99Inline; 6346 6347 return GVA_CXXInline; 6348 } 6349 6350 GVALinkage ASTContext::GetGVALinkageForVariable(const VarDecl *VD) { 6351 // If this is a static data member, compute the kind of template 6352 // specialization. Otherwise, this variable is not part of a 6353 // template. 6354 TemplateSpecializationKind TSK = TSK_Undeclared; 6355 if (VD->isStaticDataMember()) 6356 TSK = VD->getTemplateSpecializationKind(); 6357 6358 Linkage L = VD->getLinkage(); 6359 if (L == ExternalLinkage && getLangOptions().CPlusPlus && 6360 VD->getType()->getLinkage() == UniqueExternalLinkage) 6361 L = UniqueExternalLinkage; 6362 6363 switch (L) { 6364 case NoLinkage: 6365 case InternalLinkage: 6366 case UniqueExternalLinkage: 6367 return GVA_Internal; 6368 6369 case ExternalLinkage: 6370 switch (TSK) { 6371 case TSK_Undeclared: 6372 case TSK_ExplicitSpecialization: 6373 return GVA_StrongExternal; 6374 6375 case TSK_ExplicitInstantiationDeclaration: 6376 llvm_unreachable("Variable should not be instantiated"); 6377 // Fall through to treat this like any other instantiation. 6378 6379 case TSK_ExplicitInstantiationDefinition: 6380 return GVA_ExplicitTemplateInstantiation; 6381 6382 case TSK_ImplicitInstantiation: 6383 return GVA_TemplateInstantiation; 6384 } 6385 } 6386 6387 return GVA_StrongExternal; 6388 } 6389 6390 bool ASTContext::DeclMustBeEmitted(const Decl *D) { 6391 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 6392 if (!VD->isFileVarDecl()) 6393 return false; 6394 } else if (!isa<FunctionDecl>(D)) 6395 return false; 6396 6397 // Weak references don't produce any output by themselves. 6398 if (D->hasAttr<WeakRefAttr>()) 6399 return false; 6400 6401 // Aliases and used decls are required. 6402 if (D->hasAttr<AliasAttr>() || D->hasAttr<UsedAttr>()) 6403 return true; 6404 6405 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 6406 // Forward declarations aren't required. 6407 if (!FD->doesThisDeclarationHaveABody()) 6408 return FD->doesDeclarationForceExternallyVisibleDefinition(); 6409 6410 // Constructors and destructors are required. 6411 if (FD->hasAttr<ConstructorAttr>() || FD->hasAttr<DestructorAttr>()) 6412 return true; 6413 6414 // The key function for a class is required. 6415 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { 6416 const CXXRecordDecl *RD = MD->getParent(); 6417 if (MD->isOutOfLine() && RD->isDynamicClass()) { 6418 const CXXMethodDecl *KeyFunc = getKeyFunction(RD); 6419 if (KeyFunc && KeyFunc->getCanonicalDecl() == MD->getCanonicalDecl()) 6420 return true; 6421 } 6422 } 6423 6424 GVALinkage Linkage = GetGVALinkageForFunction(FD); 6425 6426 // static, static inline, always_inline, and extern inline functions can 6427 // always be deferred. Normal inline functions can be deferred in C99/C++. 6428 // Implicit template instantiations can also be deferred in C++. 6429 if (Linkage == GVA_Internal || Linkage == GVA_C99Inline || 6430 Linkage == GVA_CXXInline || Linkage == GVA_TemplateInstantiation) 6431 return false; 6432 return true; 6433 } 6434 6435 const VarDecl *VD = cast<VarDecl>(D); 6436 assert(VD->isFileVarDecl() && "Expected file scoped var"); 6437 6438 if (VD->isThisDeclarationADefinition() == VarDecl::DeclarationOnly) 6439 return false; 6440 6441 // Structs that have non-trivial constructors or destructors are required. 6442 6443 // FIXME: Handle references. 6444 // FIXME: Be more selective about which constructors we care about. 6445 if (const RecordType *RT = VD->getType()->getAs<RecordType>()) { 6446 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) { 6447 if (RD->hasDefinition() && !(RD->hasTrivialDefaultConstructor() && 6448 RD->hasTrivialCopyConstructor() && 6449 RD->hasTrivialMoveConstructor() && 6450 RD->hasTrivialDestructor())) 6451 return true; 6452 } 6453 } 6454 6455 GVALinkage L = GetGVALinkageForVariable(VD); 6456 if (L == GVA_Internal || L == GVA_TemplateInstantiation) { 6457 if (!(VD->getInit() && VD->getInit()->HasSideEffects(*this))) 6458 return false; 6459 } 6460 6461 return true; 6462 } 6463 6464 CallingConv ASTContext::getDefaultMethodCallConv() { 6465 // Pass through to the C++ ABI object 6466 return ABI->getDefaultMethodCallConv(); 6467 } 6468 6469 bool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const { 6470 // Pass through to the C++ ABI object 6471 return ABI->isNearlyEmpty(RD); 6472 } 6473 6474 MangleContext *ASTContext::createMangleContext() { 6475 switch (Target.getCXXABI()) { 6476 case CXXABI_ARM: 6477 case CXXABI_Itanium: 6478 return createItaniumMangleContext(*this, getDiagnostics()); 6479 case CXXABI_Microsoft: 6480 return createMicrosoftMangleContext(*this, getDiagnostics()); 6481 } 6482 assert(0 && "Unsupported ABI"); 6483 return 0; 6484 } 6485 6486 CXXABI::~CXXABI() {} 6487 6488 size_t ASTContext::getSideTableAllocatedMemory() const { 6489 size_t bytes = 0; 6490 bytes += ASTRecordLayouts.getMemorySize(); 6491 bytes += ObjCLayouts.getMemorySize(); 6492 bytes += KeyFunctions.getMemorySize(); 6493 bytes += ObjCImpls.getMemorySize(); 6494 bytes += BlockVarCopyInits.getMemorySize(); 6495 bytes += DeclAttrs.getMemorySize(); 6496 bytes += InstantiatedFromStaticDataMember.getMemorySize(); 6497 bytes += InstantiatedFromUsingDecl.getMemorySize(); 6498 bytes += InstantiatedFromUsingShadowDecl.getMemorySize(); 6499 bytes += InstantiatedFromUnnamedFieldDecl.getMemorySize(); 6500 return bytes; 6501 } 6502