[flang][driver] Add support for the "-init-only" option

Adding the `-init-only` option and corresponding frontend action to
generate a diagnostic.

`-init-only` vs `-test-io`:
`-init-only` ignores the input (it never calls the prescanner)
`-test-io` is similar to `-init-only`, but does read and print the input
without calling the prescanner.

This patch also adds a Driver test to check this action.

Reviewed By: awarzynski, AMDChirag

Differential Revision: https://reviews.llvm.org/D102849
This commit is contained in:
Stuart Ellis 2021-06-07 15:40:26 +01:00 committed by Andrzej Warzynski
parent ae3f6de3a8
commit e1da3297d2
8 changed files with 33 additions and 4 deletions

View File

@ -5273,8 +5273,6 @@ def analyze : Flag<["-"], "analyze">,
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 @@ let Group = Action_Group in {
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]

View File

@ -38,6 +38,10 @@ class EmitObjAction : public FrontendAction {
void ExecuteAction() override;
};
class InitOnlyAction : public FrontendAction {
void ExecuteAction() override;
};
//===----------------------------------------------------------------------===//
// Prescan Actions
//===----------------------------------------------------------------------===//

View File

@ -71,7 +71,10 @@ enum ActionKind {
GetDefinition,
/// Parse, run semantics and then dump symbol sources map
GetSymbolsSources
GetSymbolsSources,
/// Only execute frontend initialization
InitOnly
/// TODO: RunPreprocessor, EmitLLVM, EmitLLVMOnly,
/// EmitCodeGenOnly, EmitAssembly, (...)

View File

@ -162,9 +162,12 @@ static bool ParseFrontendArgs(FrontendOptions &opts, llvm::opt::ArgList &args,
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:

View File

@ -447,3 +447,11 @@ void EmitObjAction::ExecuteAction() {
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);
}

View File

@ -73,6 +73,9 @@ static std::unique_ptr<FrontendAction> CreateFrontendBaseAction(
case GetSymbolsSources:
return std::make_unique<GetSymbolsSourcesAction>();
break;
case InitOnly:
return std::make_unique<InitOnlyAction>();
break;
default:
break;
// TODO:

View File

@ -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 <dir> Add directory to the end of the list of include search paths
! 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`)

View File

@ -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