aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHReader.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-04-14 21:55:33 +0000
committerDouglas Gregor <dgregor@apple.com>2009-04-14 21:55:33 +0000
commit17fc223395d51be582fc666bb6ea21bd1dff26dc (patch)
treed60009defec4b31deb1dbff99b49f1695a7cef72 /lib/Frontend/PCHReader.cpp
parente40c295d017a8f75a945fe9ed2aa9d8bb7a7341a (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.cpp34
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;
}