[cfe-commits] r69084 - in /cfe/trunk: include/clang/AST/Expr.h include/clang/Frontend/PCHBitCodes.h include/clang/Frontend/PCHReader.h include/clang/Frontend/PCHWriter.h lib/Frontend/PCHReader.cpp lib/Frontend/PCHWriter.cpp test/PCH/exprs.c test/PCH/exprs.h test/PCH/external-defs.c test/PCH/external-defs.h
Douglas Gregor
dgregor at apple.com
Tue Apr 14 14:55:34 PDT 2009
Author: dgregor
Date: Tue Apr 14 16:55:33 2009
New Revision: 69084
URL: http://llvm.org/viewvc/llvm-project?rev=69084&view=rev
Log:
Add PCH support for PredefinedExpr and FloatingLiteral expressions
Modified:
cfe/trunk/include/clang/AST/Expr.h
cfe/trunk/include/clang/Frontend/PCHBitCodes.h
cfe/trunk/include/clang/Frontend/PCHReader.h
cfe/trunk/include/clang/Frontend/PCHWriter.h
cfe/trunk/lib/Frontend/PCHReader.cpp
cfe/trunk/lib/Frontend/PCHWriter.cpp
cfe/trunk/test/PCH/exprs.c
cfe/trunk/test/PCH/exprs.h
cfe/trunk/test/PCH/external-defs.c
cfe/trunk/test/PCH/external-defs.h
Modified: cfe/trunk/include/clang/AST/Expr.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=69084&r1=69083&r2=69084&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Expr.h (original)
+++ cfe/trunk/include/clang/AST/Expr.h Tue Apr 14 16:55:33 2009
@@ -367,8 +367,16 @@
PredefinedExpr(SourceLocation l, QualType type, IdentType IT)
: Expr(PredefinedExprClass, type), Loc(l), Type(IT) {}
+ /// \brief Construct an empty predefined expression.
+ explicit PredefinedExpr(EmptyShell Empty)
+ : Expr(PredefinedExprClass, Empty) { }
+
IdentType getIdentType() const { return Type; }
-
+ void setIdentType(IdentType IT) { Type = IT; }
+
+ SourceLocation getLocation() const { return Loc; }
+ void setLocation(SourceLocation L) { Loc = L; }
+
virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
static bool classof(const Stmt *T) {
@@ -469,15 +477,24 @@
QualType Type, SourceLocation L)
: Expr(FloatingLiteralClass, Type), Value(V), IsExact(*isexact), Loc(L) {}
+ /// \brief Construct an empty floating-point literal.
+ FloatingLiteral(EmptyShell Empty)
+ : Expr(FloatingLiteralClass, Empty), Value(0.0) { }
+
const llvm::APFloat &getValue() const { return Value; }
-
+ void setValue(const llvm::APFloat &Val) { Value = Val; }
+
bool isExact() const { return IsExact; }
+ void setExact(bool E) { IsExact = E; }
/// getValueAsApproximateDouble - This returns the value as an inaccurate
/// double. Note that this may cause loss of precision, but is useful for
/// debugging dumps, etc.
double getValueAsApproximateDouble() const;
+ SourceLocation getLocation() const { return Loc; }
+ void setLocation(SourceLocation L) { Loc = L; }
+
virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
static bool classof(const Stmt *T) {
Modified: cfe/trunk/include/clang/Frontend/PCHBitCodes.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/PCHBitCodes.h?rev=69084&r1=69083&r2=69084&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/PCHBitCodes.h (original)
+++ cfe/trunk/include/clang/Frontend/PCHBitCodes.h Tue Apr 14 16:55:33 2009
@@ -370,10 +370,14 @@
enum StmtCode {
/// \brief A NULL expression.
EXPR_NULL = 100,
+ /// \brief A PredefinedExpr record.
+ EXPR_PREDEFINED,
/// \brief A DeclRefExpr record.
EXPR_DECL_REF,
/// \brief An IntegerLiteral record.
EXPR_INTEGER_LITERAL,
+ /// \brief A FloatingLiteral record.
+ EXPR_FLOATING_LITERAL,
/// \brief A CharacterLiteral record.
EXPR_CHARACTER_LITERAL
};
Modified: cfe/trunk/include/clang/Frontend/PCHReader.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/PCHReader.h?rev=69084&r1=69083&r2=69084&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/PCHReader.h (original)
+++ cfe/trunk/include/clang/Frontend/PCHReader.h Tue Apr 14 16:55:33 2009
@@ -18,6 +18,7 @@
#include "clang/AST/ExternalASTSource.h"
#include "clang/AST/Type.h"
#include "clang/Basic/Diagnostic.h"
+#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/DenseMap.h"
@@ -221,6 +222,9 @@
/// \brief Read a signed integral value
llvm::APSInt ReadAPSInt(const RecordData &Record, unsigned &Idx);
+ /// \brief Read a floating-point value
+ llvm::APFloat ReadAPFloat(const RecordData &Record, unsigned &Idx);
+
/// \brief Reads an expression from the current stream position.
Expr *ReadExpr();
Modified: cfe/trunk/include/clang/Frontend/PCHWriter.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/PCHWriter.h?rev=69084&r1=69083&r2=69084&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/PCHWriter.h (original)
+++ cfe/trunk/include/clang/Frontend/PCHWriter.h Tue Apr 14 16:55:33 2009
@@ -23,6 +23,7 @@
#include <queue>
namespace llvm {
+ class APFloat;
class APInt;
class BitstreamWriter;
}
@@ -138,6 +139,9 @@
/// \brief Emit a signed integral value.
void AddAPSInt(const llvm::APSInt &Value, RecordData &Record);
+ /// \brief Emit a floating-point value.
+ void AddAPFloat(const llvm::APFloat &Value, RecordData &Record);
+
/// \brief Emit a reference to an identifier
void AddIdentifierRef(const IdentifierInfo *II, RecordData &Record);
Modified: cfe/trunk/lib/Frontend/PCHReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHReader.cpp?rev=69084&r1=69083&r2=69084&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PCHReader.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHReader.cpp Tue Apr 14 16:55:33 2009
@@ -226,8 +226,10 @@
: 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 @@
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 @@
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 @@
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 @@
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 @@
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;
}
Modified: cfe/trunk/lib/Frontend/PCHWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHWriter.cpp?rev=69084&r1=69083&r2=69084&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PCHWriter.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHWriter.cpp Tue Apr 14 16:55:33 2009
@@ -25,6 +25,8 @@
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/SourceManagerInternals.h"
#include "clang/Basic/TargetInfo.h"
+#include "llvm/ADT/APFloat.h"
+#include "llvm/ADT/APInt.h"
#include "llvm/Bitcode/BitstreamWriter.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/MemoryBuffer.h"
@@ -442,8 +444,10 @@
: Writer(Writer), Record(Record) { }
void VisitExpr(Expr *E);
+ void VisitPredefinedExpr(PredefinedExpr *E);
void VisitDeclRefExpr(DeclRefExpr *E);
void VisitIntegerLiteral(IntegerLiteral *E);
+ void VisitFloatingLiteral(FloatingLiteral *E);
void VisitCharacterLiteral(CharacterLiteral *E);
};
}
@@ -454,6 +458,13 @@
Record.push_back(E->isValueDependent());
}
+void PCHStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
+ VisitExpr(E);
+ Writer.AddSourceLocation(E->getLocation(), Record);
+ Record.push_back(E->getIdentType()); // FIXME: stable encoding
+ Code = pch::EXPR_PREDEFINED;
+}
+
void PCHStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
VisitExpr(E);
Writer.AddDeclRef(E->getDecl(), Record);
@@ -468,6 +479,14 @@
Code = pch::EXPR_INTEGER_LITERAL;
}
+void PCHStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
+ VisitExpr(E);
+ Writer.AddAPFloat(E->getValue(), Record);
+ Record.push_back(E->isExact());
+ Writer.AddSourceLocation(E->getLocation(), Record);
+ Code = pch::EXPR_FLOATING_LITERAL;
+}
+
void PCHStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
VisitExpr(E);
Record.push_back(E->getValue());
@@ -1120,6 +1139,10 @@
AddAPInt(Value, Record);
}
+void PCHWriter::AddAPFloat(const llvm::APFloat &Value, RecordData &Record) {
+ AddAPInt(Value.bitcastToAPInt(), Record);
+}
+
void PCHWriter::AddIdentifierRef(const IdentifierInfo *II, RecordData &Record) {
if (II == 0) {
Record.push_back(0);
Modified: cfe/trunk/test/PCH/exprs.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/exprs.c?rev=69084&r1=69083&r2=69084&view=diff
==============================================================================
--- cfe/trunk/test/PCH/exprs.c (original)
+++ cfe/trunk/test/PCH/exprs.c Tue Apr 14 16:55:33 2009
@@ -7,13 +7,18 @@
int integer;
long long_integer;
+double floating;
// DeclRefExpr
int_decl_ref *int_ptr1 = &integer;
enum_decl_ref *enum_ptr1 = &integer;
-// IntegerLiteralExpr
+
+// IntegerLiteral
integer_literal *int_ptr2 = &integer;
long_literal *long_ptr1 = &long_integer;
-// CharacterLiteralExpr
+// FloatingLiteral
+floating_literal *double_ptr = &floating;
+
+// CharacterLiteral
char_literal *int_ptr3 = &integer;
Modified: cfe/trunk/test/PCH/exprs.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/exprs.h?rev=69084&r1=69083&r2=69084&view=diff
==============================================================================
--- cfe/trunk/test/PCH/exprs.h (original)
+++ cfe/trunk/test/PCH/exprs.h Tue Apr 14 16:55:33 2009
@@ -6,9 +6,13 @@
typedef typeof(i) int_decl_ref;
typedef typeof(Enumerator) enum_decl_ref;
-// IntegerLiteralExpr
+// IntegerLiteral
typedef typeof(17) integer_literal;
typedef typeof(17l) long_literal;
-// CharacterLiteralExpr
+// FloatingLiteral
+typedef typeof(42.5) floating_literal;
+
+// CharacterLiteral
typedef typeof('a') char_literal;
+
Modified: cfe/trunk/test/PCH/external-defs.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/external-defs.c?rev=69084&r1=69083&r2=69084&view=diff
==============================================================================
--- cfe/trunk/test/PCH/external-defs.c (original)
+++ cfe/trunk/test/PCH/external-defs.c Tue Apr 14 16:55:33 2009
@@ -4,6 +4,7 @@
// RUN: grep "@x = common global i32 0" %t | count 1 &&
// RUN: grep "@y = global i32 17" %t | count 1 &&
+// RUN: grep "@d = .*1.742" %t | count 1 &&
// RUN: grep "@z" %t | count 0 &&
// RUN: grep "@x2 = global i32 19" %t | count 1 &&
Modified: cfe/trunk/test/PCH/external-defs.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/external-defs.h?rev=69084&r1=69083&r2=69084&view=diff
==============================================================================
--- cfe/trunk/test/PCH/external-defs.h (original)
+++ cfe/trunk/test/PCH/external-defs.h Tue Apr 14 16:55:33 2009
@@ -6,6 +6,7 @@
// Definitions
int y = 17;
+double d = 17.42;
// Should not show up
static int z;
More information about the cfe-commits
mailing list