aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorArnamoy Bhattacharyya <arnamoy10@gmail.com>2021-03-03 16:28:11 +0000
committerAndrzej Warzynski <andrzej.warzynski@arm.com>2021-03-04 13:29:07 +0000
commitab971c29a56a4c24359b499d05c30c8c9fc4dea3 (patch)
tree7db681cec16f93dca693c4d4893827d026836f45 /flang/lib/Frontend/CompilerInvocation.cpp
parenta1155ae64dc7f3672e81ff7db4f58a371d36e9f0 (diff)
downloadllvm-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.cpp54
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)