llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Doug Wyatt (dougsonos) <details> <summary>Changes</summary> - Put new FunctionProtoType trailing objects last. - Inline FunctionEffectsRef::get() - Manually inline FunctionEffectsRef::Profile(). --- Full diff: https://github.com/llvm/llvm-project/pull/96844.diff 4 Files Affected: - (modified) clang/include/clang/AST/Type.h (+22-8) - (modified) clang/lib/AST/ASTContext.cpp (+6-5) - (modified) clang/lib/AST/Type.cpp (+12-25) - (modified) clang/lib/Sema/SemaType.cpp (+1) ``````````diff diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 62836ec5c6312..4545ad94d522a 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -132,7 +132,6 @@ class TemplateArgument; class TemplateArgumentListInfo; class TemplateArgumentLoc; class TemplateTypeParmDecl; -template <typename> class TreeTransform; class TypedefNameDecl; class UnresolvedUsingTypenameDecl; class UsingShadowDecl; @@ -4899,7 +4898,6 @@ class FunctionEffectsRef { return !(LHS == RHS); } - void Profile(llvm::FoldingSetNodeID &ID) const; void dump(llvm::raw_ostream &OS) const; }; @@ -4970,7 +4968,7 @@ class FunctionProtoType final FunctionType::FunctionTypeExtraBitfields, FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType, Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, - FunctionEffect, EffectConditionExpr, Qualifiers> { + Qualifiers, FunctionEffect, EffectConditionExpr> { friend class ASTContext; // ASTContext creates these. friend TrailingObjects; @@ -5001,21 +4999,21 @@ class FunctionProtoType final // an ExtParameterInfo for each of the parameters. Present if and // only if hasExtParameterInfos() is true. // + // * Optionally a Qualifiers object to represent extra qualifiers that can't + // be represented by FunctionTypeBitfields.FastTypeQuals. Present if and + // only if hasExtQualifiers() is true. + // // * Optionally, an array of getNumFunctionEffects() FunctionEffect. // Present only when getNumFunctionEffects() > 0 // // * Optionally, an array of getNumFunctionEffects() EffectConditionExpr. // Present only when getNumFunctionEffectConditions() > 0. // - // * Optionally a Qualifiers object to represent extra qualifiers that can't - // be represented by FunctionTypeBitfields.FastTypeQuals. Present if and - // only if hasExtQualifiers() is true. - // // The optional FunctionTypeExtraBitfields has to be before the data // related to the exception specification since it contains the number // of exception types. // - // We put the ExtParameterInfos last. If all were equal, it would make + // We put the ExtParameterInfos later. If all were equal, it would make // more sense to put these before the exception specification, because // it's much easier to skip past them compared to the elaborate switch // required to skip the exception specification. However, all is not @@ -5132,6 +5130,10 @@ class FunctionProtoType final return hasExtParameterInfos() ? getNumParams() : 0; } + unsigned numTrailingObjects(OverloadToken<Qualifiers>) const { + return hasExtQualifiers() ? 1 : 0; + } + unsigned numTrailingObjects(OverloadToken<FunctionEffect>) const { return getNumFunctionEffects(); } @@ -8619,6 +8621,18 @@ QualType DecayedType::getPointeeType() const { void FixedPointValueToString(SmallVectorImpl<char> &Str, llvm::APSInt Val, unsigned Scale); +inline FunctionEffectsRef FunctionEffectsRef::get(QualType QT) { + while (true) { + QualType Pointee = QT->getPointeeType(); + if (Pointee.isNull()) + break; + QT = Pointee; + } + if (const auto *FPT = QT->getAs<FunctionProtoType>()) + return FPT->getFunctionEffects(); + return {}; +} + } // namespace clang #endif // LLVM_CLANG_AST_TYPE_H diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 1b5d16bd176f3..b5519b3fc25a3 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -4601,14 +4601,15 @@ QualType ASTContext::getFunctionTypeInternal( size_t Size = FunctionProtoType::totalSizeToAlloc< QualType, SourceLocation, FunctionType::FunctionTypeExtraBitfields, FunctionType::FunctionTypeArmAttributes, FunctionType::ExceptionType, - Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, - FunctionEffect, EffectConditionExpr, Qualifiers>( + Expr *, FunctionDecl *, FunctionProtoType::ExtParameterInfo, Qualifiers, + FunctionEffect, EffectConditionExpr>( NumArgs, EPI.Variadic, EPI.requiresFunctionProtoTypeExtraBitfields(), EPI.requiresFunctionProtoTypeArmAttributes(), ESH.NumExceptionType, ESH.NumExprPtr, ESH.NumFunctionDeclPtr, - EPI.ExtParameterInfos ? NumArgs : 0, EPI.FunctionEffects.size(), - EPI.FunctionEffects.conditions().size(), - EPI.TypeQuals.hasNonFastQualifiers() ? 1 : 0); + EPI.ExtParameterInfos ? NumArgs : 0, + EPI.TypeQuals.hasNonFastQualifiers() ? 1 : 0, + EPI.FunctionEffects.size(), + EPI.FunctionEffects.conditions().size()); auto *FTP = (FunctionProtoType *)Allocate(Size, alignof(FunctionProtoType)); FunctionProtoType::ExtProtoInfo newEPI = EPI; diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index d8b885870de3a..466928bcb9c0d 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -3857,9 +3857,19 @@ void FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID, QualType Result, } epi.ExtInfo.Profile(ID); - ID.AddInteger((epi.AArch64SMEAttributes << 1) | epi.HasTrailingReturn); - epi.FunctionEffects.Profile(ID); + unsigned EffectCount = epi.FunctionEffects.size(); + bool HasConds = !epi.FunctionEffects.Conditions.empty(); + + ID.AddInteger( + (EffectCount << 3) | (HasConds << 2) | + (epi.AArch64SMEAttributes << 1) | epi.HasTrailingReturn); + + for (unsigned Idx = 0; Idx != EffectCount; ++Idx) { + ID.AddInteger(epi.FunctionEffects.Effects[Idx].toOpaqueInt32()); + if (HasConds) + ID.AddPointer(epi.FunctionEffects.Conditions[Idx].getCondition()); + } } void FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID, @@ -5219,17 +5229,6 @@ bool FunctionEffect::shouldDiagnoseFunctionCall( // ===== -void FunctionEffectsRef::Profile(llvm::FoldingSetNodeID &ID) const { - bool HasConds = !Conditions.empty(); - - ID.AddInteger(size() | (HasConds << 31u)); - for (unsigned Idx = 0, Count = Effects.size(); Idx != Count; ++Idx) { - ID.AddInteger(Effects[Idx].toOpaqueInt32()); - if (HasConds) - ID.AddPointer(Conditions[Idx].getCondition()); - } -} - bool FunctionEffectSet::insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs) { FunctionEffect::Kind NewOppositeKind = NewEC.Effect.oppositeKind(); @@ -5351,18 +5350,6 @@ LLVM_DUMP_METHOD void FunctionEffectSet::dump(llvm::raw_ostream &OS) const { FunctionEffectsRef(*this).dump(OS); } -FunctionEffectsRef FunctionEffectsRef::get(QualType QT) { - while (true) { - QualType Pointee = QT->getPointeeType(); - if (Pointee.isNull()) - break; - QT = Pointee; - } - if (const auto *FPT = QT->getAs<FunctionProtoType>()) - return FPT->getFunctionEffects(); - return {}; -} - FunctionEffectsRef FunctionEffectsRef::create(ArrayRef<FunctionEffect> FX, ArrayRef<EffectConditionExpr> Conds) { diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 426cd0aa91c01..e2063869d4042 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -7623,6 +7623,7 @@ handleNonBlockingNonAllocatingTypeAttr(TypeProcessingState &TPState, FunctionEffectSet FX(EPI.FunctionEffects); FunctionEffectSet::Conflicts Errs; bool Success = FX.insert(NewEC, Errs); + (void)Success; assert(Success && "effect conflicts should have been diagnosed above"); EPI.FunctionEffects = FunctionEffectsRef(FX); `````````` </details> https://github.com/llvm/llvm-project/pull/96844 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits