Index: clang/lib/Frontend/FrontendAction.cpp =================================================================== --- clang/lib/Frontend/FrontendAction.cpp +++ clang/lib/Frontend/FrontendAction.cpp @@ -12,6 +12,7 @@ #include "clang/AST/DeclGroup.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/LangStandard.h" +#include "clang/Basic/MacroBuilder.h" #include "clang/Frontend/ASTUnit.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendDiagnostic.h" @@ -840,6 +841,19 @@ CI.getLangOpts().CurrentModule = CI.getLangOpts().ModuleName; } + // Set the __FLT_EVAL_METHOD__ when the input source is stdin. + if (Input.isFile() && Input.getFile() == "-") { + Preprocessor &PP = CI.getPreprocessor(); + std::string PredefineBuffer; + PredefineBuffer.reserve(4080); + llvm::raw_string_ostream Predefines(PredefineBuffer); + Predefines << PP.getPredefines(); + MacroBuilder Builder(Predefines); + Builder.append("# 1 \"\" 3"); + Builder.defineMacro("__FLT_EVAL_METHOD__", Twine(PP.getTUFPEvalMethod())); + PP.setPredefines(Predefines.str()); + } + if (!CI.InitializeSourceManager(Input)) return false; Index: clang/test/Preprocessor/flt_eval_macro.cpp =================================================================== --- clang/test/Preprocessor/flt_eval_macro.cpp +++ clang/test/Preprocessor/flt_eval_macro.cpp @@ -23,6 +23,31 @@ // RUN: -target-feature -sse %s -o - | FileCheck -check-prefix=EXT %s \ // RUN: -strict-whitespace +// RUN: %clang_cc1 -E -dM -triple=x86_64-none-none < /dev/null \ +// RUN: | FileCheck %s --check-prefix=CHECK-FEM + +// RUN: %clang_cc1 -E -dM -triple=x86_64-none-none -target-feature -sse \ +// RUN: < /dev/null | FileCheck %s --check-prefix=CHECK-FEM-EXT + +// RUN: %clang_cc1 -E -dM -triple=arm64e-apple-ios -target-feature -sse \ +// RUN: < /dev/null | FileCheck %s --check-prefix=CHECK-FEM + +// RUN: %clang_cc1 -E -dM -triple=arm64e-apple-ios -target-feature +sse \ +// RUN: < /dev/null | FileCheck %s --check-prefix=CHECK-FEM + +// RUN: %clang_cc1 -E -dM -triple=arm64_32-apple-ios < /dev/null \ +// RUN: | FileCheck %s --check-prefix=CHECK-FEM + +// RUN: %clang_cc1 -E -dM -triple=arm64_32-apple-ios -target-feature -sse \ +// RUN: < /dev/null | FileCheck %s --check-prefix=CHECK-FEM + +// RUN: %clang_cc1 -E -dM -triple i386-pc-windows -target-cpu pentium4 \ +// RUN: < /dev/null | FileCheck %s --check-prefix=CHECK-FEM + +// RUN: %clang_cc1 -E -dM -triple i386-pc-windows -target-cpu pentium4 \ +// RUN: -target-feature -sse < /dev/null \ +// RUN: | FileCheck %s --check-prefix=CHECK-FEM-EXT + #ifdef __FLT_EVAL_METHOD__ #if __FLT_EVAL_METHOD__ == 3 #define __GLIBC_FLT_EVAL_METHOD 2 @@ -80,3 +105,6 @@ // EXT: #define Val "val2" return Val; } + +// CHECK-FEM: #define __FLT_EVAL_METHOD__ 0 +// CHECK-FEM-EXT: #define __FLT_EVAL_METHOD__ 2 Index: clang/test/Preprocessor/init.c =================================================================== --- clang/test/Preprocessor/init.c +++ clang/test/Preprocessor/init.c @@ -1571,6 +1571,7 @@ // WEBASSEMBLY-NEXT:#define __FLT_DENORM_MIN__ 1.40129846e-45F // WEBASSEMBLY-NEXT:#define __FLT_DIG__ 6 // WEBASSEMBLY-NEXT:#define __FLT_EPSILON__ 1.19209290e-7F +// WEBASSEMBLY-NEXT:#define __FLT_EVAL_METHOD__ 0 // WEBASSEMBLY-NEXT:#define __FLT_HAS_DENORM__ 1 // WEBASSEMBLY-NEXT:#define __FLT_HAS_INFINITY__ 1 // WEBASSEMBLY-NEXT:#define __FLT_HAS_QUIET_NAN__ 1