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; defm d_lines_as_code : BooleanFFlag<"d-lines-as-code">, Group; defm d_lines_as_comments : BooleanFFlag<"d-lines-as-comments">, Group; -defm default_double_8 : BooleanFFlag<"default-double-8">, Group; -defm default_integer_8 : BooleanFFlag<"default-integer-8">, Group; -defm default_real_8 : BooleanFFlag<"default-real-8">, Group; +defm default_double_8 : BooleanFFlag<"default-double-8">, Group, Flags<[FlangOption,FC1Option]>; +defm default_integer_8 : BooleanFFlag<"default-integer-8">, Group, Flags<[FlangOption,FC1Option]>; +defm default_real_8 : BooleanFFlag<"default-real-8">, Group, Flags<[FlangOption,FC1Option]>; +defm large_sizes : BooleanFFlag<"large-sizes">, Group, Flags<[FlangOption,FC1Option]>; defm dollar_ok : BooleanFFlag<"dollar-ok">, Group; defm dump_fortran_optimized : BooleanFFlag<"dump-fortran-optimized">, Group; defm dump_fortran_original : BooleanFFlag<"dump-fortran-original">, Group; 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: 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 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: 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 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(); + 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( - *(new Fortran::common::IntrinsicTypeDefaultKinds()), + defaultKinds(), fortranOptions.features, allCookedSources); auto &moduleDirJ = moduleDir(); 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" +