aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorAndrzej Warzynski <andrzej.warzynski@arm.com>2022-07-19 17:48:31 +0000
committerAndrzej Warzynski <andrzej.warzynski@arm.com>2022-07-20 11:14:29 +0000
commitbbdf5c37e38e172228963fed8ebc3c37d940ede1 (patch)
tree98bf71a695a773be10091eeb5d1adfb99178d4cd /flang/lib/Frontend/CompilerInvocation.cpp
parentb1847ff0686e7c43ebf6dc81cb08f8ca3305ab69 (diff)
downloadllvm-bbdf5c37e38e172228963fed8ebc3c37d940ede1.zip
llvm-bbdf5c37e38e172228963fed8ebc3c37d940ede1.tar.gz
llvm-bbdf5c37e38e172228963fed8ebc3c37d940ede1.tar.bz2
[flang][driver] Fix opt-level option parsing
This update makes sure that `flang-new -O2 -O0` will run at `-O0` rather than `-O2`. This bug was identified and originally fixed by Vyacheslav Zakharin in https://reviews.llvm.org/D130035. I've extracted the fix into a separate patch. co-authored by: Vyacheslav Zakharin <vyacheslav.p.zakharin@intel.com> Differential Revision: https://reviews.llvm.org/D130104
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--flang/lib/Frontend/CompilerInvocation.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index f6fde9f..af6deb2 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -90,6 +90,25 @@ static bool parseShowColorsArgs(const llvm::opt::ArgList &args,
llvm::sys::Process::StandardErrHasColors());
}
+/// Extracts the optimisation level from \a args.
+static unsigned getOptimizationLevel(llvm::opt::ArgList &args,
+ clang::DiagnosticsEngine &diags) {
+ unsigned defaultOpt = llvm::CodeGenOpt::None;
+
+ if (llvm::opt::Arg *a =
+ args.getLastArg(clang::driver::options::OPT_O_Group)) {
+ if (a->getOption().matches(clang::driver::options::OPT_O0))
+ return llvm::CodeGenOpt::None;
+
+ assert(a->getOption().matches(clang::driver::options::OPT_O));
+
+ return getLastArgIntValue(args, clang::driver::options::OPT_O, defaultOpt,
+ diags);
+ }
+
+ return defaultOpt;
+}
+
bool Fortran::frontend::parseDiagnosticArgs(clang::DiagnosticOptions &opts,
llvm::opt::ArgList &args) {
opts.ShowColors = parseShowColorsArgs(args);
@@ -100,9 +119,7 @@ bool Fortran::frontend::parseDiagnosticArgs(clang::DiagnosticOptions &opts,
static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
llvm::opt::ArgList &args,
clang::DiagnosticsEngine &diags) {
- unsigned defaultOpt = llvm::CodeGenOpt::None;
- opts.OptimizationLevel = clang::getLastArgIntValue(
- args, clang::driver::options::OPT_O, defaultOpt, diags);
+ opts.OptimizationLevel = getOptimizationLevel(args, diags);
if (args.hasFlag(clang::driver::options::OPT_fdebug_pass_manager,
clang::driver::options::OPT_fno_debug_pass_manager, false))