diff options
author | Bruno Ricci <riccibrun@gmail.com> | 2018-12-22 14:39:30 +0000 |
---|---|---|
committer | Bruno Ricci <riccibrun@gmail.com> | 2018-12-22 14:39:30 +0000 |
commit | ddb8f6b83a3fa46c69b9044ad56849b180647e0d (patch) | |
tree | 46d93792ec03efa2578371efa3e3b13e4f1bdd24 /clang/lib/Serialization | |
parent | 58d38230867528b2cc376a99c2147c89c7af6fcb (diff) | |
download | bcm5719-llvm-ddb8f6b83a3fa46c69b9044ad56849b180647e0d.tar.gz bcm5719-llvm-ddb8f6b83a3fa46c69b9044ad56849b180647e0d.zip |
[AST] Store the arguments of CXXConstructExpr in a trailing array
Store the arguments of CXXConstructExpr in a trailing array. This is very
similar to the CallExpr case in D55771, with the exception that there is
only one derived class (CXXTemporaryObjectExpr) and that we compute the
offset to the trailing array instead of storing it.
This saves one pointer per CXXConstructExpr and CXXTemporaryObjectExpr.
Reviewed By: rjmccall
Differential Revision: https://reviews.llvm.org/D56022
llvm-svn: 350003
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r-- | clang/lib/Serialization/ASTReaderStmt.cpp | 38 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriterStmt.cpp | 11 |
2 files changed, 29 insertions, 20 deletions
diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 3b5ff78698e..83b4fcd1d9a 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -1353,20 +1353,22 @@ void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) { VisitExpr(E); - E->NumArgs = Record.readInt(); - if (E->NumArgs) - E->Args = new (Record.getContext()) Stmt*[E->NumArgs]; - for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) - E->setArg(I, Record.readSubExpr()); - E->setConstructor(ReadDeclAs<CXXConstructorDecl>()); - E->setLocation(ReadSourceLocation()); - E->setElidable(Record.readInt()); - E->setHadMultipleCandidates(Record.readInt()); - E->setListInitialization(Record.readInt()); - E->setStdInitListInitialization(Record.readInt()); - E->setRequiresZeroInitialization(Record.readInt()); - E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record.readInt()); + + unsigned NumArgs = Record.readInt(); + assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!"); + + E->CXXConstructExprBits.Elidable = Record.readInt(); + E->CXXConstructExprBits.HadMultipleCandidates = Record.readInt(); + E->CXXConstructExprBits.ListInitialization = Record.readInt(); + E->CXXConstructExprBits.StdInitListInitialization = Record.readInt(); + E->CXXConstructExprBits.ZeroInitialization = Record.readInt(); + E->CXXConstructExprBits.ConstructionKind = Record.readInt(); + E->CXXConstructExprBits.Loc = ReadSourceLocation(); + E->Constructor = ReadDeclAs<CXXConstructorDecl>(); E->ParenOrBraceRange = ReadSourceRange(); + + for (unsigned I = 0; I != NumArgs; ++I) + E->setArg(I, Record.readSubExpr()); } void ASTStmtReader::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) { @@ -1379,7 +1381,7 @@ void ASTStmtReader::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) { void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) { VisitCXXConstructExpr(E); - E->Type = GetTypeSourceInfo(); + E->TSI = GetTypeSourceInfo(); } void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) { @@ -3082,7 +3084,9 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) { break; case EXPR_CXX_CONSTRUCT: - S = new (Context) CXXConstructExpr(Empty); + S = CXXConstructExpr::CreateEmpty( + Context, + /* NumArgs=*/Record[ASTStmtReader::NumExprFields]); break; case EXPR_CXX_INHERITED_CTOR_INIT: @@ -3090,7 +3094,9 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) { break; case EXPR_CXX_TEMPORARY_OBJECT: - S = new (Context) CXXTemporaryObjectExpr(Empty); + S = CXXTemporaryObjectExpr::CreateEmpty( + Context, + /* NumArgs=*/Record[ASTStmtReader::NumExprFields]); break; case EXPR_CXX_STATIC_CAST: diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index c7527aa38bc..f0e1e10b5eb 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -1315,18 +1315,21 @@ void ASTStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { void ASTStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) { VisitExpr(E); + Record.push_back(E->getNumArgs()); - for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) - Record.AddStmt(E->getArg(I)); - Record.AddDeclRef(E->getConstructor()); - Record.AddSourceLocation(E->getLocation()); Record.push_back(E->isElidable()); Record.push_back(E->hadMultipleCandidates()); Record.push_back(E->isListInitialization()); Record.push_back(E->isStdInitListInitialization()); Record.push_back(E->requiresZeroInitialization()); Record.push_back(E->getConstructionKind()); // FIXME: stable encoding + Record.AddSourceLocation(E->getLocation()); + Record.AddDeclRef(E->getConstructor()); Record.AddSourceRange(E->getParenOrBraceRange()); + + for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) + Record.AddStmt(E->getArg(I)); + Code = serialization::EXPR_CXX_CONSTRUCT; } |