diff options
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 56 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReaderStmt.cpp | 21 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 55 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriterStmt.cpp | 10 |
4 files changed, 140 insertions, 2 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 55e1f132c56..fa4a4b38a0e 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -9102,6 +9102,62 @@ ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, return SourceRange(beg, end); } +static FixedPointSemantics +ReadFixedPointSemantics(const SmallVectorImpl<uint64_t> &Record, + unsigned &Idx) { + unsigned Width = Record[Idx++]; + unsigned Scale = Record[Idx++]; + uint64_t Tmp = Record[Idx++]; + bool IsSigned = Tmp & 0x1; + bool IsSaturated = Tmp & 0x2; + bool HasUnsignedPadding = Tmp & 0x4; + return FixedPointSemantics(Width, Scale, IsSigned, IsSaturated, + HasUnsignedPadding); +} + +APValue ASTReader::ReadAPValue(const RecordData &Record, unsigned &Idx) { + unsigned Kind = Record[Idx++]; + switch (Kind) { + case APValue::None: + return APValue(); + case APValue::Indeterminate: + return APValue::IndeterminateValue(); + case APValue::Int: + return APValue(ReadAPSInt(Record, Idx)); + case APValue::Float: { + const llvm::fltSemantics &FloatSema = llvm::APFloatBase::EnumToSemantics( + static_cast<llvm::APFloatBase::Semantics>(Record[Idx++])); + return APValue(ReadAPFloat(Record, FloatSema, Idx)); + } + case APValue::FixedPoint: { + FixedPointSemantics FPSema = ReadFixedPointSemantics(Record, Idx); + return APValue(APFixedPoint(ReadAPInt(Record, Idx), FPSema)); + } + case APValue::ComplexInt: { + llvm::APSInt First = ReadAPSInt(Record, Idx); + return APValue(std::move(First), ReadAPSInt(Record, Idx)); + } + case APValue::ComplexFloat: { + const llvm::fltSemantics &FloatSema1 = llvm::APFloatBase::EnumToSemantics( + static_cast<llvm::APFloatBase::Semantics>(Record[Idx++])); + llvm::APFloat First = ReadAPFloat(Record, FloatSema1, Idx); + const llvm::fltSemantics &FloatSema2 = llvm::APFloatBase::EnumToSemantics( + static_cast<llvm::APFloatBase::Semantics>(Record[Idx++])); + return APValue(std::move(First), ReadAPFloat(Record, FloatSema2, Idx)); + } + case APValue::LValue: + case APValue::Vector: + case APValue::Array: + case APValue::Struct: + case APValue::Union: + case APValue::MemberPointer: + case APValue::AddrLabelDiff: + // TODO : Handle all these APValue::ValueKind. + return APValue(); + } + llvm_unreachable("Invalid APValue::ValueKind"); +} + /// Read an integral value llvm::APInt ASTReader::ReadAPInt(const RecordData &Record, unsigned &Idx) { unsigned BitWidth = Record[Idx++]; diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 4955343a420..e94a9125b79 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -533,6 +533,18 @@ void ASTStmtReader::VisitExpr(Expr *E) { void ASTStmtReader::VisitConstantExpr(ConstantExpr *E) { VisitExpr(E); + E->ConstantExprBits.ResultKind = Record.readInt(); + switch (E->ConstantExprBits.ResultKind) { + case ConstantExpr::RSK_Int64: { + E->Int64Result() = Record.readInt(); + uint64_t tmp = Record.readInt(); + E->ConstantExprBits.IsUnsigned = tmp & 0x1; + E->ConstantExprBits.BitWidth = tmp >> 1; + break; + } + case ConstantExpr::RSK_APValue: + E->APValueResult() = Record.readAPValue(); + } E->setSubExpr(Record.readSubExpr()); } @@ -590,7 +602,8 @@ void ASTStmtReader::VisitFixedPointLiteral(FixedPointLiteral *E) { void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) { VisitExpr(E); - E->setRawSemantics(static_cast<Stmt::APFloatSemantics>(Record.readInt())); + E->setRawSemantics( + static_cast<llvm::APFloatBase::Semantics>(Record.readInt())); E->setExact(Record.readInt()); E->setValue(Record.getContext(), Record.readAPFloat(E->getSemantics())); E->setLocation(ReadSourceLocation()); @@ -2510,7 +2523,11 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) { break; case EXPR_CONSTANT: - S = new (Context) ConstantExpr(Empty); + S = ConstantExpr::CreateEmpty( + Context, + static_cast<ConstantExpr::ResultStorageKind>( + Record[ASTStmtReader::NumExprFields]), + Empty); break; case EXPR_PREDEFINED: diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index a6950e490fc..60187379bf3 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -5399,6 +5399,61 @@ void ASTRecordWriter::AddAPFloat(const llvm::APFloat &Value) { AddAPInt(Value.bitcastToAPInt()); } +static void WriteFixedPointSemantics(ASTRecordWriter &Record, + FixedPointSemantics FPSema) { + Record.push_back(FPSema.getWidth()); + Record.push_back(FPSema.getScale()); + Record.push_back(FPSema.isSigned() | FPSema.isSaturated() << 1 | + FPSema.hasUnsignedPadding() << 2); +} + +void ASTRecordWriter::AddAPValue(const APValue &Value) { + APValue::ValueKind Kind = Value.getKind(); + push_back(static_cast<uint64_t>(Kind)); + switch (Kind) { + case APValue::None: + case APValue::Indeterminate: + return; + case APValue::Int: + AddAPSInt(Value.getInt()); + return; + case APValue::Float: + push_back(static_cast<uint64_t>( + llvm::APFloatBase::SemanticsToEnum(Value.getFloat().getSemantics()))); + AddAPFloat(Value.getFloat()); + return; + case APValue::FixedPoint: { + WriteFixedPointSemantics(*this, Value.getFixedPoint().getSemantics()); + AddAPSInt(Value.getFixedPoint().getValue()); + return; + } + case APValue::ComplexInt: { + AddAPSInt(Value.getComplexIntReal()); + AddAPSInt(Value.getComplexIntImag()); + return; + } + case APValue::ComplexFloat: { + push_back(static_cast<uint64_t>(llvm::APFloatBase::SemanticsToEnum( + Value.getComplexFloatReal().getSemantics()))); + AddAPFloat(Value.getComplexFloatReal()); + push_back(static_cast<uint64_t>(llvm::APFloatBase::SemanticsToEnum( + Value.getComplexFloatImag().getSemantics()))); + AddAPFloat(Value.getComplexFloatImag()); + return; + } + case APValue::LValue: + case APValue::Vector: + case APValue::Array: + case APValue::Struct: + case APValue::Union: + case APValue::MemberPointer: + case APValue::AddrLabelDiff: + // TODO : Handle all these APValue::ValueKind. + return; + } + llvm_unreachable("Invalid APValue::ValueKind"); +} + void ASTWriter::AddIdentifierRef(const IdentifierInfo *II, RecordDataImpl &Record) { Record.push_back(getIdentifierRef(II)); } diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index bd715461cb9..20a6b7d74ce 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -432,6 +432,16 @@ void ASTStmtWriter::VisitExpr(Expr *E) { void ASTStmtWriter::VisitConstantExpr(ConstantExpr *E) { VisitExpr(E); + Record.push_back(static_cast<uint64_t>(E->ConstantExprBits.ResultKind)); + switch (E->ConstantExprBits.ResultKind) { + case ConstantExpr::RSK_Int64: + Record.push_back(E->Int64Result()); + Record.push_back(E->ConstantExprBits.IsUnsigned | + E->ConstantExprBits.BitWidth << 1); + break; + case ConstantExpr::RSK_APValue: + Record.AddAPValue(E->APValueResult()); + } Record.AddStmt(E->getSubExpr()); Code = serialization::EXPR_CONSTANT; } |