Support IRgen of sqrt -> llvm.sqrt, pow -> llvm.pow.

 - Define pow[lf]?, sqrt[lf]? as builtins.

 - Add -fmath-errno option which binds to LangOptions.MathErrno

 - Add new builtin flag Builtin::Context::isConstWithoutErrno for
   functions which can be marked as const if errno isn't respected for
   math functions. Sema automatically marks these functions as const
   when they are defined, if MathErrno=0.

 - IRgen uses const attribute on sqrt and pow library functions to
   decide if it can use the llvm intrinsic.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64689 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index d1ef871..d0b3daf 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -213,9 +213,14 @@
 //===----------------------------------------------------------------------===//
 static llvm::cl::opt<bool>
 Freestanding("ffreestanding",
-             llvm::cl::desc("Assert that the compiler takes place in a "
+             llvm::cl::desc("Assert that the compilation takes place in a "
                             "freestanding environment"));
 
+static llvm::cl::opt<bool>
+MathErrno("fmath-errno", 
+          llvm::cl::desc("Require math functions to respect errno."),
+          llvm::cl::init(true));
+
 //===----------------------------------------------------------------------===//
 // Analyzer Options.
 //===----------------------------------------------------------------------===//
@@ -647,6 +652,8 @@
   if (Freestanding)
     Options.Freestanding = 1;
 
+  Options.MathErrno = MathErrno;
+
   // Override the default runtime if the user requested it.
   if (NeXTRuntime)
     Options.NeXTRuntime = 1;
@@ -1238,8 +1245,7 @@
 //===----------------------------------------------------------------------===//
 
 static llvm::cl::opt<bool>
-OptSize("Os", 
-       llvm::cl::desc("Optimize for size"));
+OptSize("Os", llvm::cl::desc("Optimize for size"));
 
 // It might be nice to add bounds to the CommandLine library directly.
 struct OptLevelParser : public llvm::cl::parser<unsigned> {