aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprConstant.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2008-08-25 03:27:15 +0000
committerAnders Carlsson <andersca@mac.com>2008-08-25 03:27:15 +0000
commit2ea2b5e2b044739f4f5840bc1271abfa15a3101d (patch)
tree9f571f7c478d40ce8fb5010cdf8c78d6d8207009 /lib/CodeGen/CGExprConstant.cpp
parent29b7e5071c4ac0979ba907d0db78f5bd7ff83fe8 (diff)
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
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
-rw-r--r--lib/CodeGen/CGExprConstant.cpp28
1 files changed, 28 insertions, 0 deletions
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<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.