diff options
author | Anders Carlsson <andersca@mac.com> | 2008-12-01 02:42:14 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2008-12-01 02:42:14 +0000 |
commit | 4b3f9c06d548d3de576441a91ef986c6840bd983 (patch) | |
tree | 6d03b739e3dbf6e64cd95b2ce2bd4de85e6f0983 /lib/CodeGen/CGExprConstant.cpp | |
parent | f35d35a2316dcb65d078844696c2032b71a7f103 (diff) |
Change more code over to using the new Expr::Evaluate
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60323 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | lib/CodeGen/CGExprConstant.cpp | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index 584cbc08c3..7f294e2996 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -388,12 +388,12 @@ public: // Binary operators llvm::Constant *VisitCallExpr(const CallExpr *E) { - APValue Result; + Expr::EvalResult Result; if (E->Evaluate(Result, CGM.getContext())) { - if (Result.isInt()) - return llvm::ConstantInt::get(Result.getInt()); - if (Result.isFloat()) - return llvm::ConstantFP::get(Result.getFloat()); + if (Result.Val.isInt()) + return llvm::ConstantInt::get(Result.Val.getInt()); + if (Result.Val.isFloat()) + return llvm::ConstantFP::get(Result.Val.getFloat()); } // Handle __builtin___CFStringMakeConstantString. @@ -622,16 +622,19 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, CodeGenFunction *CGF) { QualType type = Context.getCanonicalType(E->getType()); - APValue V; - if (E->Evaluate(V, Context)) { - // FIXME: Assert that the value doesn't have any side effects. - switch (V.getKind()) { + Expr::EvalResult Result; + + if (E->Evaluate(Result, Context)) { + assert(!Result.HasSideEffects && + "Constant expr should not have any side effects!"); + switch (Result.Val.getKind()) { default: assert(0 && "unhandled value kind!"); case APValue::LValue: { - llvm::Constant *Offset = llvm::ConstantInt::get(llvm::Type::Int64Ty, - V.getLValueOffset()); + llvm::Constant *Offset = + llvm::ConstantInt::get(llvm::Type::Int64Ty, + Result.Val.getLValueOffset()); - if (const Expr *LVBase = V.getLValueBase()) { + if (const Expr *LVBase = Result.Val.getLValueBase()) { llvm::Constant *C = ConstExprEmitter(*this, CGF).EmitLValue(const_cast<Expr*>(LVBase)); @@ -651,7 +654,7 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, getTypes().ConvertType(type)); } case APValue::Int: { - llvm::Constant *C = llvm::ConstantInt::get(V.getInt()); + llvm::Constant *C = llvm::ConstantInt::get(Result.Val.getInt()); if (C->getType() == llvm::Type::Int1Ty) { const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType()); @@ -660,12 +663,12 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, return C; } case APValue::Float: - return llvm::ConstantFP::get(V.getFloat()); + return llvm::ConstantFP::get(Result.Val.getFloat()); case APValue::ComplexFloat: { llvm::Constant *Complex[2]; - Complex[0] = llvm::ConstantFP::get(V.getComplexFloatReal()); - Complex[1] = llvm::ConstantFP::get(V.getComplexFloatImag()); + Complex[0] = llvm::ConstantFP::get(Result.Val.getComplexFloatReal()); + Complex[1] = llvm::ConstantFP::get(Result.Val.getComplexFloatImag()); return llvm::ConstantStruct::get(Complex, 2); } |