From 83c7b61052bd46fac08a69a8f61ac56eba6d7ffc Mon Sep 17 00:00:00 2001 From: Gauthier Harnisch Date: Sat, 15 Jun 2019 10:24:47 +0000 Subject: [clang] Add storage for APValue in ConstantExpr Summary: When using ConstantExpr we often need the result of the expression to be kept in the AST. Currently this is done on a by the node that needs the result and has been done multiple times for enumerator, for constexpr variables... . This patch adds to ConstantExpr the ability to store the result of evaluating the expression. no functional changes expected. Changes: - Add trailling object to ConstantExpr that can hold an APValue or an uint64_t. the uint64_t is here because most ConstantExpr yield integral values so there is an optimized layout for integral values. - Add basic* serialization support for the trailing result. - Move conversion functions from an enum to a fltSemantics from clang::FloatingLiteral to llvm::APFloatBase. this change is to make it usable for serializing APValues. - Add basic* Import support for the trailing result. - ConstantExpr created in CheckConvertedConstantExpression now stores the result in the ConstantExpr Node. - Adapt AST dump to print the result when present. basic* : None, Indeterminate, Int, Float, FixedPoint, ComplexInt, ComplexFloat, the result is not yet used anywhere but for -ast-dump. Reviewers: rsmith, martong, shafik Reviewed By: rsmith Subscribers: rnkovacs, hiraditya, dexonsmith, cfe-commits, llvm-commits Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D62399 llvm-svn: 363493 --- clang/lib/Serialization/ASTWriterStmt.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'clang/lib/Serialization/ASTWriterStmt.cpp') 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(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; } -- cgit v1.2.3