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 | ee0d90fe30c618298dfad8a0e6559e8b00e90de2 (patch) | |
tree | e0c45deaa552ec52607981c2faa250d20bc691df /clang/lib/CodeGen/CGExprConstant.cpp | |
parent | 757a012bf14d6814499681a8fa718b0a05926931 (diff) | |
download | bcm5719-llvm-ee0d90fe30c618298dfad8a0e6559e8b00e90de2.tar.gz bcm5719-llvm-ee0d90fe30c618298dfad8a0e6559e8b00e90de2.zip |
Check in code that uses tryEvaluate for emitting constant exprs (not used yet).
llvm-svn: 59375
Diffstat (limited to 'clang/lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index e187d890e94..151119b8db9 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/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) { |