diff options
author | Anders Carlsson <andersca@mac.com> | 2008-11-15 20:45:50 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2008-11-15 20:45:50 +0000 |
commit | 5a9a457ecf66343ae8b64baa7909007837b2a2cd (patch) | |
tree | e9d104f3cc49e78f6731f30cbc4394827194571d /lib/CodeGen/CGExprConstant.cpp | |
parent | e3daa761061982f2267f7c8fb847ea02abad0aa9 (diff) |
Check in code that uses tryEvaluate for emitting constant exprs (not used yet).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59375 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | lib/CodeGen/CGExprConstant.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index e187d890e9..151119b8db 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -836,12 +836,41 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, CodeGenFunction *CGF) { QualType type = Context.getCanonicalType(E->getType()); +#ifdef USE_TRY_EVALUATE + APValue V; + if (E->tryEvaluate(V, Context)) { + // FIXME: Assert that the value doesn't have any side effects. + switch (V.getKind()) { + default: assert(0 && "unhandled value kind!"); + case APValue::LValue: { + if (V.getLValueBase()) + break; + + llvm::Constant *C = llvm::ConstantInt::get(llvm::Type::Int64Ty, + V.getLValueOffset()); + + return llvm::ConstantExpr::getIntToPtr(C, getTypes().ConvertType(type)); + } + case APValue::Int: + llvm::Constant *C = llvm::ConstantInt::get(V.getInt()); + + if (C->getType() == llvm::Type::Int1Ty) { + const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType()); + C = llvm::ConstantExpr::getZExt(C, BoolTy); + } + return C; + case APValue::Float: + return llvm::ConstantFP::get(V.getFloat()); + } + } +#else if (type->isIntegerType()) { llvm::APSInt Value(static_cast<uint32_t>(Context.getTypeSize(type))); if (E->isIntegerConstantExpr(Value, Context)) { return llvm::ConstantInt::get(Value); } } +#endif llvm::Constant* C = ConstExprEmitter(*this, CGF).Visit(const_cast<Expr*>(E)); if (C->getType() == llvm::Type::Int1Ty) { |