Skip to content

Commit

Permalink
[Fixed Point] [AST] Add an AST serialization code for fixed-point lit…
Browse files Browse the repository at this point in the history
…erals.

Summary:
This patch adds the EXPR_FIXEDPOINT_LITERAL AST
code to serialize FixedPointLiterals. They were previously
being serialized with the code for integer literals, which
doesn't work properly.

Reviewers: leonardchan, rjmccall

Reviewed By: leonardchan, rjmccall

Subscribers: vabridgers, JesperAntonsson, bjope, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D57226
  • Loading branch information
vabridgers authored and einvbri committed Apr 14, 2020
1 parent e68f1f2 commit 161fc1d
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 2 deletions.
8 changes: 7 additions & 1 deletion clang/include/clang/AST/Expr.h
Expand Up @@ -1484,7 +1484,7 @@ class FixedPointLiteral : public Expr, public APIntStorage {
SourceLocation Loc;
unsigned Scale;

/// \brief Construct an empty integer literal.
/// \brief Construct an empty fixed-point literal.
explicit FixedPointLiteral(EmptyShell Empty)
: Expr(FixedPointLiteralClass, Empty) {}

Expand All @@ -1498,6 +1498,9 @@ class FixedPointLiteral : public Expr, public APIntStorage {
QualType type, SourceLocation l,
unsigned Scale);

/// Returns an empty fixed-point literal.
static FixedPointLiteral *Create(const ASTContext &C, EmptyShell Empty);

SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
SourceLocation getEndLoc() const LLVM_READONLY { return Loc; }

Expand All @@ -1506,6 +1509,9 @@ class FixedPointLiteral : public Expr, public APIntStorage {

void setLocation(SourceLocation Location) { Loc = Location; }

unsigned getScale() const { return Scale; }
void setScale(unsigned S) { Scale = S; }

static bool classof(const Stmt *T) {
return T->getStmtClass() == FixedPointLiteralClass;
}
Expand Down
3 changes: 3 additions & 0 deletions clang/include/clang/Serialization/ASTBitCodes.h
Expand Up @@ -1887,6 +1887,9 @@ namespace serialization {
EXPR_COAWAIT,
EXPR_COYIELD,
EXPR_DEPENDENT_COAWAIT,

// FixedPointLiteral
EXPR_FIXEDPOINT_LITERAL,
};

/// The kinds of designators that can occur in a
Expand Down
5 changes: 5 additions & 0 deletions clang/lib/AST/Expr.cpp
Expand Up @@ -913,6 +913,11 @@ FixedPointLiteral *FixedPointLiteral::CreateFromRawInt(const ASTContext &C,
return new (C) FixedPointLiteral(C, V, type, l, Scale);
}

FixedPointLiteral *FixedPointLiteral::Create(const ASTContext &C,
EmptyShell Empty) {
return new (C) FixedPointLiteral(Empty);
}

std::string FixedPointLiteral::getValueAsString(unsigned Radix) const {
// Currently the longest decimal number that can be printed is the max for an
// unsigned long _Accum: 4294967295.99999999976716935634613037109375
Expand Down
5 changes: 5 additions & 0 deletions clang/lib/Serialization/ASTReaderStmt.cpp
Expand Up @@ -605,6 +605,7 @@ void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
void ASTStmtReader::VisitFixedPointLiteral(FixedPointLiteral *E) {
VisitExpr(E);
E->setLocation(readSourceLocation());
E->setScale(Record.readInt());
E->setValue(Record.getContext(), Record.readAPInt());
}

Expand Down Expand Up @@ -2857,6 +2858,10 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
S = IntegerLiteral::Create(Context, Empty);
break;

case EXPR_FIXEDPOINT_LITERAL:
S = FixedPointLiteral::Create(Context, Empty);
break;

case EXPR_FLOATING_LITERAL:
S = FloatingLiteral::Create(Context, Empty);
break;
Expand Down
1 change: 1 addition & 0 deletions clang/lib/Serialization/ASTWriter.cpp
Expand Up @@ -571,6 +571,7 @@ static void AddStmtsExprs(llvm::BitstreamWriter &Stream,
RECORD(EXPR_PREDEFINED);
RECORD(EXPR_DECL_REF);
RECORD(EXPR_INTEGER_LITERAL);
RECORD(EXPR_FIXEDPOINT_LITERAL);
RECORD(EXPR_FLOATING_LITERAL);
RECORD(EXPR_IMAGINARY_LITERAL);
RECORD(EXPR_STRING_LITERAL);
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Serialization/ASTWriterStmt.cpp
Expand Up @@ -629,8 +629,9 @@ void ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
void ASTStmtWriter::VisitFixedPointLiteral(FixedPointLiteral *E) {
VisitExpr(E);
Record.AddSourceLocation(E->getLocation());
Record.push_back(E->getScale());
Record.AddAPInt(E->getValue());
Code = serialization::EXPR_INTEGER_LITERAL;
Code = serialization::EXPR_FIXEDPOINT_LITERAL;
}

void ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
Expand Down
5 changes: 5 additions & 0 deletions clang/test/PCH/Inputs/fixed-point-literal.h
@@ -0,0 +1,5 @@
// Header for PCH test fixed-point-literal.c

const short _Fract sf = -0.25r;
const _Fract f = 0.75r;
const long _Accum la = 25.25lk;
15 changes: 15 additions & 0 deletions clang/test/PCH/fixed-point-literal.c
@@ -0,0 +1,15 @@

// Test this without pch.
// RUN: %clang_cc1 -ffixed-point -include %S/Inputs/fixed-point-literal.h -fsyntax-only -ast-print -o - %s | FileCheck %s

// Test with pch.
// RUN: %clang_cc1 -ffixed-point -emit-pch -o %t %S/Inputs/fixed-point-literal.h
// RUN: %clang_cc1 -ffixed-point -include-pch %t -fsyntax-only -ast-print -o - %s | FileCheck %s

// CHECK: const short _Fract sf = -0.25r;
// CHECK: const _Fract f = 0.75r;
// CHECK: const long _Accum la = 25.25lk;

short _Fract sf2 = sf;
_Fract f2 = f;
long _Accum la2 = la;

0 comments on commit 161fc1d

Please sign in to comment.