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 | |
| 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')
| -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);  }  //===----------------------------------------------------------------------===//  | 

