aboutsummaryrefslogtreecommitdiff
path: root/flang
diff options
context:
space:
mode:
authorAndrzej Warzynski <andrzej.warzynski@arm.com>2022-04-07 09:47:23 +0000
committerAndrzej Warzynski <andrzej.warzynski@arm.com>2022-04-14 09:40:31 +0000
commit6c93e1d329e6c6ef828ec63c66f4cb39ee9cb9ce (patch)
tree9d696f12500ac390d43e7c2628ae1f2833a9e7d8 /flang
parent04a3f3f167dbf90fb11524c00af5313c2b135ad3 (diff)
downloadllvm-6c93e1d329e6c6ef828ec63c66f4cb39ee9cb9ce.zip
llvm-6c93e1d329e6c6ef828ec63c66f4cb39ee9cb9ce.tar.gz
llvm-6c93e1d329e6c6ef828ec63c66f4cb39ee9cb9ce.tar.bz2
[flang][driver] Add support for `-mmlir`
The semantics of `-mmlir` are identical to `-mllvm`. The only notable difference is that `-mmlir` options should be forwarded to MLIR rather than LLVM. Note that MLIR llvm::cl options are lazily constructed on demand (see the definition of options in PassManagerOptions.cpp). This means that: * MLIR global options are only visible when explicitly initialised and displayed only when using `-mmlir --help`, * Flang and LLVM global options are always visible and displayed when using either `-mllvm -help` or `-mmlir --help`. In other words, `-mmlir --help` is a superset of `-mllvm --help`. This is not ideal, but we'd need to refactor all option definitions in Flang and LLVM to improve this. I suggesting leaving this for later. Differential Revision: https://reviews.llvm.org/D123297
Diffstat (limited to 'flang')
-rw-r--r--flang/include/flang/Frontend/FrontendOptions.h4
-rw-r--r--flang/lib/Frontend/CompilerInvocation.cpp3
-rw-r--r--flang/lib/Frontend/FrontendActions.cpp1
-rw-r--r--flang/lib/FrontendTool/CMakeLists.txt1
-rw-r--r--flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp17
-rw-r--r--flang/test/Driver/driver-help-hidden.f901
-rw-r--r--flang/test/Driver/driver-help.f902
-rw-r--r--flang/test/Driver/mllvm_vs_mmlir.f9019
8 files changed, 48 insertions, 0 deletions
diff --git a/flang/include/flang/Frontend/FrontendOptions.h b/flang/include/flang/Frontend/FrontendOptions.h
index d0459e4b..ab08517 100644
--- a/flang/include/flang/Frontend/FrontendOptions.h
+++ b/flang/include/flang/Frontend/FrontendOptions.h
@@ -273,6 +273,10 @@ struct FrontendOptions {
/// should only be used for debugging and experimental features.
std::vector<std::string> llvmArgs;
+ /// A list of arguments to forward to MLIR's option processing; this
+ /// should only be used for debugging and experimental features.
+ std::vector<std::string> mlirArgs;
+
// Return the appropriate input kind for a file extension. For example,
/// "*.f" would return Language::Fortran.
///
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index ea5accd7..0f0db57 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -597,6 +597,9 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &res,
res.frontendOpts_.llvmArgs =
args.getAllArgValues(clang::driver::options::OPT_mllvm);
+ res.frontendOpts_.mlirArgs =
+ args.getAllArgValues(clang::driver::options::OPT_mmlir);
+
return success;
}
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp
index a05c2e2..83e795c 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -427,6 +427,7 @@ void CodeGenAction::GenerateLLVMIR() {
// Create the pass pipeline
fir::createMLIRToLLVMPassPipeline(pm);
+ mlir::applyPassManagerCLOptions(pm);
// Run the pass manager
if (!mlir::succeeded(pm.run(*mlirModule))) {
diff --git a/flang/lib/FrontendTool/CMakeLists.txt b/flang/lib/FrontendTool/CMakeLists.txt
index 1a29f4a..0753313 100644
--- a/flang/lib/FrontendTool/CMakeLists.txt
+++ b/flang/lib/FrontendTool/CMakeLists.txt
@@ -11,6 +11,7 @@ add_flang_library(flangFrontendTool
flangFrontend
clangBasic
clangDriver
+ MLIRPass
LINK_COMPONENTS
Option
diff --git a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
index 04e00e5..bc2bf1dc 100644
--- a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
+++ b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
@@ -19,6 +19,8 @@
#include "llvm/Option/Option.h"
#include "llvm/Support/BuryPointer.h"
#include "llvm/Support/CommandLine.h"
+#include "mlir/IR/MLIRContext.h"
+#include "mlir/Pass/PassManager.h"
namespace Fortran::frontend {
@@ -150,6 +152,21 @@ bool ExecuteCompilerInvocation(CompilerInstance *flang) {
llvm::cl::ParseCommandLineOptions(numArgs + 1, args.get());
}
+ // Honor -mmlir. This should happen AFTER plugins have been loaded!
+ if (!flang->frontendOpts().mlirArgs.empty()) {
+ mlir::registerMLIRContextCLOptions();
+ mlir::registerPassManagerCLOptions();
+ unsigned numArgs = flang->frontendOpts().mlirArgs.size();
+ auto args = std::make_unique<const char *[]>(numArgs + 2);
+ args[0] = "flang (MLIR option parsing)";
+
+ for (unsigned i = 0; i != numArgs; ++i)
+ args[i + 1] = flang->frontendOpts().mlirArgs[i].c_str();
+
+ args[numArgs + 1] = nullptr;
+ llvm::cl::ParseCommandLineOptions(numArgs + 1, args.get());
+ }
+
// If there were errors in processing arguments, don't do anything else.
if (flang->diagnostics().hasErrorOccurred()) {
return false;
diff --git a/flang/test/Driver/driver-help-hidden.f90 b/flang/test/Driver/driver-help-hidden.f90
index 48b5a93..6b38d0a 100644
--- a/flang/test/Driver/driver-help-hidden.f90
+++ b/flang/test/Driver/driver-help-hidden.f90
@@ -48,6 +48,7 @@
! CHECK-NEXT: -help Display available options
! CHECK-NEXT: -I <dir> Add directory to the end of the list of include search paths
! CHECK-NEXT: -mllvm <value> Additional arguments to forward to LLVM's option processing
+! CHECK-NEXT: -mmlir <value> Additional arguments to forward to MLIR's option processing
! CHECK-NEXT: -module-dir <dir> Put MODULE files in <dir>
! CHECK-NEXT: -nocpp Disable predefined and command line preprocessor macros
! CHECK-NEXT: -o <file> Write output to <file>
diff --git a/flang/test/Driver/driver-help.f90 b/flang/test/Driver/driver-help.f90
index 3ebc620..6982e40 100644
--- a/flang/test/Driver/driver-help.f90
+++ b/flang/test/Driver/driver-help.f90
@@ -48,6 +48,7 @@
! HELP-NEXT: -help Display available options
! HELP-NEXT: -I <dir> Add directory to the end of the list of include search paths
! HELP-NEXT: -mllvm <value> Additional arguments to forward to LLVM's option processing
+! HELP-NEXT: -mmlir <value> Additional arguments to forward to MLIR's option processing
! HELP-NEXT: -module-dir <dir> Put MODULE files in <dir>
! HELP-NEXT: -nocpp Disable predefined and command line preprocessor macros
! HELP-NEXT: -o <file> Write output to <file>
@@ -124,6 +125,7 @@
! HELP-FC1-NEXT: -I <dir> Add directory to the end of the list of include search paths
! HELP-FC1-NEXT: -load <dsopath> Load the named plugin (dynamic shared object)
! HELP-FC1-NEXT: -mllvm <value> Additional arguments to forward to LLVM's option processing
+! HELP-FC1-NEXT: -mmlir <value> Additional arguments to forward to MLIR's option processing
! HELP-FC1-NEXT: -module-dir <dir> Put MODULE files in <dir>
! HELP-FC1-NEXT: -module-suffix <suffix> Use <suffix> as the suffix for module files (the default value is `.mod`)
! HELP-FC1-NEXT: -nocpp Disable predefined and command line preprocessor macros
diff --git a/flang/test/Driver/mllvm_vs_mmlir.f90 b/flang/test/Driver/mllvm_vs_mmlir.f90
new file mode 100644
index 0000000..bb8a2cb
--- /dev/null
+++ b/flang/test/Driver/mllvm_vs_mmlir.f90
@@ -0,0 +1,19 @@
+! Verify that `-mllvm` options are forwarded to LLVM and `-mmlir` to MLIR.
+
+! In practice, '-mmlir --help' is a super-set of '-mllvm --help' and that limits what we can test here. With a better seperation of
+! LLVM, MLIR and Flang global options, we should be able to write a stricter test.
+
+!------------
+! RUN COMMAND
+!------------
+! RUN: %flang_fc1 -mmlir --help | FileCheck %s --check-prefix=MLIR
+! RUN: %flang_fc1 -mllvm --help | FileCheck %s --check-prefix=MLLVM
+
+!----------------
+! EXPECTED OUTPUT
+!----------------
+! MLIR: flang (MLIR option parsing) [options]
+! MLIR: --mlir-{{.*}}
+
+! MLLVM: flang (LLVM option parsing) [options]
+! MLLVM-NOT: --mlir-{{.*}}