aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Driver/Tools.cpp12
-rw-r--r--lib/Frontend/CompilerInvocation.cpp12
2 files changed, 22 insertions, 2 deletions
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 9d8effb710..f410848cc7 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -1345,6 +1345,18 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
getToolChain().IsStrictAliasingDefault()))
CmdArgs.push_back("-relaxed-aliasing");
+ // Handle -f{no-}honor-infinities, -f{no-}honor-nans, and -ffinite-math-only.
+ bool HonorInfinities = Args.hasFlag(options::OPT_fhonor_infinities,
+ options::OPT_fno_honor_infinities);
+ bool HonorNaNs = Args.hasFlag(options::OPT_fhonor_nans,
+ options::OPT_fno_honor_nans);
+ if (Args.hasArg(options::OPT_ffinite_math_only))
+ HonorInfinities = HonorNaNs = false;
+ if (!HonorInfinities)
+ CmdArgs.push_back("-menable-no-infs");
+ if (!HonorNaNs)
+ CmdArgs.push_back("-menable-no-nans");
+
// Decide whether to use verbose asm. Verbose assembly is the default on
// toolchains which have the integrated assembler on by default.
bool IsVerboseAsmDefault = getToolChain().IsIntegratedAssemblerDefault();
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index 2de9e8068c..0fd0a5aff7 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -183,6 +183,10 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,
Res.push_back("-main-file-name");
Res.push_back(Opts.MainFileName);
}
+ if (Opts.NoInfsFPMath)
+ Res.push_back("-menable-no-infinities");
+ if (Opts.NoNaNsFPMath)
+ Res.push_back("-menable-no-nans");
// SimplifyLibCalls is only derived.
// TimePasses is only derived.
// UnitAtATime is unused.
@@ -1083,8 +1087,12 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
Opts.HiddenWeakVTables = Args.hasArg(OPT_fhidden_weak_vtables);
Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable);
Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision);
- Opts.NoInfsFPMath = Opts.NoNaNsFPMath = Args.hasArg(OPT_cl_finite_math_only)||
- Args.hasArg(OPT_cl_fast_relaxed_math);
+ Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) ||
+ Args.hasArg(OPT_cl_finite_math_only)||
+ Args.hasArg(OPT_cl_fast_relaxed_math));
+ Opts.NoNaNsFPMath = (Args.hasArg(OPT_menable_no_nans) ||
+ Args.hasArg(OPT_cl_finite_math_only)||
+ Args.hasArg(OPT_cl_fast_relaxed_math));
Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);
Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option);
Opts.NumRegisterParameters = Args.getLastArgIntValue(OPT_mregparm, 0, Diags);