arnamoy10 created this revision.
arnamoy10 added reviewers: awarzynski, sscalpone, clementval, tskeith, 
AMDChirag, SouraVX.
Herald added a subscriber: dang.
Herald added a reviewer: jansvoboda11.
arnamoy10 requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added subscribers: cfe-commits, sstefan1.
Herald added a project: clang.

Add support for the following Fortran dialect options:

- -default*
- -flarge-sizes

It also adds a test case for checking whether `flang-new` is passing options 
correctly to `flang-new -fc1`.

Also moves the Dialect related option parsing to a dedicated function.

Depends on: D96032 <https://reviews.llvm.org/D96032>


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D96344

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Flang.cpp
  flang/include/flang/Frontend/CompilerInvocation.h
  flang/lib/Frontend/CompilerInvocation.cpp
  flang/test/Flang-Driver/pipeline.f90

Index: flang/test/Flang-Driver/pipeline.f90
===================================================================
--- /dev/null
+++ flang/test/Flang-Driver/pipeline.f90
@@ -0,0 +1,14 @@
+! Test that flang can forward all of the flags which are documented as
+! being supported by gfortran to flang-new for a fortran input file.
+!
+! RUN: %flang-new -fsyntax-only -### %s -o %t 2>&1 \
+! RUN:     -fdefault-double-8 \
+! RUN:     -fdefault-integer-8 \
+! RUN:     -fdefault-real-8 \
+! RUN:   | FileCheck %s
+!
+!
+! CHECK: "-fdefault-double-8"
+! CHECK: "-fdefault-integer-8"
+! CHECK: "-fdefault-real-8"
+
Index: flang/lib/Frontend/CompilerInvocation.cpp
===================================================================
--- flang/lib/Frontend/CompilerInvocation.cpp
+++ flang/lib/Frontend/CompilerInvocation.cpp
@@ -200,13 +200,6 @@
     }
   }
 
-  // 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);
-  }
   return dashX;
 }
 
@@ -251,6 +244,38 @@
     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) {
+
+ // -fedefault* family
+ if (args.hasArg(clang::driver::options::OPT_fdefault_real_8))
+         res.dialectOpts().dfltReal = true;
+ if (args.hasArg(clang::driver::options::OPT_fdefault_integer_8))
+         res.dialectOpts().dfltInt = true;
+ if (args.hasArg(clang::driver::options::OPT_fdefault_double_8)) {
+         if (!res.dialectOpts().dfltReal) {
+           const unsigned diagID =
+           diags.getCustomDiagID(clang::DiagnosticsEngine::Error,
+             "Use of `-fdefault-double-8` requires `-fdefault-real-8`");
+           diags.Report(diagID);
+         }
+         res.dialectOpts().dfltDouble = true;
+ }
+ if (args.hasArg(clang::driver::options::OPT_flarge_sizes)) 
+         res.dialectOpts().largeSizes = true;
+
+ // -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) {
@@ -282,6 +307,8 @@
   parsePreprocessorArgs(res.preprocessorOpts(), args);
   // Parse semantic args
   parseSemaArgs(res.moduleDir(), args, diags);
+  // Parse dialect arguments
+  parseDialectArgs(res, args, diags);
 
   return success;
 }
@@ -389,8 +416,19 @@
     Fortran::parser::AllCookedSources &allCookedSources) {
   const auto &fortranOptions = fortranOpts();
 
+  defaultKinds_ = std::make_unique<Fortran::common::IntrinsicTypeDefaultKinds>();
+  if (this->dialectOpts_.dfltDouble) defaultKinds().set_defaultRealKind(4);
+  if (this->dialectOpts_.dfltReal) defaultKinds().set_defaultRealKind(8); 
+  if (this->dialectOpts_.dfltInt) {
+    defaultKinds().set_defaultIntegerKind(8);
+    defaultKinds().set_subscriptIntegerKind(8);
+    defaultKinds().set_sizeIntegerKind(8);
+    // TODO: Set more options based on PGF90
+  }
+  if (this->dialectOpts_.largeSizes) defaultKinds().set_sizeIntegerKind(8); 
+
   semanticsContext_ = std::make_unique<semantics::SemanticsContext>(
-      *(new Fortran::common::IntrinsicTypeDefaultKinds()),
+      defaultKinds(),
       fortranOptions.features, allCookedSources);
 
   auto &moduleDirJ = moduleDir();
Index: flang/include/flang/Frontend/CompilerInvocation.h
===================================================================
--- flang/include/flang/Frontend/CompilerInvocation.h
+++ flang/include/flang/Frontend/CompilerInvocation.h
@@ -19,6 +19,13 @@
 
 namespace Fortran::frontend {
 
+struct DialectOptions {
+    DialectOptions() {}
+    bool dfltReal{false};
+    bool dfltInt{false};
+    bool dfltDouble{false};
+    bool largeSizes{false};
+};
 /// Fill out Opts based on the options given in Args.
 ///
 /// When errors are encountered, return false and, if Diags is non-null,
@@ -69,6 +76,10 @@
   // of options.
   std::string moduleDir_ = ".";
 
+  // Fortran Dialect options
+  std::unique_ptr<Fortran::common::IntrinsicTypeDefaultKinds> defaultKinds_;
+  Fortran::frontend::DialectOptions dialectOpts_;
+
 public:
   CompilerInvocation() = default;
 
@@ -88,6 +99,12 @@
   std::string &moduleDir() { return moduleDir_; }
   const std::string &moduleDir() const { return moduleDir_; }
 
+  Fortran::common::IntrinsicTypeDefaultKinds &defaultKinds() { return *defaultKinds_; }
+  const Fortran::common::IntrinsicTypeDefaultKinds &defaultKinds() const { return *defaultKinds_; }
+
+  Fortran::frontend::DialectOptions &dialectOpts() { return dialectOpts_; }
+  const Fortran::frontend::DialectOptions &dialectOpts() const { return dialectOpts_; }
+
   /// Create a compiler invocation from a list of input options.
   /// \returns true on success.
   /// \returns false if an error was encountered while parsing the arguments
Index: clang/lib/Driver/ToolChains/Flang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Flang.cpp
+++ clang/lib/Driver/ToolChains/Flang.cpp
@@ -23,7 +23,9 @@
                                      ArgStringList &CmdArgs) const {
   Args.AddAllArgs(CmdArgs, {options::OPT_ffixed_form, options::OPT_ffree_form,
                             options::OPT_ffixed_line_length_EQ,
-                            options::OPT_fopenmp, options::OPT_fopenacc});
+                            options::OPT_fopenmp, options::OPT_fopenacc,
+			    options::OPT_fdefault_real_8, options::OPT_fdefault_integer_8,
+			    options::OPT_fdefault_double_8, options::OPT_flarge_sizes});
 }
 
 void Flang::AddPreprocessingOptions(const ArgList &Args,
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -4160,9 +4160,10 @@
 defm cray_pointer : BooleanFFlag<"cray-pointer">, Group<gfortran_Group>;
 defm d_lines_as_code : BooleanFFlag<"d-lines-as-code">, Group<gfortran_Group>;
 defm d_lines_as_comments : BooleanFFlag<"d-lines-as-comments">, Group<gfortran_Group>;
-defm default_double_8 : BooleanFFlag<"default-double-8">, Group<gfortran_Group>;
-defm default_integer_8 : BooleanFFlag<"default-integer-8">, Group<gfortran_Group>;
-defm default_real_8 : BooleanFFlag<"default-real-8">, Group<gfortran_Group>;
+defm default_double_8 : BooleanFFlag<"default-double-8">, Group<gfortran_Group>, Flags<[FlangOption,FC1Option]>;
+defm default_integer_8 : BooleanFFlag<"default-integer-8">, Group<gfortran_Group>, Flags<[FlangOption,FC1Option]>;
+defm default_real_8 : BooleanFFlag<"default-real-8">, Group<gfortran_Group>, Flags<[FlangOption,FC1Option]>;
+defm large_sizes : BooleanFFlag<"large-sizes">, Group<gfortran_Group>, Flags<[FlangOption,FC1Option]>;
 defm dollar_ok : BooleanFFlag<"dollar-ok">, Group<gfortran_Group>;
 defm dump_fortran_optimized : BooleanFFlag<"dump-fortran-optimized">, Group<gfortran_Group>;
 defm dump_fortran_original : BooleanFFlag<"dump-fortran-original">, Group<gfortran_Group>;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to