mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[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
This commit is contained in:
parent
ae9b5d79fc
commit
ed940af216
@ -147,6 +147,17 @@ struct APFloatBase {
|
||||
|
||||
/// \name Floating Point Semantics.
|
||||
/// @{
|
||||
enum Semantics {
|
||||
S_IEEEhalf,
|
||||
S_IEEEsingle,
|
||||
S_IEEEdouble,
|
||||
S_x87DoubleExtended,
|
||||
S_IEEEquad,
|
||||
S_PPCDoubleDouble
|
||||
};
|
||||
|
||||
static const llvm::fltSemantics &EnumToSemantics(Semantics S);
|
||||
static Semantics SemanticsToEnum(const llvm::fltSemantics &Sem);
|
||||
|
||||
static const fltSemantics &IEEEhalf() LLVM_READNONE;
|
||||
static const fltSemantics &IEEEsingle() LLVM_READNONE;
|
||||
|
@ -113,6 +113,42 @@ namespace llvm {
|
||||
static const fltSemantics semPPCDoubleDoubleLegacy = {1023, -1022 + 53,
|
||||
53 + 53, 128};
|
||||
|
||||
const llvm::fltSemantics &APFloatBase::EnumToSemantics(Semantics S) {
|
||||
switch (S) {
|
||||
case S_IEEEhalf:
|
||||
return IEEEhalf();
|
||||
case S_IEEEsingle:
|
||||
return IEEEsingle();
|
||||
case S_IEEEdouble:
|
||||
return IEEEdouble();
|
||||
case S_x87DoubleExtended:
|
||||
return x87DoubleExtended();
|
||||
case S_IEEEquad:
|
||||
return IEEEquad();
|
||||
case S_PPCDoubleDouble:
|
||||
return PPCDoubleDouble();
|
||||
}
|
||||
llvm_unreachable("Unrecognised floating semantics");
|
||||
}
|
||||
|
||||
APFloatBase::Semantics
|
||||
APFloatBase::SemanticsToEnum(const llvm::fltSemantics &Sem) {
|
||||
if (&Sem == &llvm::APFloat::IEEEhalf())
|
||||
return S_IEEEhalf;
|
||||
else if (&Sem == &llvm::APFloat::IEEEsingle())
|
||||
return S_IEEEsingle;
|
||||
else if (&Sem == &llvm::APFloat::IEEEdouble())
|
||||
return S_IEEEdouble;
|
||||
else if (&Sem == &llvm::APFloat::x87DoubleExtended())
|
||||
return S_x87DoubleExtended;
|
||||
else if (&Sem == &llvm::APFloat::IEEEquad())
|
||||
return S_IEEEquad;
|
||||
else if (&Sem == &llvm::APFloat::PPCDoubleDouble())
|
||||
return S_PPCDoubleDouble;
|
||||
else
|
||||
llvm_unreachable("Unknown floating semantics");
|
||||
}
|
||||
|
||||
const fltSemantics &APFloatBase::IEEEhalf() {
|
||||
return semIEEEhalf;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user