diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-04-14 21:55:33 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-04-14 21:55:33 +0000 |
commit | 17fc223395d51be582fc666bb6ea21bd1dff26dc (patch) | |
tree | d60009defec4b31deb1dbff99b49f1695a7cef72 /lib/Frontend/PCHReader.cpp | |
parent | e40c295d017a8f75a945fe9ed2aa9d8bb7a7341a (diff) |
Add PCH support for PredefinedExpr and FloatingLiteral expressions
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69084 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 909ecdb100..bc754cb845 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -226,8 +226,10 @@ namespace { : Reader(Reader), Record(Record), Idx(Idx) { } void VisitExpr(Expr *E); + void VisitPredefinedExpr(PredefinedExpr *E); void VisitDeclRefExpr(DeclRefExpr *E); void VisitIntegerLiteral(IntegerLiteral *E); + void VisitFloatingLiteral(FloatingLiteral *E); void VisitCharacterLiteral(CharacterLiteral *E); }; } @@ -238,6 +240,12 @@ void PCHStmtReader::VisitExpr(Expr *E) { E->setValueDependent(Record[Idx++]); } +void PCHStmtReader::VisitPredefinedExpr(PredefinedExpr *E) { + VisitExpr(E); + E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++])); + E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]); +} + void PCHStmtReader::VisitDeclRefExpr(DeclRefExpr *E) { VisitExpr(E); E->setDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++]))); @@ -250,6 +258,13 @@ void PCHStmtReader::VisitIntegerLiteral(IntegerLiteral *E) { E->setValue(Reader.ReadAPInt(Record, Idx)); } +void PCHStmtReader::VisitFloatingLiteral(FloatingLiteral *E) { + VisitExpr(E); + E->setValue(Reader.ReadAPFloat(Record, Idx)); + E->setExact(Record[Idx++]); + E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++])); +} + void PCHStmtReader::VisitCharacterLiteral(CharacterLiteral *E) { VisitExpr(E); E->setValue(Record[Idx++]); @@ -1484,6 +1499,12 @@ llvm::APSInt PCHReader::ReadAPSInt(const RecordData &Record, unsigned &Idx) { return llvm::APSInt(ReadAPInt(Record, Idx), isUnsigned); } +/// \brief Read a floating-point value +llvm::APFloat PCHReader::ReadAPFloat(const RecordData &Record, unsigned &Idx) { + // FIXME: is this really correct? + return llvm::APFloat(ReadAPInt(Record, Idx)); +} + Expr *PCHReader::ReadExpr() { RecordData Record; unsigned Code = Stream.ReadCode(); @@ -1497,6 +1518,11 @@ Expr *PCHReader::ReadExpr() { E = 0; break; + case pch::EXPR_PREDEFINED: + // FIXME: untested (until we can serialize function bodies). + E = new (Context) PredefinedExpr(Empty); + break; + case pch::EXPR_DECL_REF: E = new (Context) DeclRefExpr(Empty); break; @@ -1505,12 +1531,12 @@ Expr *PCHReader::ReadExpr() { E = new (Context) IntegerLiteral(Empty); break; - case pch::EXPR_CHARACTER_LITERAL: - E = new (Context) CharacterLiteral(Empty); + case pch::EXPR_FLOATING_LITERAL: + E = new (Context) FloatingLiteral(Empty); break; - default: - assert(false && "Unhandled expression kind"); + case pch::EXPR_CHARACTER_LITERAL: + E = new (Context) CharacterLiteral(Empty); break; } |