[flang][driver] Add -fdebug-module-writer option
GitOrigin-RevId: 1fd4beecc8bb1148123265a63e0bff92b626c4a3
diff --git a/include/flang/Frontend/CompilerInvocation.h b/include/flang/Frontend/CompilerInvocation.h
index 9946f3e..3be6f3f 100644
--- a/include/flang/Frontend/CompilerInvocation.h
+++ b/include/flang/Frontend/CompilerInvocation.h
@@ -69,6 +69,8 @@
// of options.
std::string moduleDir_ = ".";
+ bool debugModuleDir_ = false;
+
// Fortran Dialect options
Fortran::common::IntrinsicTypeDefaultKinds defaultKinds_;
@@ -91,6 +93,9 @@
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 @@
llvm::ArrayRef<const char *> 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/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index 1764970..1271cd3 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -306,9 +306,10 @@
/// 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 @@
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 @@
// 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 @@
semanticsContext_ = std::make_unique<semantics::SemanticsContext>(
defaultKinds(), fortranOptions.features, allCookedSources);
- auto &moduleDirJ = moduleDir();
- semanticsContext_->set_moduleDirectory(moduleDirJ)
+ semanticsContext_->set_moduleDirectory(moduleDir())
.set_searchDirectories(fortranOptions.searchDirectories);
}
diff --git a/lib/Frontend/FrontendActions.cpp b/lib/Frontend/FrontendActions.cpp
index f956015..ea283fe 100644
--- a/lib/Frontend/FrontendActions.cpp
+++ b/lib/Frontend/FrontendActions.cpp
@@ -126,7 +126,7 @@
// Prepare semantics
setSemantics(std::make_unique<Fortran::semantics::Semantics>(
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/test/Driver/driver-help.f90 b/test/Driver/driver-help.f90
index 37daeea..c329754 100644
--- a/test/Driver/driver-help.f90
+++ b/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/test/Semantics/mod-file-rewriter.f90 b/test/Semantics/mod-file-rewriter.f90
index 2856dd6..2d393df 100644
--- a/test/Semantics/mod-file-rewriter.f90
+++ b/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)