diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-04-15 15:58:59 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-04-15 15:58:59 +0000 |
commit | 0b0b77fa29c74c99a77548ed86ca8a04f7cf6b02 (patch) | |
tree | 25046d03628517965ba7ad3ba2c9f2a1371e31c2 /lib/Frontend | |
parent | 95d4e5d2f87a0f07fb143ccb824dfc4c5c595c78 (diff) |
PCH support for UnaryOperator, SizeOfAlignOfExpr
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69169 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 32 | ||||
-rw-r--r-- | lib/Frontend/PCHWriter.cpp | 24 |
2 files changed, 56 insertions, 0 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index ad3c2e55a9..96c383b49f 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -238,6 +238,8 @@ namespace { unsigned VisitFloatingLiteral(FloatingLiteral *E); unsigned VisitCharacterLiteral(CharacterLiteral *E); unsigned VisitParenExpr(ParenExpr *E); + unsigned VisitUnaryOperator(UnaryOperator *E); + unsigned VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); unsigned VisitCastExpr(CastExpr *E); unsigned VisitBinaryOperator(BinaryOperator *E); unsigned VisitImplicitCastExpr(ImplicitCastExpr *E); @@ -298,6 +300,28 @@ unsigned PCHStmtReader::VisitParenExpr(ParenExpr *E) { return 1; } +unsigned PCHStmtReader::VisitUnaryOperator(UnaryOperator *E) { + VisitExpr(E); + E->setSubExpr(ExprStack.back()); + E->setOpcode((UnaryOperator::Opcode)Record[Idx++]); + E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); + return 1; +} + +unsigned PCHStmtReader::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { + VisitExpr(E); + E->setSizeof(Record[Idx++]); + if (Record[Idx] == 0) { + E->setArgument(ExprStack.back()); + ++Idx; + } else { + E->setArgument(Reader.GetType(Record[Idx++])); + } + E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); + E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); + return E->isArgumentType()? 0 : 1; +} + unsigned PCHStmtReader::VisitCastExpr(CastExpr *E) { VisitExpr(E); E->setSubExpr(ExprStack.back()); @@ -1640,6 +1664,14 @@ Expr *PCHReader::ReadExpr() { E = new (Context) ParenExpr(Empty); break; + case pch::EXPR_UNARY_OPERATOR: + E = new (Context) UnaryOperator(Empty); + break; + + case pch::EXPR_SIZEOF_ALIGN_OF: + E = new (Context) SizeOfAlignOfExpr(Empty); + break; + case pch::EXPR_BINARY_OPERATOR: E = new (Context) BinaryOperator(Empty); break; diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 1dcf9d651f..dc23fb9d81 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -450,6 +450,8 @@ namespace { void VisitFloatingLiteral(FloatingLiteral *E); void VisitCharacterLiteral(CharacterLiteral *E); void VisitParenExpr(ParenExpr *E); + void VisitUnaryOperator(UnaryOperator *E); + void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); void VisitCastExpr(CastExpr *E); void VisitBinaryOperator(BinaryOperator *E); void VisitImplicitCastExpr(ImplicitCastExpr *E); @@ -509,6 +511,28 @@ void PCHStmtWriter::VisitParenExpr(ParenExpr *E) { Code = pch::EXPR_PAREN; } +void PCHStmtWriter::VisitUnaryOperator(UnaryOperator *E) { + VisitExpr(E); + Writer.WriteSubExpr(E->getSubExpr()); + Record.push_back(E->getOpcode()); // FIXME: stable encoding + Writer.AddSourceLocation(E->getOperatorLoc(), Record); + Code = pch::EXPR_UNARY_OPERATOR; +} + +void PCHStmtWriter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { + VisitExpr(E); + Record.push_back(E->isSizeOf()); + if (E->isArgumentType()) + Writer.AddTypeRef(E->getArgumentType(), Record); + else { + Record.push_back(0); + Writer.WriteSubExpr(E->getArgumentExpr()); + } + Writer.AddSourceLocation(E->getOperatorLoc(), Record); + Writer.AddSourceLocation(E->getRParenLoc(), Record); + Code = pch::EXPR_SIZEOF_ALIGN_OF; +} + void PCHStmtWriter::VisitCastExpr(CastExpr *E) { VisitExpr(E); Writer.WriteSubExpr(E->getSubExpr()); |