diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/Expr.cpp | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 28 |
2 files changed, 30 insertions, 1 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 5107a5643c9..a7e49d0efcd 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -161,7 +161,8 @@ bool CallExpr::isBuiltinConstantExpr() const { // We have a builtin that is a constant expression return builtinID == Builtin::BI__builtin___CFStringMakeConstantString || - builtinID == Builtin::BI__builtin_classify_type; + builtinID == Builtin::BI__builtin_classify_type || + builtinID == Builtin::BI__builtin_huge_valf; } bool CallExpr::isBuiltinClassifyType(llvm::APSInt &Result) const { diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index 9f94d4244f0..e0c39c9cbac 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -606,6 +606,20 @@ public: return Visit(E->getRHS()); } + + llvm::Constant *VisitCallExpr(const CallExpr *E) { + if (const ImplicitCastExpr *IcExpr = + dyn_cast<const ImplicitCastExpr>(E->getCallee())) + if (const DeclRefExpr *DRExpr = + dyn_cast<const DeclRefExpr>(IcExpr->getSubExpr())) + if (const FunctionDecl *FDecl = + dyn_cast<const FunctionDecl>(DRExpr->getDecl())) + if (unsigned builtinID = FDecl->getIdentifier()->getBuiltinID()) + return EmitBuiltinExpr(builtinID, E); + + CGM.ErrorUnsupported(E, "constant call expression"); + return llvm::Constant::getNullValue(ConvertType(E->getType())); + } // Utility methods const llvm::Type *ConvertType(QualType T) { @@ -805,6 +819,20 @@ public: return llvm::UndefValue::get(Ty); } + llvm::Constant *EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) + { + switch (BuiltinID) { + default: + CGM.ErrorUnsupported(E, "constant builtin function"); + return 0; + case Builtin::BI__builtin_huge_valf: { + const llvm::fltSemantics &Sem = + CGM.getContext().getFloatTypeSemantics(E->getType()); + return llvm::ConstantFP::get(llvm::APFloat::getInf(Sem)); + } + } + } + }; } // end anonymous namespace. |