diff options
| author | Bruno Ricci <riccibrun@gmail.com> | 2019-01-26 14:15:10 +0000 |
|---|---|---|
| committer | Bruno Ricci <riccibrun@gmail.com> | 2019-01-26 14:15:10 +0000 |
| commit | db07683d866bdd0c1d2b651066081b64f9563333 (patch) | |
| tree | c517e7da654ba9c1951395b5a8415229f4daff58 /clang/lib/AST/Expr.cpp | |
| parent | 94498c70ae44d51835f4a7110877ed77c48251b2 (diff) | |
| download | bcm5719-llvm-db07683d866bdd0c1d2b651066081b64f9563333.tar.gz bcm5719-llvm-db07683d866bdd0c1d2b651066081b64f9563333.zip | |
[AST] Pack GenericSelectionExpr
Store the controlling expression, the association expressions and the
corresponding TypeSourceInfos as trailing objects.
Additionally use the bit-fields of Stmt to store one SourceLocation,
saving one additional pointer. This saves 3 pointers in total per
GenericSelectionExpr.
Differential Revision: https://reviews.llvm.org/D57104
Reviewed By: aaron.ballman
Reviewers: aaron.ballman, steveire
llvm-svn: 352276
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 66 |
1 files changed, 53 insertions, 13 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 481b6a860f3..2948acd3b5e 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -3775,7 +3775,7 @@ void ShuffleVectorExpr::setExprs(const ASTContext &C, ArrayRef<Expr *> Exprs) { } GenericSelectionExpr::GenericSelectionExpr( - const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, + const ASTContext &, SourceLocation GenericLoc, Expr *ControllingExpr, ArrayRef<TypeSourceInfo *> AssocTypes, ArrayRef<Expr *> AssocExprs, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool ContainsUnexpandedParameterPack, unsigned ResultIndex) @@ -3787,18 +3787,18 @@ GenericSelectionExpr::GenericSelectionExpr( AssocExprs[ResultIndex]->isInstantiationDependent(), ContainsUnexpandedParameterPack), NumAssocs(AssocExprs.size()), ResultIndex(ResultIndex), - AssocTypes(new (Context) TypeSourceInfo *[AssocTypes.size()]), - SubExprs(new (Context) Stmt *[AssocExprStartIndex + AssocExprs.size()]), - GenericLoc(GenericLoc), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) { + DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) { assert(AssocTypes.size() == AssocExprs.size() && "Must have the same number of association expressions" " and TypeSourceInfo!"); assert(ResultIndex < NumAssocs && "ResultIndex is out-of-bounds!"); - SubExprs[ControllingIndex] = ControllingExpr; - std::copy(AssocTypes.begin(), AssocTypes.end(), this->AssocTypes); + GenericSelectionExprBits.GenericLoc = GenericLoc; + getTrailingObjects<Stmt *>()[ControllingIndex] = ControllingExpr; std::copy(AssocExprs.begin(), AssocExprs.end(), - SubExprs + AssocExprStartIndex); + getTrailingObjects<Stmt *>() + AssocExprStartIndex); + std::copy(AssocTypes.begin(), AssocTypes.end(), + getTrailingObjects<TypeSourceInfo *>()); } GenericSelectionExpr::GenericSelectionExpr( @@ -3812,17 +3812,57 @@ GenericSelectionExpr::GenericSelectionExpr( /*isValueDependent=*/true, /*isInstantiationDependent=*/true, ContainsUnexpandedParameterPack), NumAssocs(AssocExprs.size()), ResultIndex(ResultDependentIndex), - AssocTypes(new (Context) TypeSourceInfo *[AssocTypes.size()]), - SubExprs(new (Context) Stmt *[AssocExprStartIndex + AssocExprs.size()]), - GenericLoc(GenericLoc), DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) { + DefaultLoc(DefaultLoc), RParenLoc(RParenLoc) { assert(AssocTypes.size() == AssocExprs.size() && "Must have the same number of association expressions" " and TypeSourceInfo!"); - SubExprs[ControllingIndex] = ControllingExpr; - std::copy(AssocTypes.begin(), AssocTypes.end(), this->AssocTypes); + GenericSelectionExprBits.GenericLoc = GenericLoc; + getTrailingObjects<Stmt *>()[ControllingIndex] = ControllingExpr; std::copy(AssocExprs.begin(), AssocExprs.end(), - SubExprs + AssocExprStartIndex); + getTrailingObjects<Stmt *>() + AssocExprStartIndex); + std::copy(AssocTypes.begin(), AssocTypes.end(), + getTrailingObjects<TypeSourceInfo *>()); +} + +GenericSelectionExpr::GenericSelectionExpr(EmptyShell Empty, unsigned NumAssocs) + : Expr(GenericSelectionExprClass, Empty), NumAssocs(NumAssocs) {} + +GenericSelectionExpr *GenericSelectionExpr::Create( + const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, + ArrayRef<TypeSourceInfo *> AssocTypes, ArrayRef<Expr *> AssocExprs, + SourceLocation DefaultLoc, SourceLocation RParenLoc, + bool ContainsUnexpandedParameterPack, unsigned ResultIndex) { + unsigned NumAssocs = AssocExprs.size(); + void *Mem = Context.Allocate( + totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs), + alignof(GenericSelectionExpr)); + return new (Mem) GenericSelectionExpr( + Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc, + RParenLoc, ContainsUnexpandedParameterPack, ResultIndex); +} + +GenericSelectionExpr *GenericSelectionExpr::Create( + const ASTContext &Context, SourceLocation GenericLoc, Expr *ControllingExpr, + ArrayRef<TypeSourceInfo *> AssocTypes, ArrayRef<Expr *> AssocExprs, + SourceLocation DefaultLoc, SourceLocation RParenLoc, + bool ContainsUnexpandedParameterPack) { + unsigned NumAssocs = AssocExprs.size(); + void *Mem = Context.Allocate( + totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs), + alignof(GenericSelectionExpr)); + return new (Mem) GenericSelectionExpr( + Context, GenericLoc, ControllingExpr, AssocTypes, AssocExprs, DefaultLoc, + RParenLoc, ContainsUnexpandedParameterPack); +} + +GenericSelectionExpr * +GenericSelectionExpr::CreateEmpty(const ASTContext &Context, + unsigned NumAssocs) { + void *Mem = Context.Allocate( + totalSizeToAlloc<Stmt *, TypeSourceInfo *>(1 + NumAssocs, NumAssocs), + alignof(GenericSelectionExpr)); + return new (Mem) GenericSelectionExpr(EmptyShell(), NumAssocs); } //===----------------------------------------------------------------------===// |

