diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2008-05-29 11:22:45 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2008-05-29 11:22:45 +0000 |
commit | 045bf4ff82d728be5e8305670716641fb9685def (patch) | |
tree | fcc66ee04e0e382bf4dbc32e34c78209d6c38ad9 /clang/lib/CodeGen/CGExprConstant.cpp | |
parent | 174d9c26f14b5503082a4c90abdfe1ac00a3369b (diff) | |
download | bcm5719-llvm-045bf4ff82d728be5e8305670716641fb9685def.tar.gz bcm5719-llvm-045bf4ff82d728be5e8305670716641fb9685def.zip |
Add codegen support for a few more kinds of initializer constant
expressions.
llvm-svn: 51677
Diffstat (limited to 'clang/lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index a0484bc35e1..a642fd236d3 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -296,6 +296,10 @@ public: static_cast<uint32_t>(CGM.getContext().getTypeSize(E->getType())); return llvm::ConstantInt::get(llvm::APInt(ResultWidth, Val)); } + + llvm::Constant *VisitUnaryExtension(const UnaryOperator *E) { + return Visit(E->getSubExpr()); + } // Binary operators llvm::Constant *VisitBinOr(const BinaryOperator *E) { @@ -380,6 +384,37 @@ public: return llvm::ConstantExpr::getAnd(LHS, RHS); } + + llvm::Constant *VisitBinNE(const BinaryOperator *E) { + llvm::Constant *LHS = Visit(E->getLHS()); + llvm::Constant *RHS = Visit(E->getRHS()); + + const llvm::Type* ResultType = ConvertType(E->getType()); + if (!ResultType->isInteger()) { + CGM.WarnUnsupported(E, "constant expression"); + return llvm::Constant::getNullValue(ConvertType(E->getType())); + } + llvm::Constant *Result = + llvm::ConstantExpr::getICmp(llvm::ICmpInst::ICMP_NE, LHS, RHS); + return llvm::ConstantExpr::getZExtOrBitCast(Result, ResultType); + } + + llvm::Constant *VisitConditionalOperator(const ConditionalOperator *E) { + llvm::Constant *Cond = Visit(E->getCond()); + llvm::Constant *CondVal = EmitConversionToBool(Cond, E->getType()); + llvm::ConstantInt *CondValInt = dyn_cast<llvm::ConstantInt>(CondVal); + if (!CondValInt) { + CGM.WarnUnsupported(E, "constant expression"); + return llvm::Constant::getNullValue(ConvertType(E->getType())); + } + if (CondValInt->isOne()) { + if (E->getLHS()) + return Visit(E->getLHS()); + return Cond; + } + + return Visit(E->getRHS()); + } // Utility methods const llvm::Type *ConvertType(QualType T) { |