From: Anders Carlsson Date: Mon, 25 Aug 2008 03:27:15 +0000 (+0000) Subject: Handle emitting __builtin_huge_valf as a constant expr. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ea2b5e2b044739f4f5840bc1271abfa15a3101d;p=clang Handle emitting __builtin_huge_valf as a constant expr. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55299 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 5107a5643c..a7e49d0efc 100644 --- a/lib/AST/Expr.cpp +++ b/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/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index 9f94d4244f..e0c39c9cba 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/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(E->getCallee())) + if (const DeclRefExpr *DRExpr = + dyn_cast(IcExpr->getSubExpr())) + if (const FunctionDecl *FDecl = + dyn_cast(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.