diff options
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGCXX.cpp | 7 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGClass.cpp | 22 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 11 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 16 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGRTTI.cpp | 25 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGRecordLayoutBuilder.cpp | 14 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenTypes.cpp | 12 | ||||
-rw-r--r-- | clang/lib/CodeGen/MicrosoftCXXABI.cpp | 5 | ||||
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 40 |
9 files changed, 62 insertions, 90 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp index 29222089a20..ef29af7e070 100644 --- a/clang/lib/CodeGen/CGCXX.cpp +++ b/clang/lib/CodeGen/CGCXX.cpp @@ -62,15 +62,14 @@ bool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) { // Try to find a unique base class with a non-trivial destructor. const CXXRecordDecl *UniqueBase = 0; - for (CXXRecordDecl::base_class_const_iterator I = Class->bases_begin(), - E = Class->bases_end(); I != E; ++I) { + for (const auto &I : Class->bases()) { // We're in the base destructor, so skip virtual bases. - if (I->isVirtual()) continue; + if (I.isVirtual()) continue; // Skip base classes with trivial destructors. const CXXRecordDecl *Base - = cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); + = cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl()); if (Base->hasTrivialDestructor()) continue; // If we've already found a base class with a non-trivial diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index 6bb3af20382..bc38a977af7 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -1200,14 +1200,12 @@ HasTrivialDestructorBody(ASTContext &Context, return false; // Check non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator I = - BaseClassDecl->bases_begin(), E = BaseClassDecl->bases_end(); - I != E; ++I) { - if (I->isVirtual()) + for (const auto &I : BaseClassDecl->bases()) { + if (I.isVirtual()) continue; const CXXRecordDecl *NonVirtualBase = - cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl()); + cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl()); if (!HasTrivialDestructorBody(Context, NonVirtualBase, MostDerivedClassDecl)) return false; @@ -1484,10 +1482,7 @@ void CodeGenFunction::EnterDtorCleanups(const CXXDestructorDecl *DD, assert(DtorType == Dtor_Base); // Destroy non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator I = - ClassDecl->bases_begin(), E = ClassDecl->bases_end(); I != E; ++I) { - const CXXBaseSpecifier &Base = *I; - + for (const auto &Base : ClassDecl->bases()) { // Ignore virtual bases. if (Base.isVirtual()) continue; @@ -1933,10 +1928,9 @@ CodeGenFunction::InitializeVTablePointers(BaseSubobject Base, const CXXRecordDecl *RD = Base.getBase(); // Traverse bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { + for (const auto &I : RD->bases()) { CXXRecordDecl *BaseDecl - = cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); + = cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl()); // Ignore classes without a vtable. if (!BaseDecl->isDynamicClass()) @@ -1946,7 +1940,7 @@ CodeGenFunction::InitializeVTablePointers(BaseSubobject Base, CharUnits BaseOffsetFromNearestVBase; bool BaseDeclIsNonVirtualPrimaryBase; - if (I->isVirtual()) { + if (I.isVirtual()) { // Check if we've visited this virtual base before. if (!VBases.insert(BaseDecl)) continue; @@ -1967,7 +1961,7 @@ CodeGenFunction::InitializeVTablePointers(BaseSubobject Base, } InitializeVTablePointers(BaseSubobject(BaseDecl, BaseOffset), - I->isVirtual() ? BaseDecl : NearestVBase, + I.isVirtual() ? BaseDecl : NearestVBase, BaseOffsetFromNearestVBase, BaseDeclIsNonVirtualPrimaryBase, VTableClass, VBases); diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 97c947097ac..ebca5f8f108 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1172,15 +1172,14 @@ CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, llvm::DIType RecordTy) { const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); - for (CXXRecordDecl::base_class_const_iterator BI = RD->bases_begin(), - BE = RD->bases_end(); BI != BE; ++BI) { + for (const auto &BI : RD->bases()) { unsigned BFlags = 0; uint64_t BaseOffset; const CXXRecordDecl *Base = - cast<CXXRecordDecl>(BI->getType()->getAs<RecordType>()->getDecl()); + cast<CXXRecordDecl>(BI.getType()->getAs<RecordType>()->getDecl()); - if (BI->isVirtual()) { + if (BI.isVirtual()) { // virtual base offset offset is -ve. The code generator emits dwarf // expression where it expects +ve number. BaseOffset = @@ -1192,7 +1191,7 @@ CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, // FIXME: Inconsistent units for BaseOffset. It is in bytes when // BI->isVirtual() and bits when not. - AccessSpecifier Access = BI->getAccessSpecifier(); + AccessSpecifier Access = BI.getAccessSpecifier(); if (Access == clang::AS_private) BFlags |= llvm::DIDescriptor::FlagPrivate; else if (Access == clang::AS_protected) @@ -1200,7 +1199,7 @@ CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit, llvm::DIType DTy = DBuilder.createInheritance(RecordTy, - getOrCreateType(BI->getType(), Unit), + getOrCreateType(BI.getType(), Unit), BaseOffset, BFlags); EltTys.push_back(DTy); } diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index 2df5de06449..34aa3018fca 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -1268,15 +1268,14 @@ FillInNullDataMemberPointers(CodeGenModule &CGM, QualType T, const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD); // Go through all bases and fill in any null pointer to data members. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - if (I->isVirtual()) { + for (const auto &I : RD->bases()) { + if (I.isVirtual()) { // Ignore virtual bases. continue; } const CXXRecordDecl *BaseDecl = - cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); + cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl()); // Ignore empty bases. if (BaseDecl->isEmpty()) @@ -1288,7 +1287,7 @@ FillInNullDataMemberPointers(CodeGenModule &CGM, QualType T, uint64_t BaseOffset = CGM.getContext().toBits(Layout.getBaseClassOffset(BaseDecl)); - FillInNullDataMemberPointers(CGM, I->getType(), + FillInNullDataMemberPointers(CGM, I.getType(), Elements, StartOffset + BaseOffset); } @@ -1338,16 +1337,15 @@ static llvm::Constant *EmitNullConstant(CodeGenModule &CGM, std::vector<llvm::Constant *> elements(numElements); // Fill in all the bases. - for (CXXRecordDecl::base_class_const_iterator - I = record->bases_begin(), E = record->bases_end(); I != E; ++I) { - if (I->isVirtual()) { + for (const auto &I : record->bases()) { + if (I.isVirtual()) { // Ignore virtual bases; if we're laying out for a complete // object, we'll lay these out later. continue; } const CXXRecordDecl *base = - cast<CXXRecordDecl>(I->getType()->castAs<RecordType>()->getDecl()); + cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl()); // Ignore empty bases. if (base->isEmpty()) diff --git a/clang/lib/CodeGen/CGRTTI.cpp b/clang/lib/CodeGen/CGRTTI.cpp index 8851209d08b..e398cd47fd0 100644 --- a/clang/lib/CodeGen/CGRTTI.cpp +++ b/clang/lib/CodeGen/CGRTTI.cpp @@ -763,9 +763,8 @@ static unsigned ComputeVMIClassTypeInfoFlags(const CXXBaseSpecifier *Base, } // Walk all bases. - for (CXXRecordDecl::base_class_const_iterator I = BaseDecl->bases_begin(), - E = BaseDecl->bases_end(); I != E; ++I) - Flags |= ComputeVMIClassTypeInfoFlags(I, Bases); + for (const auto &I : BaseDecl->bases()) + Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases); return Flags; } @@ -775,9 +774,8 @@ static unsigned ComputeVMIClassTypeInfoFlags(const CXXRecordDecl *RD) { SeenBases Bases; // Walk all bases. - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) - Flags |= ComputeVMIClassTypeInfoFlags(I, Bases); + for (const auto &I : RD->bases()) + Flags |= ComputeVMIClassTypeInfoFlags(&I, Bases); return Flags; } @@ -824,15 +822,12 @@ void RTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { // __offset_shift = 8 // }; // }; - for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), - E = RD->bases_end(); I != E; ++I) { - const CXXBaseSpecifier *Base = I; - + for (const auto &Base : RD->bases()) { // The __base_type member points to the RTTI for the base type. - Fields.push_back(RTTIBuilder(CGM).BuildTypeInfo(Base->getType())); + Fields.push_back(RTTIBuilder(CGM).BuildTypeInfo(Base.getType())); const CXXRecordDecl *BaseDecl = - cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); + cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl()); int64_t OffsetFlags = 0; @@ -841,7 +836,7 @@ void RTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { // subobject. For a virtual base, this is the offset in the virtual table of // the virtual base offset for the virtual base referenced (negative). CharUnits Offset; - if (Base->isVirtual()) + if (Base.isVirtual()) Offset = CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl); else { @@ -853,9 +848,9 @@ void RTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) { // The low-order byte of __offset_flags contains flags, as given by the // masks from the enumeration __offset_flags_masks. - if (Base->isVirtual()) + if (Base.isVirtual()) OffsetFlags |= BCTI_Virtual; - if (Base->getAccessSpecifier() == AS_public) + if (Base.getAccessSpecifier() == AS_public) OffsetFlags |= BCTI_Public; Fields.push_back(llvm::ConstantInt::get(LongLTy, OffsetFlags)); diff --git a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp index 888b07fea7d..985ade22e4b 100644 --- a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -419,12 +419,10 @@ void CGRecordLowering::accumulateBases() { CharUnits::Zero(), getStorageType(Layout.getPrimaryBase()))); // Accumulate the non-virtual bases. - for (CXXRecordDecl::base_class_const_iterator Base = RD->bases_begin(), - BaseEnd = RD->bases_end(); - Base != BaseEnd; ++Base) { - if (Base->isVirtual()) + for (const auto &Base : RD->bases()) { + if (Base.isVirtual()) continue; - const CXXRecordDecl *BaseDecl = Base->getType()->getAsCXXRecordDecl(); + const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl(); if (!BaseDecl->isEmpty()) Members.push_back(MemberInfo(Layout.getBaseClassOffset(BaseDecl), MemberInfo::Base, getStorageType(BaseDecl), BaseDecl)); @@ -472,10 +470,8 @@ bool CGRecordLowering::hasOwnStorage(const CXXRecordDecl *Decl, const ASTRecordLayout &DeclLayout = Context.getASTRecordLayout(Decl); if (DeclLayout.isPrimaryBaseVirtual() && DeclLayout.getPrimaryBase() == Query) return false; - for (CXXRecordDecl::base_class_const_iterator Base = Decl->bases_begin(), - BaseEnd = Decl->bases_end(); - Base != BaseEnd; ++Base) - if (!hasOwnStorage(Base->getType()->getAsCXXRecordDecl(), Query)) + for (const auto &Base : Decl->bases()) + if (!hasOwnStorage(Base.getType()->getAsCXXRecordDecl(), Query)) return false; return true; } diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp index 36fd95db08e..b7f37462a64 100644 --- a/clang/lib/CodeGen/CodeGenTypes.cpp +++ b/clang/lib/CodeGen/CodeGenTypes.cpp @@ -131,9 +131,8 @@ isSafeToConvert(const RecordDecl *RD, CodeGenTypes &CGT, // when a class is translated, even though they aren't embedded by-value into // the class. if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) { - for (CXXRecordDecl::base_class_const_iterator I = CRD->bases_begin(), - E = CRD->bases_end(); I != E; ++I) - if (!isSafeToConvert(I->getType()->getAs<RecordType>()->getDecl(), + for (const auto &I : CRD->bases()) + if (!isSafeToConvert(I.getType()->getAs<RecordType>()->getDecl(), CGT, AlreadyChecked)) return false; } @@ -650,11 +649,10 @@ llvm::StructType *CodeGenTypes::ConvertRecordDeclType(const RecordDecl *RD) { // Force conversion of non-virtual base classes recursively. if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) { - for (CXXRecordDecl::base_class_const_iterator i = CRD->bases_begin(), - e = CRD->bases_end(); i != e; ++i) { - if (i->isVirtual()) continue; + for (const auto &I : CRD->bases()) { + if (I.isVirtual()) continue; - ConvertRecordDeclType(i->getType()->getAs<RecordType>()->getDecl()); + ConvertRecordDeclType(I.getType()->getAs<RecordType>()->getDecl()); } } diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 22a7cafd256..66774e52caa 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -634,9 +634,8 @@ llvm::Value *MicrosoftCXXABI::adjustThisArgumentForVirtualCall( AvoidVirtualOffset = true; } else { // Let's see if we try to call a destructor of a non-virtual base. - for (CXXRecordDecl::base_class_const_iterator I = CurRD->bases_begin(), - E = CurRD->bases_end(); I != E; ++I) { - if (I->getType()->getAsCXXRecordDecl() != MD->getParent()) + for (const auto &I : CurRD->bases()) { + if (I.getType()->getAsCXXRecordDecl() != MD->getParent()) continue; // If we call a base destructor for a non-virtual base, we statically // know where it expects the vfptr and "this" to be. diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index b0eccd7a17e..f013fcfb211 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -209,9 +209,8 @@ static bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays) { // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) - for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), - e = CXXRD->bases_end(); i != e; ++i) - if (!isEmptyRecord(Context, i->getType(), true)) + for (const auto &I : CXXRD->bases()) + if (!isEmptyRecord(Context, I.getType(), true)) return false; for (const auto *I : RD->fields()) @@ -241,10 +240,9 @@ static const Type *isSingleElementStruct(QualType T, ASTContext &Context) { // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { - for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), - e = CXXRD->bases_end(); i != e; ++i) { + for (const auto &I : CXXRD->bases()) { // Ignore empty records. - if (isEmptyRecord(Context, i->getType(), true)) + if (isEmptyRecord(Context, I.getType(), true)) continue; // If we already found an element then this isn't a single-element struct. @@ -253,7 +251,7 @@ static const Type *isSingleElementStruct(QualType T, ASTContext &Context) { // If this is non-empty and not a single element struct, the composite // cannot be a single element struct. - Found = isSingleElementStruct(i->getType(), Context); + Found = isSingleElementStruct(I.getType(), Context); if (!Found) return 0; } @@ -782,9 +780,8 @@ static bool isRecordWithSSEVectorType(ASTContext &Context, QualType Ty) { // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) - for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), - e = CXXRD->bases_end(); i != e; ++i) - if (!isRecordWithSSEVectorType(Context, i->getType())) + for (const auto &I : CXXRD->bases()) + if (!isRecordWithSSEVectorType(Context, I.getType())) return false; for (const auto *i : RD->fields()) { @@ -1739,12 +1736,11 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, // If this is a C++ record, classify the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { - for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), - e = CXXRD->bases_end(); i != e; ++i) { - assert(!i->isVirtual() && !i->getType()->isDependentType() && + for (const auto &I : CXXRD->bases()) { + assert(!I.isVirtual() && !I.getType()->isDependentType() && "Unexpected base class!"); const CXXRecordDecl *Base = - cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); + cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl()); // Classify this field. // @@ -1754,7 +1750,7 @@ void X86_64ABIInfo::classify(QualType Ty, uint64_t OffsetBase, Class FieldLo, FieldHi; uint64_t Offset = OffsetBase + getContext().toBits(Layout.getBaseClassOffset(Base)); - classify(i->getType(), Offset, FieldLo, FieldHi, isNamedArg); + classify(I.getType(), Offset, FieldLo, FieldHi, isNamedArg); Lo = merge(Lo, FieldLo); Hi = merge(Hi, FieldHi); if (Lo == Memory || Hi == Memory) @@ -1984,19 +1980,18 @@ static bool BitsContainNoUserData(QualType Ty, unsigned StartBit, // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) { - for (CXXRecordDecl::base_class_const_iterator i = CXXRD->bases_begin(), - e = CXXRD->bases_end(); i != e; ++i) { - assert(!i->isVirtual() && !i->getType()->isDependentType() && + for (const auto &I : CXXRD->bases()) { + assert(!I.isVirtual() && !I.getType()->isDependentType() && "Unexpected base class!"); const CXXRecordDecl *Base = - cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); + cast<CXXRecordDecl>(I.getType()->getAs<RecordType>()->getDecl()); // If the base is after the span we care about, ignore it. unsigned BaseOffset = Context.toBits(Layout.getBaseClassOffset(Base)); if (BaseOffset >= EndBit) continue; unsigned BaseStart = BaseOffset < StartBit ? StartBit-BaseOffset :0; - if (!BitsContainNoUserData(i->getType(), BaseStart, + if (!BitsContainNoUserData(I.getType(), BaseStart, EndBit-BaseOffset, Context)) return false; } @@ -4582,9 +4577,8 @@ bool SystemZABIInfo::isFPArgumentType(QualType Ty) const { // If this is a C++ record, check the bases first. if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD)) - for (CXXRecordDecl::base_class_const_iterator I = CXXRD->bases_begin(), - E = CXXRD->bases_end(); I != E; ++I) { - QualType Base = I->getType(); + for (const auto &I : CXXRD->bases()) { + QualType Base = I.getType(); // Empty bases don't affect things either way. if (isEmptyRecord(getContext(), Base, true)) |