From: Anders Carlsson Date: Sat, 15 Nov 2008 20:45:50 +0000 (+0000) Subject: Check in code that uses tryEvaluate for emitting constant exprs (not used yet). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5a9a457ecf66343ae8b64baa7909007837b2a2cd;p=clang 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 --- 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(Context.getTypeSize(type))); if (E->isIntegerConstantExpr(Value, Context)) { return llvm::ConstantInt::get(Value); } } +#endif llvm::Constant* C = ConstExprEmitter(*this, CGF).Visit(const_cast(E)); if (C->getType() == llvm::Type::Int1Ty) {