Index: flang/test/Driver/mllvm_vs_mmlir.f90
===================================================================
--- /dev/null
+++ flang/test/Driver/mllvm_vs_mmlir.f90
@@ -0,0 +1,18 @@
+! Verify that `-mllvm` options are forwarded to LLVM and `-mmlir` to MLIR
+
+!------------
+! 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-{{.*}}
+! MLIR-NOT: --print-ir-after-all
+
+! MLLVM: flang (LLVM option parsing) [options]
+! MLLVM: --print-ir-after-all
+! MLLVM-NOT: --mlir-{{.*}}
Index: flang/test/Driver/driver-help.f90
===================================================================
--- flang/test/Driver/driver-help.f90
+++ flang/test/Driver/driver-help.f90
@@ -48,6 +48,7 @@
! HELP-NEXT: -help Display available options
! HELP-NEXT: -I
Add directory to the end of the list of include search paths
! HELP-NEXT: -mllvm Additional arguments to forward to LLVM's option processing
+! HELP-NEXT: -mmlir Additional arguments to forward to MLIR's option processing
! HELP-NEXT: -module-dir Put MODULE files in
! HELP-NEXT: -nocpp Disable predefined and command line preprocessor macros
! HELP-NEXT: -o Write output to
@@ -123,6 +124,7 @@
! HELP-FC1-NEXT: -I Add directory to the end of the list of include search paths
! HELP-FC1-NEXT: -load Load the named plugin (dynamic shared object)
! HELP-FC1-NEXT: -mllvm Additional arguments to forward to LLVM's option processing
+! HELP-FC1-NEXT: -mmlir Additional arguments to forward to MLIR's option processing
! HELP-FC1-NEXT: -module-dir Put MODULE files in
! HELP-FC1-NEXT: -module-suffix Use as the suffix for module files (the default value is `.mod`)
! HELP-FC1-NEXT: -nocpp Disable predefined and command line preprocessor macros
Index: flang/test/Driver/driver-help-hidden.f90
===================================================================
--- flang/test/Driver/driver-help-hidden.f90
+++ flang/test/Driver/driver-help-hidden.f90
@@ -48,6 +48,7 @@
! CHECK-NEXT: -help Display available options
! CHECK-NEXT: -I Add directory to the end of the list of include search paths
! CHECK-NEXT: -mllvm Additional arguments to forward to LLVM's option processing
+! CHECK-NEXT: -mmlir Additional arguments to forward to MLIR's option processing
! CHECK-NEXT: -module-dir Put MODULE files in
! CHECK-NEXT: -nocpp Disable predefined and command line preprocessor macros
! CHECK-NEXT: -o Write output to
Index: flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
===================================================================
--- flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
+++ flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
@@ -11,6 +11,8 @@
//
//===----------------------------------------------------------------------===//
+#include "mlir/IR/MLIRContext.h"
+#include "mlir/Pass/PassManager.h"
#include "flang/Frontend/CompilerInstance.h"
#include "flang/Frontend/FrontendActions.h"
#include "flang/Frontend/FrontendPluginRegistry.h"
@@ -148,6 +150,21 @@
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(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;
Index: flang/lib/FrontendTool/CMakeLists.txt
===================================================================
--- flang/lib/FrontendTool/CMakeLists.txt
+++ flang/lib/FrontendTool/CMakeLists.txt
@@ -11,6 +11,7 @@
flangFrontend
clangBasic
clangDriver
+ MLIRPass
LINK_COMPONENTS
Option
Index: flang/lib/Frontend/CompilerInvocation.cpp
===================================================================
--- flang/lib/Frontend/CompilerInvocation.cpp
+++ flang/lib/Frontend/CompilerInvocation.cpp
@@ -596,6 +596,9 @@
res.frontendOpts_.llvmArgs =
args.getAllArgValues(clang::driver::options::OPT_mllvm);
+ res.frontendOpts_.mlirArgs =
+ args.getAllArgValues(clang::driver::options::OPT_mmlir);
+
return success;
}
Index: flang/include/flang/Frontend/FrontendOptions.h
===================================================================
--- flang/include/flang/Frontend/FrontendOptions.h
+++ flang/include/flang/Frontend/FrontendOptions.h
@@ -270,6 +270,10 @@
/// should only be used for debugging and experimental features.
std::vector llvmArgs;
+ /// A list of arguments to forward to MLIR's option processing; this
+ /// should only be used for debugging and experimental features.
+ std::vector mlirArgs;
+
// Return the appropriate input kind for a file extension. For example,
/// "*.f" would return Language::Fortran.
///
Index: clang/lib/Driver/ToolChains/Flang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Flang.cpp
+++ clang/lib/Driver/ToolChains/Flang.cpp
@@ -113,6 +113,11 @@
A->render(Args, CmdArgs);
}
+ for (const Arg *A : Args.filtered(options::OPT_mmlir)) {
+ A->claim();
+ A->render(Args, CmdArgs);
+ }
+
if (Output.isFilename()) {
CmdArgs.push_back("-o");
CmdArgs.push_back(Output.getFilename());
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -3260,6 +3260,8 @@
def mllvm : Separate<["-"], "mllvm">,Flags<[CC1Option,CC1AsOption,CoreOption,FC1Option,FlangOption]>,
HelpText<"Additional arguments to forward to LLVM's option processing">,
MarshallingInfoStringVector>;
+def mmlir : Separate<["-"], "mmlir">,Flags<[CoreOption,FC1Option,FlangOption]>,
+ HelpText<"Additional arguments to forward to MLIR's option processing">;
def ffuchsia_api_level_EQ : Joined<["-"], "ffuchsia-api-level=">,
Group, Flags<[CC1Option]>, HelpText<"Set Fuchsia API level">,
MarshallingInfoInt>;