diff options
author | Arnamoy Bhattacharyya <arnamoy10@gmail.com> | 2021-03-03 16:28:11 +0000 |
---|---|---|
committer | Andrzej Warzynski <andrzej.warzynski@arm.com> | 2021-03-04 13:29:07 +0000 |
commit | ab971c29a56a4c24359b499d05c30c8c9fc4dea3 (patch) | |
tree | 7db681cec16f93dca693c4d4893827d026836f45 /flang/lib/Frontend/CompilerInvocation.cpp | |
parent | a1155ae64dc7f3672e81ff7db4f58a371d36e9f0 (diff) | |
download | llvm-ab971c29a56a4c24359b499d05c30c8c9fc4dea3.zip llvm-ab971c29a56a4c24359b499d05c30c8c9fc4dea3.tar.gz llvm-ab971c29a56a4c24359b499d05c30c8c9fc4dea3.tar.bz2 |
[flang][driver] Add options for -fdefault* and -flarge-sizes
Add support for the following Fortran dialect options:
- -default*
- -flarge-sizes
It also adds two test cases:
# For checking whether `flang-new` is passing options correctly to `flang-new -fc1`.
# For checking if `fdefault-` arguments are processed properly.
Also moves the Dialect related option parsing to a dedicated function
and adds a member `defaultKinds()` to `CompilerInvocation`
Depends on: D96032
Differential Revision: https://reviews.llvm.org/D96344
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | flang/lib/Frontend/CompilerInvocation.cpp | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 822bf26..0dc7e7c 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -221,13 +221,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &opts, } } - // Extensions - if (args.hasArg(clang::driver::options::OPT_fopenacc)) { - opts.features_.Enable(Fortran::common::LanguageFeature::OpenACC); - } - if (args.hasArg(clang::driver::options::OPT_fopenmp)) { - opts.features_.Enable(Fortran::common::LanguageFeature::OpenMP); - } if (const llvm::opt::Arg *arg = args.getLastArg(clang::driver::options::OPT_fimplicit_none, clang::driver::options::OPT_fno_implicit_none)) { @@ -315,6 +308,48 @@ static void parseSemaArgs(std::string &moduleDir, llvm::opt::ArgList &args, moduleDir = moduleDirList[0]; } +/// Parses all Dialect related arguments and populates the variables +/// options accordingly. +static void parseDialectArgs(CompilerInvocation &res, llvm::opt::ArgList &args, + clang::DiagnosticsEngine &diags) { + + // -fdefault* family + if (args.hasArg(clang::driver::options::OPT_fdefault_real_8)) { + res.defaultKinds().set_defaultRealKind(8); + res.defaultKinds().set_doublePrecisionKind(16); + } + if (args.hasArg(clang::driver::options::OPT_fdefault_integer_8)) { + res.defaultKinds().set_defaultIntegerKind(8); + res.defaultKinds().set_subscriptIntegerKind(8); + res.defaultKinds().set_sizeIntegerKind(8); + } + if (args.hasArg(clang::driver::options::OPT_fdefault_double_8)) { + if (!args.hasArg(clang::driver::options::OPT_fdefault_real_8)) { + // -fdefault-double-8 has to be used with -fdefault-real-8 + // to be compatible with gfortran + const unsigned diagID = + diags.getCustomDiagID(clang::DiagnosticsEngine::Error, + "Use of `-fdefault-double-8` requires `-fdefault-real-8`"); + diags.Report(diagID); + } + // https://gcc.gnu.org/onlinedocs/gfortran/Fortran-Dialect-Options.html + res.defaultKinds().set_doublePrecisionKind(8); + } + if (args.hasArg(clang::driver::options::OPT_flarge_sizes)) + res.defaultKinds().set_sizeIntegerKind(8); + + // -fopenmp and -fopenacc + if (args.hasArg(clang::driver::options::OPT_fopenacc)) { + res.frontendOpts().features_.Enable( + Fortran::common::LanguageFeature::OpenACC); + } + if (args.hasArg(clang::driver::options::OPT_fopenmp)) { + res.frontendOpts().features_.Enable( + Fortran::common::LanguageFeature::OpenMP); + } + return; +} + bool CompilerInvocation::CreateFromArgs(CompilerInvocation &res, llvm::ArrayRef<const char *> commandLineArgs, clang::DiagnosticsEngine &diags) { @@ -346,6 +381,8 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &res, parsePreprocessorArgs(res.preprocessorOpts(), args); // Parse semantic args parseSemaArgs(res.moduleDir(), args, diags); + // Parse dialect arguments + parseDialectArgs(res, args, diags); return success; } @@ -454,8 +491,7 @@ void CompilerInvocation::setSemanticsOpts( const auto &fortranOptions = fortranOpts(); semanticsContext_ = std::make_unique<semantics::SemanticsContext>( - *(new Fortran::common::IntrinsicTypeDefaultKinds()), - fortranOptions.features, allCookedSources); + defaultKinds(), fortranOptions.features, allCookedSources); auto &moduleDirJ = moduleDir(); semanticsContext_->set_moduleDirectory(moduleDirJ) |