From: Bob Wilson Date: Thu, 19 Jul 2012 03:52:53 +0000 (+0000) Subject: Define __FINITE_MATH_ONLY__ based on -ffast-math and -ffinite-math-only. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=455e72e7625a8f87c2c302d8d82baee5c111e094;p=clang Define __FINITE_MATH_ONLY__ based on -ffast-math and -ffinite-math-only. This macro was being unconditionally set to zero, preceded by a FIXME comment. This fixes . Patch by Michael Gottesman! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160491 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/LangOptions.def b/include/clang/Basic/LangOptions.def index 8f39971c68..6409e33d8c 100644 --- a/include/clang/Basic/LangOptions.def +++ b/include/clang/Basic/LangOptions.def @@ -99,6 +99,7 @@ LANGOPT(GNUInline , 1, 0, "GNU inline semantics") LANGOPT(NoInlineDefine , 1, 0, "__NO_INLINE__ predefined macro") LANGOPT(Deprecated , 1, 0, "__DEPRECATED predefined macro") LANGOPT(FastMath , 1, 0, "__FAST_MATH__ predefined macro") +LANGOPT(FiniteMathOnly , 1, 0, "__FINITE_MATH_ONLY__ predefined macro") BENIGN_LANGOPT(ObjCGCBitmapPrint , 1, 0, "printing of GC's bitmap layout for __weak/__strong ivars") diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index cf8ef814fc..0c4760bbb9 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -400,7 +400,7 @@ def fassociative_math : Flag<"-fassociative-math">, Group; def fno_associative_math : Flag<"-fno-associative-math">, Group; def freciprocal_math : Flag<"-freciprocal-math">, Group; def fno_reciprocal_math : Flag<"-fno-reciprocal-math">, Group; -def ffinite_math_only : Flag<"-ffinite-math-only">, Group; +def ffinite_math_only : Flag<"-ffinite-math-only">, Group, Flags<[CC1Option]>; def fno_finite_math_only : Flag<"-fno-finite-math-only">, Group; def fsigned_zeros : Flag<"-fsigned-zeros">, Group; def fno_signed_zeros : Flag<"-fno-signed-zeros">, Group; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 59196b20e2..e07068aea1 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1823,12 +1823,15 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, } } - // We separately look for the '-ffast-math' flag, and if we find it, tell the - // frontend to provide the appropriate preprocessor macros. This is distinct - // from enabling any optimizations as it induces a language change which must - // survive serialization and deserialization, etc. + // We separately look for the '-ffast-math' and '-ffinite-math-only' flags, + // and if we find them, tell the frontend to provide the appropriate + // preprocessor macros. This is distinct from enabling any optimizations as + // these options induce language changes which must survive serialization + // and deserialization, etc. if (Args.hasArg(options::OPT_ffast_math)) CmdArgs.push_back("-ffast-math"); + if (Args.hasArg(options::OPT_ffinite_math_only)) + CmdArgs.push_back("-ffinite-math-only"); // Decide whether to use verbose asm. Verbose assembly is the default on // toolchains which have the integrated assembler on by default. diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 016783b1dc..544c0a270a 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -2100,6 +2100,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.NoInlineDefine = !Opt || Args.hasArg(OPT_fno_inline); Opts.FastMath = Args.hasArg(OPT_ffast_math); + Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only); unsigned SSP = Args.getLastArgIntValue(OPT_stack_protector, 0, Diags); switch (SSP) { diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index 6120d117e3..3979731ff6 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/lib/Frontend/InitPreprocessor.cpp @@ -527,9 +527,10 @@ static void InitializePredefinedMacros(const TargetInfo &TI, if (const char *Prefix = TI.getUserLabelPrefix()) Builder.defineMacro("__USER_LABEL_PREFIX__", Prefix); - // Build configuration options. FIXME: these should be controlled by - // command line options or something. - Builder.defineMacro("__FINITE_MATH_ONLY__", "0"); + if (LangOpts.FastMath || LangOpts.FiniteMathOnly) + Builder.defineMacro("__FINITE_MATH_ONLY__", "1"); + else + Builder.defineMacro("__FINITE_MATH_ONLY__", "0"); if (LangOpts.GNUInline) Builder.defineMacro("__GNUC_GNU_INLINE__"); diff --git a/test/Preprocessor/predefined-macros.c b/test/Preprocessor/predefined-macros.c index 5c11c3b7b2..2c193018b5 100644 --- a/test/Preprocessor/predefined-macros.c +++ b/test/Preprocessor/predefined-macros.c @@ -13,3 +13,16 @@ // RUN: %clang_cc1 %s -E -dM -ffast-math -o - \ // RUN: | FileCheck %s --check-prefix=CHECK-FAST-MATH // CHECK-FAST-MATH: #define __FAST_MATH__ +// CHECK-FAST-MATH: #define __FINITE_MATH_ONLY__ 1 +// +// RUN: %clang_cc1 %s -E -dM -ffinite-math-only -o - \ +// RUN: | FileCheck %s --check-prefix=CHECK-FINITE-MATH-ONLY +// CHECK-FINITE-MATH-ONLY: #define __FINITE_MATH_ONLY__ 1 +// +// RUN: %clang %s -E -dM -fno-finite-math-only -o - \ +// RUN: | FileCheck %s --check-prefix=CHECK-NO-FINITE-MATH-ONLY +// CHECK-NO-FINITE-MATH-ONLY: #define __FINITE_MATH_ONLY__ 0 +// +// RUN: %clang_cc1 %s -E -dM -o - \ +// RUN: | FileCheck %s --check-prefix=CHECK-FINITE-MATH-FLAG-UNDEFINED +// CHECK-FINITE-MATH-FLAG-UNDEFINED: #define __FINITE_MATH_ONLY__ 0