aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorYusuke MINATO <minato.yusuke@fujitsu.com>2024-10-18 16:30:23 +0900
committerGitHub <noreply@github.com>2024-10-18 16:30:23 +0900
commit9698e57548c61d356f12cc42a8b4785e56f9ab51 (patch)
treeb23aabcac725f121bf4d709fd15b908ed414634a /flang/lib/Frontend/CompilerInvocation.cpp
parente6a4346b5a105c2f28349270c3a82935c9a84d16 (diff)
downloadllvm-9698e57548c61d356f12cc42a8b4785e56f9ab51.zip
llvm-9698e57548c61d356f12cc42a8b4785e56f9ab51.tar.gz
llvm-9698e57548c61d356f12cc42a8b4785e56f9ab51.tar.bz2
[flang][Driver] Add support for -f[no-]wrapv and -f[no]-strict-overflow in the frontend (#110061)
This patch introduces the options for integer overflow flags into Flang. The behavior is similar to that of Clang.
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--flang/lib/Frontend/CompilerInvocation.cpp36
1 files changed, 33 insertions, 3 deletions
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 4607a33..94d3d11 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1115,6 +1115,24 @@ static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
return diags.getNumErrors() == numErrorsBefore;
}
+/// Parses signed integer overflow options and populates the
+/// CompilerInvocation accordingly.
+/// Returns false if new errors are generated.
+///
+/// \param [out] invoc Stores the processed arguments
+/// \param [in] args The compiler invocation arguments to parse
+/// \param [out] diags DiagnosticsEngine to report erros with
+static bool parseIntegerOverflowArgs(CompilerInvocation &invoc,
+ llvm::opt::ArgList &args,
+ clang::DiagnosticsEngine &diags) {
+ Fortran::common::LangOptions &opts = invoc.getLangOpts();
+
+ if (args.getLastArg(clang::driver::options::OPT_fwrapv))
+ opts.setSignedOverflowBehavior(Fortran::common::LangOptions::SOB_Defined);
+
+ return true;
+}
+
/// Parses all floating point related arguments and populates the
/// CompilerInvocation accordingly.
/// Returns false if new errors are generated.
@@ -1255,6 +1273,18 @@ static bool parseLinkerOptionsArgs(CompilerInvocation &invoc,
return true;
}
+static bool parseLangOptionsArgs(CompilerInvocation &invoc,
+ llvm::opt::ArgList &args,
+ clang::DiagnosticsEngine &diags) {
+ bool success = true;
+
+ success &= parseIntegerOverflowArgs(invoc, args, diags);
+ success &= parseFloatingPointArgs(invoc, args, diags);
+ success &= parseVScaleArgs(invoc, args, diags);
+
+ return success;
+}
+
bool CompilerInvocation::createFromArgs(
CompilerInvocation &invoc, llvm::ArrayRef<const char *> commandLineArgs,
clang::DiagnosticsEngine &diags, const char *argv0) {
@@ -1363,9 +1393,7 @@ bool CompilerInvocation::createFromArgs(
invoc.frontendOpts.mlirArgs =
args.getAllArgValues(clang::driver::options::OPT_mmlir);
- success &= parseFloatingPointArgs(invoc, args, diags);
-
- success &= parseVScaleArgs(invoc, args, diags);
+ success &= parseLangOptionsArgs(invoc, args, diags);
success &= parseLinkerOptionsArgs(invoc, args, diags);
@@ -1577,6 +1605,8 @@ void CompilerInvocation::setLoweringOptions() {
loweringOpts.setUnderscoring(codegenOpts.Underscoring);
const Fortran::common::LangOptions &langOptions = getLangOpts();
+ loweringOpts.setIntegerWrapAround(langOptions.getSignedOverflowBehavior() ==
+ Fortran::common::LangOptions::SOB_Defined);
Fortran::common::MathOptionsBase &mathOpts = loweringOpts.getMathOptions();
// TODO: when LangOptions are finalized, we can represent
// the math related options using Fortran::commmon::MathOptionsBase,