diff options
author | Zahira Ammarguellat <zahira.ammarguellat@intel.com> | 2021-10-19 09:12:57 -0700 |
---|---|---|
committer | Zahira Ammarguellat <zahira.ammarguellat@intel.com> | 2022-02-23 15:00:18 -0800 |
commit | 1592d88aa7bc13c9f53cf09d25b98e7318a57bfb (patch) | |
tree | d6e4e5f200151ea2deb4ca8f1e3354dadd8fc0db /clang/lib/Sema/Sema.cpp | |
parent | 924032c592658b19d9e1faeef0fea14414814f39 (diff) | |
download | llvm-1592d88aa7bc13c9f53cf09d25b98e7318a57bfb.zip llvm-1592d88aa7bc13c9f53cf09d25b98e7318a57bfb.tar.gz llvm-1592d88aa7bc13c9f53cf09d25b98e7318a57bfb.tar.bz2 |
Add support for floating-point option `ffp-eval-method` and for
`pragma clang fp eval_method`.
Differential Revision: https://reviews.llvm.org/D109239
Diffstat (limited to 'clang/lib/Sema/Sema.cpp')
-rw-r--r-- | clang/lib/Sema/Sema.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 7b57c8d..db3eda6 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -242,6 +242,15 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, SemaPPCallbackHandler = Callbacks.get(); PP.addPPCallbacks(std::move(Callbacks)); SemaPPCallbackHandler->set(*this); + if (getLangOpts().getFPEvalMethod() == LangOptions::FEM_UnsetOnCommandLine) + // Use setting from TargetInfo. + PP.setCurrentFPEvalMethod(SourceLocation(), + ctxt.getTargetInfo().getFPEvalMethod()); + else + // Set initial value of __FLT_EVAL_METHOD__ from the command line. + PP.setCurrentFPEvalMethod(SourceLocation(), + getLangOpts().getFPEvalMethod()); + CurFPFeatures.setFPEvalMethod(PP.getCurrentFPEvalMethod()); } // Anchor Sema's type info to this TU. @@ -2630,3 +2639,15 @@ const llvm::MapVector<FieldDecl *, Sema::DeleteLocs> & Sema::getMismatchingDeleteExpressions() const { return DeleteExprs; } + +Sema::FPFeaturesStateRAII::FPFeaturesStateRAII(Sema &S) + : S(S), OldFPFeaturesState(S.CurFPFeatures), + OldOverrides(S.FpPragmaStack.CurrentValue), + OldEvalMethod(S.PP.getCurrentFPEvalMethod()), + OldFPPragmaLocation(S.PP.getLastFPEvalPragmaLocation()) {} + +Sema::FPFeaturesStateRAII::~FPFeaturesStateRAII() { + S.CurFPFeatures = OldFPFeaturesState; + S.FpPragmaStack.CurrentValue = OldOverrides; + S.PP.setCurrentFPEvalMethod(OldFPPragmaLocation, OldEvalMethod); +} |