From 1fd4beecc8bb1148123265a63e0bff92b626c4a3 Mon Sep 17 00:00:00 2001 From: Arnamoy Bhattacharyya Date: Thu, 11 Mar 2021 07:35:45 -0500 Subject: [PATCH] [flang][driver] Add -fdebug-module-writer option --- clang/include/clang/Driver/Options.td | 2 ++ clang/lib/Driver/ToolChains/Flang.cpp | 3 ++- flang/include/flang/Frontend/CompilerInvocation.h | 10 ++++++++++ flang/lib/Frontend/CompilerInvocation.cpp | 15 ++++++++++----- flang/lib/Frontend/FrontendActions.cpp | 2 +- flang/test/Driver/driver-help.f90 | 1 + flang/test/Semantics/mod-file-rewriter.f90 | 8 ++++---- 7 files changed, 30 insertions(+), 11 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 376a3baf0a4b..f4d4ece9baeb 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4367,6 +4367,8 @@ def fdebug_measure_parse_tree : Flag<["-"], "fdebug-measure-parse-tree">, Group< HelpText<"Measure the parse tree">; def fdebug_pre_fir_tree : Flag<["-"], "fdebug-pre-fir-tree">, Group, HelpText<"Dump the pre-FIR tree">; +def fdebug_module_writer : Flag<["-"],"fdebug-module-writer">, + HelpText<"Enable debug messages while writing module files">; } diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 1a812589d473..153a1dfc8592 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -41,7 +41,8 @@ void Flang::AddPreprocessingOptions(const ArgList &Args, } void Flang::AddOtherOptions(const ArgList &Args, ArgStringList &CmdArgs) const { - Args.AddAllArgs(CmdArgs, options::OPT_module_dir); + Args.AddAllArgs(CmdArgs, + {options::OPT_module_dir, options::OPT_fdebug_module_writer}); } void Flang::ConstructJob(Compilation &C, const JobAction &JA, diff --git a/flang/include/flang/Frontend/CompilerInvocation.h b/flang/include/flang/Frontend/CompilerInvocation.h index 9946f3e4a6e6..3be6f3fc4d40 100644 --- a/flang/include/flang/Frontend/CompilerInvocation.h +++ b/flang/include/flang/Frontend/CompilerInvocation.h @@ -69,6 +69,8 @@ class CompilerInvocation : public CompilerInvocationBase { // of options. std::string moduleDir_ = "."; + bool debugModuleDir_ = false; + // Fortran Dialect options Fortran::common::IntrinsicTypeDefaultKinds defaultKinds_; @@ -91,6 +93,9 @@ public: std::string &moduleDir() { return moduleDir_; } const std::string &moduleDir() const { return moduleDir_; } + bool &debugModuleDir() { return debugModuleDir_; } + const bool &debugModuleDir() const { return debugModuleDir_; } + Fortran::common::IntrinsicTypeDefaultKinds &defaultKinds() { return defaultKinds_; } @@ -106,6 +111,11 @@ public: llvm::ArrayRef commandLineArgs, clang::DiagnosticsEngine &diags); + /// Useful setters + void SetModuleDir(std::string &moduleDir) { moduleDir_ = moduleDir; } + + void SetDebugModuleDir(bool flag) { debugModuleDir_ = flag; } + /// Set the Fortran options to predifined defaults. These defaults are /// consistend with f18/f18.cpp. // TODO: We should map frontendOpts_ to parserOpts_ instead. For that, we diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 17649700e0d2..1271cd314831 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -306,9 +306,10 @@ static void parsePreprocessorArgs( /// Parses all semantic related arguments and populates the variables /// options accordingly. -static void parseSemaArgs(std::string &moduleDir, llvm::opt::ArgList &args, +static void parseSemaArgs(CompilerInvocation &res, llvm::opt::ArgList &args, clang::DiagnosticsEngine &diags) { + // -J/module-dir option auto moduleDirList = args.getAllArgValues(clang::driver::options::OPT_module_dir); // User can only specify -J/-module-dir once @@ -320,7 +321,12 @@ static void parseSemaArgs(std::string &moduleDir, llvm::opt::ArgList &args, diags.Report(diagID); } if (moduleDirList.size() == 1) - moduleDir = moduleDirList[0]; + res.SetModuleDir(moduleDirList[0]); + + // -fdebug-module-writer option + if (args.hasArg(clang::driver::options::OPT_fdebug_module_writer)) { + res.SetDebugModuleDir(true); + } } /// Parses all Dialect related arguments and populates the variables @@ -395,7 +401,7 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &res, // Parse the preprocessor args parsePreprocessorArgs(res.preprocessorOpts(), args); // Parse semantic args - parseSemaArgs(res.moduleDir(), args, diags); + parseSemaArgs(res, args, diags); // Parse dialect arguments parseDialectArgs(res, args, diags); @@ -511,7 +517,6 @@ void CompilerInvocation::setSemanticsOpts( semanticsContext_ = std::make_unique( defaultKinds(), fortranOptions.features, allCookedSources); - auto &moduleDirJ = moduleDir(); - semanticsContext_->set_moduleDirectory(moduleDirJ) + semanticsContext_->set_moduleDirectory(moduleDir()) .set_searchDirectories(fortranOptions.searchDirectories); } diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index f956015a3f2f..ea283fe7a0c9 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -126,7 +126,7 @@ bool PrescanAndSemaAction::BeginSourceFileAction(CompilerInstance &c1) { // Prepare semantics setSemantics(std::make_unique( ci.invocation().semanticsContext(), parseTree, - ci.parsing().cooked().AsCharBlock())); + ci.parsing().cooked().AsCharBlock(), ci.invocation().debugModuleDir())); auto &semantics = this->semantics(); // Run semantic checks diff --git a/flang/test/Driver/driver-help.f90 b/flang/test/Driver/driver-help.f90 index 37daeea1c7fd..c32975416f2f 100644 --- a/flang/test/Driver/driver-help.f90 +++ b/flang/test/Driver/driver-help.f90 @@ -68,6 +68,7 @@ ! HELP-FC1-NEXT: -fdebug-dump-symbols Dump symbols after the semantic analysis ! HELP-FC1-NEXT: -fdebug-measure-parse-tree ! HELP-FC1-NEXT: Measure the parse tree +! HELP-FC1-NEXT: -fdebug-module-writer Enable debug messages while writing module files ! HELP-FC1-NEXT: -fdebug-pre-fir-tree Dump the pre-FIR tree ! HELP-FC1-NEXT: -fdebug-unparse-with-symbols ! HELP-FC1-NEXT: Unparse and stop. diff --git a/flang/test/Semantics/mod-file-rewriter.f90 b/flang/test/Semantics/mod-file-rewriter.f90 index 2856dd6dbdf3..2d393dfeca50 100644 --- a/flang/test/Semantics/mod-file-rewriter.f90 +++ b/flang/test/Semantics/mod-file-rewriter.f90 @@ -1,8 +1,8 @@ ! RUN: rm -fr %t && mkdir %t && cd %t -! RUN: %f18 -fsyntax-only -fdebug-module-writer %s 2>&1 | FileCheck %s --check-prefix CHECK_CHANGED -! RUN: %f18 -fsyntax-only -fdebug-module-writer %s 2>&1 | FileCheck %s --check-prefix CHECK_UNCHANGED -! RUN: %f18 -fsyntax-only -fdebug-module-writer %p/Inputs/mod-file-unchanged.f90 2>&1 | FileCheck %s --check-prefix CHECK_UNCHANGED -! RUN: %f18 -fsyntax-only -fdebug-module-writer %p/Inputs/mod-file-changed.f90 2>&1 | FileCheck %s --check-prefix CHECK_CHANGED +! RUN: %flang_fc1 -fsyntax-only -fdebug-module-writer %s 2>&1 | FileCheck %s --check-prefix CHECK_CHANGED +! RUN: %flang_fc1 -fsyntax-only -fdebug-module-writer %s 2>&1 | FileCheck %s --check-prefix CHECK_UNCHANGED +! RUN: %flang_fc1 -fsyntax-only -fdebug-module-writer %p/Inputs/mod-file-unchanged.f90 2>&1 | FileCheck %s --check-prefix CHECK_UNCHANGED +! RUN: %flang_fc1 -fsyntax-only -fdebug-module-writer %p/Inputs/mod-file-changed.f90 2>&1 | FileCheck %s --check-prefix CHECK_CHANGED module m real :: x(10)