aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/Sema.cpp
diff options
context:
space:
mode:
authorZahira Ammarguellat <zahira.ammarguellat@intel.com>2021-10-19 09:12:57 -0700
committerZahira Ammarguellat <zahira.ammarguellat@intel.com>2022-02-23 15:00:18 -0800
commit1592d88aa7bc13c9f53cf09d25b98e7318a57bfb (patch)
treed6e4e5f200151ea2deb4ca8f1e3354dadd8fc0db /clang/lib/Sema/Sema.cpp
parent924032c592658b19d9e1faeef0fea14414814f39 (diff)
downloadllvm-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.cpp21
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);
+}