diff options
author | Andrzej Warzynski <andrzej.warzynski@arm.com> | 2022-07-19 17:48:31 +0000 |
---|---|---|
committer | Andrzej Warzynski <andrzej.warzynski@arm.com> | 2022-07-20 11:14:29 +0000 |
commit | bbdf5c37e38e172228963fed8ebc3c37d940ede1 (patch) | |
tree | 98bf71a695a773be10091eeb5d1adfb99178d4cd /flang/lib/Frontend/CompilerInvocation.cpp | |
parent | b1847ff0686e7c43ebf6dc81cb08f8ca3305ab69 (diff) | |
download | llvm-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.cpp | 23 |
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)) |