diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -5273,8 +5273,6 @@ HelpText<"Run static analysis engine">; def dump_tokens : Flag<["-"], "dump-tokens">, HelpText<"Run preprocessor, dump internal rep of tokens">; -def init_only : Flag<["-"], "init-only">, - HelpText<"Only execute frontend initialization">; def fixit : Flag<["-"], "fixit">, HelpText<"Apply fix-it advice to the input source">; def fixit_EQ : Joined<["-"], "fixit=">, @@ -5740,6 +5738,8 @@ def emit_obj : Flag<["-"], "emit-obj">, HelpText<"Emit native object files">; +def init_only : Flag<["-"], "init-only">, + HelpText<"Only execute frontend initialization">; } // let Group = Action_Group } // let Flags = [CC1Option, FC1Option, NoDriverOption] diff --git a/flang/include/flang/Frontend/FrontendActions.h b/flang/include/flang/Frontend/FrontendActions.h --- a/flang/include/flang/Frontend/FrontendActions.h +++ b/flang/include/flang/Frontend/FrontendActions.h @@ -38,6 +38,10 @@ void ExecuteAction() override; }; +class InitOnlyAction : public FrontendAction { + void ExecuteAction() override; +}; + //===----------------------------------------------------------------------===// // Prescan Actions //===----------------------------------------------------------------------===// diff --git a/flang/include/flang/Frontend/FrontendOptions.h b/flang/include/flang/Frontend/FrontendOptions.h --- a/flang/include/flang/Frontend/FrontendOptions.h +++ b/flang/include/flang/Frontend/FrontendOptions.h @@ -71,7 +71,10 @@ GetDefinition, /// Parse, run semantics and then dump symbol sources map - GetSymbolsSources + GetSymbolsSources, + + /// Only execute frontend initialization + InitOnly /// TODO: RunPreprocessor, EmitLLVM, EmitLLVMOnly, /// EmitCodeGenOnly, EmitAssembly, (...) diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -162,9 +162,12 @@ case clang::driver::options::OPT_fget_definition: opts.programAction_ = GetDefinition; break; + case clang::driver::options::OPT_init_only: + opts.programAction_ = InitOnly; + break; // TODO: - // case calng::driver::options::OPT_emit_llvm: + // case clang::driver::options::OPT_emit_llvm: // case clang::driver::options::OPT_emit_llvm_only: // case clang::driver::options::OPT_emit_codegen_only: // case clang::driver::options::OPT_emit_module: diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -447,3 +447,11 @@ clang::DiagnosticsEngine::Error, "code-generation is not available yet"); ci.diagnostics().Report(DiagID); } + +void InitOnlyAction::ExecuteAction() { + CompilerInstance &ci = this->instance(); + unsigned DiagID = + ci.diagnostics().getCustomDiagID(clang::DiagnosticsEngine::Warning, + "Use `-init-only` for testing purposes only"); + ci.diagnostics().Report(DiagID); +} diff --git a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp --- a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -73,6 +73,9 @@ case GetSymbolsSources: return std::make_unique(); break; + case InitOnly: + return std::make_unique(); + break; default: break; // TODO: diff --git a/flang/test/Driver/driver-help.f90 b/flang/test/Driver/driver-help.f90 --- a/flang/test/Driver/driver-help.f90 +++ b/flang/test/Driver/driver-help.f90 @@ -104,6 +104,7 @@ ! HELP-FC1-NEXT: -fopenmp Parse OpenMP pragmas and generate parallel code. ! HELP-FC1-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV. ! HELP-FC1-NEXT: -help Display available options +! HELP-FC1-NEXT: -init-only Only execute frontend initialization ! HELP-FC1-NEXT: -I Add directory to the end of the list of include search paths ! 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`) diff --git a/flang/test/Driver/init-only.f90 b/flang/test/Driver/init-only.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Driver/init-only.f90 @@ -0,0 +1,7 @@ +! Verify that -init-only flag generates a diagnostic as expected + +! REQUIRES: new-flang-driver + +! RUN: %flang_fc1 -init-only 2>&1 | FileCheck %s + +! CHECK: warning: Use `-init-only` for testing purposes only