diff options
author | Krzysztof Parzyszek <Krzysztof.Parzyszek@amd.com> | 2025-06-25 11:54:14 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-25 11:54:14 -0500 |
commit | b4f4af7ebb91e7af99dac9cb9f73fbfc1c63b18e (patch) | |
tree | 1568d7e1ba4a3f3fc5387e54692a8af983321bdc /flang/lib/Frontend/CompilerInvocation.cpp | |
parent | 5a194c1fd97b10fdbdbd8ada85372d978c9ff3c4 (diff) | |
download | llvm-b4f4af7ebb91e7af99dac9cb9f73fbfc1c63b18e.zip llvm-b4f4af7ebb91e7af99dac9cb9f73fbfc1c63b18e.tar.gz llvm-b4f4af7ebb91e7af99dac9cb9f73fbfc1c63b18e.tar.bz2 |
[flang][OpenMP] Verify that N in -fopenmp-version=N is valid (#145725)
For historical versions that are unsupported, emit a warning and assume
the currently default version.
For values of N that are not integers or that don't correspond to any
OpenMP version (old or newer), emit an error.
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | flang/lib/Frontend/CompilerInvocation.cpp | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 2603a3f..07d6814 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -26,6 +26,7 @@ #include "clang/Driver/Driver.h" #include "clang/Driver/OptionUtils.h" #include "clang/Driver/Options.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Frontend/Debug/Options.h" @@ -44,6 +45,7 @@ #include <cstdlib> #include <memory> #include <optional> +#include <sstream> using namespace Fortran::frontend; @@ -1140,11 +1142,43 @@ static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args, res.getLangOpts().OpenMPVersion = 31; res.getFrontendOpts().features.Enable( Fortran::common::LanguageFeature::OpenMP); - if (int Version = getLastArgIntValue( - args, clang::driver::options::OPT_fopenmp_version_EQ, - res.getLangOpts().OpenMPVersion, diags)) { - res.getLangOpts().OpenMPVersion = Version; + if (auto *arg = + args.getLastArg(clang::driver::options::OPT_fopenmp_version_EQ)) { + llvm::ArrayRef<unsigned> ompVersions = llvm::omp::getOpenMPVersions(); + unsigned oldVersions[] = {11, 20, 25, 30}; + unsigned version = 0; + + auto reportBadVersion = [&](llvm::StringRef value) { + const unsigned diagID = + diags.getCustomDiagID(clang::DiagnosticsEngine::Error, + "'%0' is not a valid OpenMP version in '%1', " + "valid versions are %2"); + std::string buffer; + llvm::raw_string_ostream versions(buffer); + llvm::interleaveComma(ompVersions, versions); + + diags.Report(diagID) << value << arg->getAsString(args) << versions.str(); + }; + + llvm::StringRef value = arg->getValue(); + if (!value.getAsInteger(/*radix=*/10, version)) { + if (llvm::is_contained(ompVersions, version)) { + res.getLangOpts().OpenMPVersion = version; + } else if (llvm::is_contained(oldVersions, version)) { + const unsigned diagID = + diags.getCustomDiagID(clang::DiagnosticsEngine::Warning, + "OpenMP version %0 is no longer supported, " + "assuming version %1"); + std::string assumed = std::to_string(res.getLangOpts().OpenMPVersion); + diags.Report(diagID) << value << assumed; + } else { + reportBadVersion(value); + } + } else { + reportBadVersion(value); + } } + if (args.hasArg(clang::driver::options::OPT_fopenmp_force_usm)) { res.getLangOpts().OpenMPForceUSM = 1; } |