From 96d229c9abdfb2836e18a554bfb63b5d52aeebfa Mon Sep 17 00:00:00 2001 From: Andrzej Warzynski Date: Thu, 4 Feb 2021 11:14:57 +0000 Subject: [PATCH] [flang][driver] Add options for unparsing This patch adds the following compiler frontend driver options: * -fdebug-unparse (f18 spelling: -funparse) * -fdebug-unparse-with-symbols (f18 spelling: -funparse-with-symbols) The new driver will only accept the new spelling. `f18` will accept both the original and the new spelling. A new base class for frontend actions is added: `PrescanAndSemaAction`. This is added to reduce code duplication that otherwise these new options would lead to. Implementation from * `ParseSyntaxOnlyAction::ExecutionAction` is moved to: * `PrescanAndSemaAction::BeginSourceFileAction` This implementation is now shared between: * PrescanAndSemaAction * ParseSyntaxOnlyAction * DebugUnparseAction * DebugUnparseWithSymbolsAction All tests that don't require other yet unimplemented options are updated. This way `flang-new -fc1` is used instead of `f18` when `FLANG_BUILD_NEW_DRIVER` is set to `On`. In order to facilitate this, `%flang_fc1` is added in the LIT configuration (lit.cfg.py). `asFortran` from f18.cpp is duplicated as `getBasicAsFortran` in FrontendOptions.cpp. At this stage it's hard to find a good place to share this method. I suggest that we revisit this once a switch from `f18` to `flang-new` is complete. Differential Revision: https://reviews.llvm.org/D96483 --- clang/include/clang/Driver/Options.td | 12 ++ .../include/flang/Frontend/FrontendActions.h | 18 ++- .../include/flang/Frontend/FrontendOptions.h | 12 ++ flang/lib/Frontend/CMakeLists.txt | 1 + flang/lib/Frontend/CompilerInvocation.cpp | 6 + flang/lib/Frontend/FrontendActions.cpp | 119 +++++++++++++----- flang/lib/Frontend/FrontendOptions.cpp | 29 +++++ .../ExecuteCompilerInvocation.cpp | 6 + flang/lib/Parser/CMakeLists.txt | 1 - flang/test/Flang-Driver/driver-help.f90 | 3 + flang/test/Parser/continuation-in-if.f | 2 +- flang/test/Parser/pp-dir-comments.f90 | 2 +- flang/test/Semantics/canondo01.f90 | 2 +- flang/test/Semantics/canondo02.f90 | 2 +- flang/test/Semantics/canondo03.f90 | 2 +- flang/test/Semantics/canondo04.f90 | 2 +- flang/test/Semantics/canondo05.f90 | 2 +- flang/test/Semantics/critical04.f90 | 2 +- flang/test/Semantics/defined-ops.f90 | 2 +- flang/test/Semantics/doconcurrent02.f90 | 2 +- flang/test/Semantics/doconcurrent03.f90 | 2 +- flang/test/Semantics/doconcurrent04.f90 | 2 +- flang/test/Semantics/doconcurrent07.f90 | 2 +- flang/test/Semantics/label02.f90 | 2 +- flang/test/Semantics/label03.f90 | 2 +- flang/test/Semantics/label04.f90 | 2 +- flang/test/Semantics/label05.f90 | 2 +- flang/test/Semantics/label06.f90 | 2 +- flang/test/Semantics/label07.f90 | 2 +- flang/test/Semantics/label08.f90 | 2 +- flang/test/Semantics/label09.f90 | 2 +- flang/test/Semantics/label10.f90 | 2 +- flang/test/Semantics/label12.f90 | 2 +- flang/test/Semantics/label13.f90 | 2 +- flang/test/Semantics/label15.f90 | 2 +- flang/test/lit.cfg.py | 5 + flang/tools/f18/f18.cpp | 5 +- 37 files changed, 206 insertions(+), 61 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index d22956b86c4a..04a23c59e264 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4244,6 +4244,18 @@ def fopenacc : Flag<["-"], "fopenacc">, Group, } +//===----------------------------------------------------------------------===// +// FC1 Options +//===----------------------------------------------------------------------===// +let Flags = [FC1Option, FlangOnlyOption] in { + +def fdebug_unparse : Flag<["-"], "fdebug-unparse">, Group, + HelpText<"Unparse and stop.">; +def fdebug_unparse_with_symbols : Flag<["-"], "fdebug-unparse-with-symbols">, Group, + HelpText<"Unparse and stop.">; + +} + //===----------------------------------------------------------------------===// // CC1 Options //===----------------------------------------------------------------------===// diff --git a/flang/include/flang/Frontend/FrontendActions.h b/flang/include/flang/Frontend/FrontendActions.h index f28e3c2bc552..4c29d0d5a641 100644 --- a/flang/include/flang/Frontend/FrontendActions.h +++ b/flang/include/flang/Frontend/FrontendActions.h @@ -37,7 +37,23 @@ class PrintPreprocessedAction : public PrescanAction { void ExecuteAction() override; }; -class ParseSyntaxOnlyAction : public PrescanAction { +//===----------------------------------------------------------------------===// +// PrescanAndSema Actions +//===----------------------------------------------------------------------===// +class PrescanAndSemaAction : public FrontendAction { + void ExecuteAction() override = 0; + bool BeginSourceFileAction(CompilerInstance &ci) override; +}; + +class DebugUnparseWithSymbolsAction : public PrescanAndSemaAction { + void ExecuteAction() override; +}; + +class DebugUnparseAction : public PrescanAndSemaAction { + void ExecuteAction() override; +}; + +class ParseSyntaxOnlyAction : public PrescanAndSemaAction { void ExecuteAction() override; }; diff --git a/flang/include/flang/Frontend/FrontendOptions.h b/flang/include/flang/Frontend/FrontendOptions.h index 1fc3a55091e1..0df8bdad5e83 100644 --- a/flang/include/flang/Frontend/FrontendOptions.h +++ b/flang/include/flang/Frontend/FrontendOptions.h @@ -9,6 +9,7 @@ #define LLVM_FLANG_FRONTEND_FRONTENDOPTIONS_H #include "flang/Common/Fortran-features.h" +#include "flang/Parser/unparse.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/MemoryBuffer.h" @@ -32,6 +33,13 @@ enum ActionKind { /// Emit a .o file. EmitObj, + /// Parse, unparse the parse-tree and output a Fortran source file + DebugUnparse, + + /// Parse, resolve the sybmols, unparse the parse-tree and then output a + /// Fortran source file + DebugUnparseWithSymbols, + /// TODO: RunPreprocessor, EmitLLVM, EmitLLVMOnly, /// EmitCodeGenOnly, EmitAssembly, (...) }; @@ -40,6 +48,10 @@ enum ActionKind { /// \return True if the file extension should be processed as fixed form bool isFixedFormSuffix(llvm::StringRef suffix); +// TODO: Find a more suitable location for this. Added for compability with +// f18.cpp (this is equivalent to `asFortran` defined there). +Fortran::parser::AnalyzedObjectsAsFortran getBasicAsFortran(); + /// \param suffix The file extension /// \return True if the file extension should be processed as free form bool isFreeFormSuffix(llvm::StringRef suffix); diff --git a/flang/lib/Frontend/CMakeLists.txt b/flang/lib/Frontend/CMakeLists.txt index 095271f567f4..2ef38c557ce5 100644 --- a/flang/lib/Frontend/CMakeLists.txt +++ b/flang/lib/Frontend/CMakeLists.txt @@ -14,6 +14,7 @@ add_flang_library(flangFrontend LINK_LIBS FortranParser FortranSemantics + FortranEvaluate FortranCommon clangBasic clangDriver diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 23cbc21cedfd..8cec2affe483 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -110,6 +110,12 @@ static InputKind ParseFrontendArgs(FrontendOptions &opts, case clang::driver::options::OPT_emit_obj: opts.programAction_ = EmitObj; break; + case clang::driver::options::OPT_fdebug_unparse: + opts.programAction_ = DebugUnparse; + break; + case clang::driver::options::OPT_fdebug_unparse_with_symbols: + opts.programAction_ = DebugUnparseWithSymbols; + break; // TODO: // case calng::driver::options::OPT_emit_llvm: diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 1a26e19bfe98..dc9da4eb7ba2 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -9,10 +9,13 @@ #include "flang/Frontend/FrontendActions.h" #include "flang/Common/default-kinds.h" #include "flang/Frontend/CompilerInstance.h" +#include "flang/Frontend/FrontendOptions.h" #include "flang/Parser/parsing.h" #include "flang/Parser/provenance.h" #include "flang/Parser/source.h" +#include "flang/Parser/unparse.h" #include "flang/Semantics/semantics.h" +#include "flang/Semantics/unparse-with-symbols.h" using namespace Fortran::frontend; @@ -49,6 +52,75 @@ bool PrescanAction::BeginSourceFileAction(CompilerInstance &c1) { return true; } +bool PrescanAndSemaAction::BeginSourceFileAction(CompilerInstance &c1) { + CompilerInstance &ci = this->instance(); + + std::string currentInputPath{GetCurrentFileOrBufferName()}; + + Fortran::parser::Options parserOptions = ci.invocation().fortranOpts(); + + if (ci.invocation().frontendOpts().fortranForm_ == FortranForm::Unknown) { + // Switch between fixed and free form format based on the input file + // extension. + // + // Ideally we should have all Fortran options set before entering this + // method (i.e. before processing any specific input files). However, we + // can't decide between fixed and free form based on the file extension + // earlier than this. + parserOptions.isFixedForm = currentInput().IsFixedForm(); + } + + // Prescan. In case of failure, report and return. + ci.parsing().Prescan(currentInputPath, parserOptions); + + if (ci.parsing().messages().AnyFatalError()) { + const unsigned diagID = ci.diagnostics().getCustomDiagID( + clang::DiagnosticsEngine::Error, "Could not scan %0"); + ci.diagnostics().Report(diagID) << GetCurrentFileOrBufferName(); + ci.parsing().messages().Emit(llvm::errs(), ci.allCookedSources()); + + return false; + } + + // Parse. In case of failure, report and return. + ci.parsing().Parse(llvm::outs()); + + if (ci.parsing().messages().AnyFatalError()) { + unsigned diagID = ci.diagnostics().getCustomDiagID( + clang::DiagnosticsEngine::Error, "Could not parse %0"); + ci.diagnostics().Report(diagID) << GetCurrentFileOrBufferName(); + + ci.parsing().messages().Emit( + llvm::errs(), this->instance().allCookedSources()); + return false; + } + + // Report the diagnostics from parsing + ci.parsing().messages().Emit(llvm::errs(), ci.allCookedSources()); + + auto &parseTree{*ci.parsing().parseTree()}; + + // Prepare semantics + Fortran::semantics::Semantics semantics{ci.invocation().semanticsContext(), + parseTree, ci.parsing().cooked().AsCharBlock()}; + + // Run semantic checks + semantics.Perform(); + + // Report the diagnostics from the semantic checks + semantics.EmitMessages(ci.semaOutputStream()); + + if (semantics.AnyFatalError()) { + unsigned DiagID = ci.diagnostics().getCustomDiagID( + clang::DiagnosticsEngine::Error, "Semantic errors in %0"); + ci.diagnostics().Report(DiagID) << GetCurrentFileOrBufferName(); + + return false; + } + + return true; +} + void InputOutputTestAction::ExecuteAction() { CompilerInstance &ci = instance(); @@ -111,42 +183,25 @@ void PrintPreprocessedAction::ExecuteAction() { } } -void ParseSyntaxOnlyAction::ExecuteAction() { - CompilerInstance &ci = this->instance(); +void ParseSyntaxOnlyAction::ExecuteAction() {} - // Parse. In case of failure, report and return. - ci.parsing().Parse(llvm::outs()); +void DebugUnparseAction::ExecuteAction() { + auto &parseTree{instance().parsing().parseTree()}; + Fortran::parser::AnalyzedObjectsAsFortran asFortran = + Fortran::frontend::getBasicAsFortran(); - if (ci.parsing().messages().AnyFatalError()) { - unsigned diagID = ci.diagnostics().getCustomDiagID( - clang::DiagnosticsEngine::Error, "Could not parse %0"); - ci.diagnostics().Report(diagID) << GetCurrentFileOrBufferName(); + // TODO: Options should come from CompilerInvocation + Unparse(llvm::outs(), *parseTree, + /*encoding=*/Fortran::parser::Encoding::UTF_8, + /*capitalizeKeywords=*/true, /*backslashEscapes=*/false, + /*preStatement=*/nullptr, &asFortran); +} - ci.parsing().messages().Emit( - llvm::errs(), this->instance().allCookedSources()); - return; - } +void DebugUnparseWithSymbolsAction::ExecuteAction() { + auto &parseTree{*instance().parsing().parseTree()}; - // Report the diagnostics from parsing - ci.parsing().messages().Emit(llvm::errs(), ci.allCookedSources()); - - auto &parseTree{*ci.parsing().parseTree()}; - - // Prepare semantics - Fortran::semantics::Semantics semantics{ci.invocation().semanticsContext(), - parseTree, ci.parsing().cooked().AsCharBlock()}; - - // Run semantic checks - semantics.Perform(); - - // Report the diagnostics from the semantic checks - semantics.EmitMessages(ci.semaOutputStream()); - - if (semantics.AnyFatalError()) { - unsigned DiagID = ci.diagnostics().getCustomDiagID( - clang::DiagnosticsEngine::Error, "Semantic errors in %0"); - ci.diagnostics().Report(DiagID) << GetCurrentFileOrBufferName(); - } + Fortran::semantics::UnparseWithSymbols( + llvm::outs(), parseTree, /*encoding=*/Fortran::parser::Encoding::UTF_8); } void EmitObjAction::ExecuteAction() { diff --git a/flang/lib/Frontend/FrontendOptions.cpp b/flang/lib/Frontend/FrontendOptions.cpp index 1f2668fd1e85..a43cac3bb1cb 100644 --- a/flang/lib/Frontend/FrontendOptions.cpp +++ b/flang/lib/Frontend/FrontendOptions.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "flang/Frontend/FrontendOptions.h" +#include "flang/Evaluate/expression.h" using namespace Fortran::frontend; @@ -25,6 +26,34 @@ bool Fortran::frontend::isFreeFormSuffix(llvm::StringRef suffix) { suffix == "f08" || suffix == "F08" || suffix == "f18" || suffix == "F18"; } +// TODO: This is a copy of `asFortran` from f18.cpp and is added here for +// compatiblity. It doesn't really belong here, but I couldn't find a better +// place. We should decide whether to add it to the Evaluate or Parse/Unparse +// APIs or some dedicated utility library in the driver. +Fortran::parser::AnalyzedObjectsAsFortran +Fortran::frontend::getBasicAsFortran() { + return Fortran::parser::AnalyzedObjectsAsFortran{ + [](llvm::raw_ostream &o, const Fortran::evaluate::GenericExprWrapper &x) { + if (x.v) { + x.v->AsFortran(o); + } else { + o << "(bad expression)"; + } + }, + [](llvm::raw_ostream &o, + const Fortran::evaluate::GenericAssignmentWrapper &x) { + if (x.v) { + x.v->AsFortran(o); + } else { + o << "(bad assignment)"; + } + }, + [](llvm::raw_ostream &o, const Fortran::evaluate::ProcedureRef &x) { + x.AsFortran(o << "CALL "); + }, + }; +} + InputKind FrontendOptions::GetInputKindForExtension(llvm::StringRef extension) { if (isFixedFormSuffix(extension) || isFreeFormSuffix(extension)) { return Language::Fortran; diff --git a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp index 50c9fca0b882..12f538c929fd 100644 --- a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -37,6 +37,12 @@ static std::unique_ptr CreateFrontendBaseAction( case EmitObj: return std::make_unique(); break; + case DebugUnparse: + return std::make_unique(); + break; + case DebugUnparseWithSymbols: + return std::make_unique(); + break; default: break; // TODO: diff --git a/flang/lib/Parser/CMakeLists.txt b/flang/lib/Parser/CMakeLists.txt index 9ee416803177..600a2f67df44 100644 --- a/flang/lib/Parser/CMakeLists.txt +++ b/flang/lib/Parser/CMakeLists.txt @@ -1,4 +1,3 @@ - add_flang_library(FortranParser Fortran-parsers.cpp char-buffer.cpp diff --git a/flang/test/Flang-Driver/driver-help.f90 b/flang/test/Flang-Driver/driver-help.f90 index 55a989f2faab..7d2bf00614e6 100644 --- a/flang/test/Flang-Driver/driver-help.f90 +++ b/flang/test/Flang-Driver/driver-help.f90 @@ -46,6 +46,9 @@ ! HELP-FC1-NEXT: -D = Define to (or 1 if omitted) ! HELP-FC1-NEXT: -emit-obj Emit native object files ! HELP-FC1-NEXT: -E Only run the preprocessor +! HELP-FC1-NEXT: -fdebug-unparse-with-symbols +! HELP-FC1-NEXT: Unparse and stop. +! HELP-FC1-NEXT: -fdebug-unparse Unparse and stop. ! HELP-FC1-NEXT: -ffixed-form Process source files in fixed form ! HELP-FC1-NEXT: -ffixed-line-length= ! HELP-FC1-NEXT: Use as character line width in fixed mode diff --git a/flang/test/Parser/continuation-in-if.f b/flang/test/Parser/continuation-in-if.f index 928170eb6cd5..684e9188b716 100644 --- a/flang/test/Parser/continuation-in-if.f +++ b/flang/test/Parser/continuation-in-if.f @@ -1,4 +1,4 @@ -! RUN: %f18 -funparse %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s ! CHECK: CALL foo("N","N") #ifdef transpose call foo('T', diff --git a/flang/test/Parser/pp-dir-comments.f90 b/flang/test/Parser/pp-dir-comments.f90 index f5fe4ca5c71e..14d2552e9045 100644 --- a/flang/test/Parser/pp-dir-comments.f90 +++ b/flang/test/Parser/pp-dir-comments.f90 @@ -1,4 +1,4 @@ -! RUN: %f18 -funparse %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s #define pmk #ifdef pmk // comment diff --git a/flang/test/Semantics/canondo01.f90 b/flang/test/Semantics/canondo01.f90 index 3379953b12d7..50ffa489019e 100644 --- a/flang/test/Semantics/canondo01.f90 +++ b/flang/test/Semantics/canondo01.f90 @@ -1,5 +1,5 @@ -! RUN: %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: end do SUBROUTINE sub00(a,b,n,m) diff --git a/flang/test/Semantics/canondo02.f90 b/flang/test/Semantics/canondo02.f90 index 69745c4ef458..1a2252ab4546 100644 --- a/flang/test/Semantics/canondo02.f90 +++ b/flang/test/Semantics/canondo02.f90 @@ -1,5 +1,5 @@ -! RUN: %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: end do SUBROUTINE sub00(a,b,n,m) diff --git a/flang/test/Semantics/canondo03.f90 b/flang/test/Semantics/canondo03.f90 index 55b3fd2fe8f1..516840b40d09 100644 --- a/flang/test/Semantics/canondo03.f90 +++ b/flang/test/Semantics/canondo03.f90 @@ -1,5 +1,5 @@ -! RUN: %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: 10 continue ! CHECK: end do diff --git a/flang/test/Semantics/canondo04.f90 b/flang/test/Semantics/canondo04.f90 index b252c9820159..ea955230b5ad 100644 --- a/flang/test/Semantics/canondo04.f90 +++ b/flang/test/Semantics/canondo04.f90 @@ -1,4 +1,4 @@ -! RUN: %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK-NOT: do [1-9] ! Figure out how to also execute this test. diff --git a/flang/test/Semantics/canondo05.f90 b/flang/test/Semantics/canondo05.f90 index 788dc7a5de89..0de34f18fb7c 100644 --- a/flang/test/Semantics/canondo05.f90 +++ b/flang/test/Semantics/canondo05.f90 @@ -1,4 +1,4 @@ -! RUN: %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! RUN: %f18 -fopenmp -funparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK-NOT: do *[1-9] diff --git a/flang/test/Semantics/critical04.f90 b/flang/test/Semantics/critical04.f90 index 4d08597fb7cd..82db87411ed4 100644 --- a/flang/test/Semantics/critical04.f90 +++ b/flang/test/Semantics/critical04.f90 @@ -1,4 +1,4 @@ -! RUN: %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK-NOT: Control flow escapes from CRITICAL subroutine test1(a, i) diff --git a/flang/test/Semantics/defined-ops.f90 b/flang/test/Semantics/defined-ops.f90 index 24e72677c6eb..e46caeb82b94 100644 --- a/flang/test/Semantics/defined-ops.f90 +++ b/flang/test/Semantics/defined-ops.f90 @@ -1,4 +1,4 @@ -! RUN: %f18 -funparse %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s ! Check the analyzed form of a defined operator or assignment. diff --git a/flang/test/Semantics/doconcurrent02.f90 b/flang/test/Semantics/doconcurrent02.f90 index 2720e1356db1..2473b3ee0b74 100644 --- a/flang/test/Semantics/doconcurrent02.f90 +++ b/flang/test/Semantics/doconcurrent02.f90 @@ -1,6 +1,6 @@ ! when the loops are not DO CONCURRENT -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK-NOT: image control statement not allowed in DO CONCURRENT ! CHECK-NOT: RETURN not allowed in DO CONCURRENT ! CHECK-NOT: call to impure procedure in DO CONCURRENT not allowed diff --git a/flang/test/Semantics/doconcurrent03.f90 b/flang/test/Semantics/doconcurrent03.f90 index d98db8dd60c8..45cbcc7a5737 100644 --- a/flang/test/Semantics/doconcurrent03.f90 +++ b/flang/test/Semantics/doconcurrent03.f90 @@ -1,4 +1,4 @@ -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: Control flow escapes from DO CONCURRENT ! CHECK: branch into loop body from outside ! CHECK: the loop branched into diff --git a/flang/test/Semantics/doconcurrent04.f90 b/flang/test/Semantics/doconcurrent04.f90 index 079c8d423503..c3a9779235d6 100644 --- a/flang/test/Semantics/doconcurrent04.f90 +++ b/flang/test/Semantics/doconcurrent04.f90 @@ -1,5 +1,5 @@ ! C1122 The index-name shall be a named scalar variable of type integer. -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: Must have INTEGER type, but is REAL(4) subroutine do_concurrent_test1(n) diff --git a/flang/test/Semantics/doconcurrent07.f90 b/flang/test/Semantics/doconcurrent07.f90 index d9c494efe0ab..982608591f42 100644 --- a/flang/test/Semantics/doconcurrent07.f90 +++ b/flang/test/Semantics/doconcurrent07.f90 @@ -1,4 +1,4 @@ -! RUN: %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK-NOT: exit from DO CONCURRENT construct subroutine do_concurrent_test1(n) diff --git a/flang/test/Semantics/label02.f90 b/flang/test/Semantics/label02.f90 index fa4f37ec3a44..32fe2c21a93e 100644 --- a/flang/test/Semantics/label02.f90 +++ b/flang/test/Semantics/label02.f90 @@ -1,5 +1,5 @@ -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: Label '0' is out of range ! CHECK: Label '100000' is out of range ! CHECK: Label '123456' is out of range diff --git a/flang/test/Semantics/label03.f90 b/flang/test/Semantics/label03.f90 index ecc21f92b93e..9e7485f38307 100644 --- a/flang/test/Semantics/label03.f90 +++ b/flang/test/Semantics/label03.f90 @@ -1,5 +1,5 @@ -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: DO loop doesn't properly nest ! CHECK: DO loop conflicts ! CHECK: Label '30' cannot be found diff --git a/flang/test/Semantics/label04.f90 b/flang/test/Semantics/label04.f90 index ea496fb95789..c5294115b0eb 100644 --- a/flang/test/Semantics/label04.f90 +++ b/flang/test/Semantics/label04.f90 @@ -1,5 +1,5 @@ -! RUN: %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: branch into loop body from outside ! CHECK: do 10 i = 1, m ! CHECK: the loop branched into diff --git a/flang/test/Semantics/label05.f90 b/flang/test/Semantics/label05.f90 index fbcdb4f22cb9..958627acf4b5 100644 --- a/flang/test/Semantics/label05.f90 +++ b/flang/test/Semantics/label05.f90 @@ -1,5 +1,5 @@ -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: Label '50' was not found ! CHECK: Label '55' is not in scope ! CHECK: Label '70' is not a branch target diff --git a/flang/test/Semantics/label06.f90 b/flang/test/Semantics/label06.f90 index 16be4df30cb0..fab521c42ecd 100644 --- a/flang/test/Semantics/label06.f90 +++ b/flang/test/Semantics/label06.f90 @@ -1,5 +1,5 @@ -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: Label '10' is not in scope ! CHECK: Label '20' was not found ! CHECK: Label '30' is not a branch target diff --git a/flang/test/Semantics/label07.f90 b/flang/test/Semantics/label07.f90 index a01b58e16d32..55e2b268933c 100644 --- a/flang/test/Semantics/label07.f90 +++ b/flang/test/Semantics/label07.f90 @@ -1,5 +1,5 @@ -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: Label '30' is not a branch target ! CHECK: Control flow use of '30' ! CHECK: Label '10' is not in scope diff --git a/flang/test/Semantics/label08.f90 b/flang/test/Semantics/label08.f90 index 57858022a526..4ccf6e612380 100644 --- a/flang/test/Semantics/label08.f90 +++ b/flang/test/Semantics/label08.f90 @@ -1,5 +1,5 @@ -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: CYCLE construct-name is not in scope ! CHECK: IF construct name unexpected ! CHECK: unnamed IF statement diff --git a/flang/test/Semantics/label09.f90 b/flang/test/Semantics/label09.f90 index 27644b671471..d34022ebffaf 100644 --- a/flang/test/Semantics/label09.f90 +++ b/flang/test/Semantics/label09.f90 @@ -1,4 +1,4 @@ -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: Label '60' was not found subroutine s(a) diff --git a/flang/test/Semantics/label10.f90 b/flang/test/Semantics/label10.f90 index ad234ccb4bbb..09bb3ab1e9ac 100644 --- a/flang/test/Semantics/label10.f90 +++ b/flang/test/Semantics/label10.f90 @@ -1,4 +1,4 @@ -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: '60' not a FORMAT ! CHECK: data transfer use of '60' diff --git a/flang/test/Semantics/label12.f90 b/flang/test/Semantics/label12.f90 index c917a116e31e..1a926de7f07f 100644 --- a/flang/test/Semantics/label12.f90 +++ b/flang/test/Semantics/label12.f90 @@ -1,4 +1,4 @@ -! RUN: not %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: not %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: expected end of statement subroutine s diff --git a/flang/test/Semantics/label13.f90 b/flang/test/Semantics/label13.f90 index f03156aa1775..8c5a901e2800 100644 --- a/flang/test/Semantics/label13.f90 +++ b/flang/test/Semantics/label13.f90 @@ -1,4 +1,4 @@ -! RUN: %f18 -funparse-with-symbols %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse-with-symbols %s 2>&1 | FileCheck %s ! CHECK: branch into loop body from outside ! CHECK: the loop branched into diff --git a/flang/test/Semantics/label15.f90 b/flang/test/Semantics/label15.f90 index a26a68c001dd..58b9184b8937 100644 --- a/flang/test/Semantics/label15.f90 +++ b/flang/test/Semantics/label15.f90 @@ -1,4 +1,4 @@ -! RUN: %f18 -funparse %s 2>&1 | FileCheck %s +! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s !CHECK-NOT: error: module mm diff --git a/flang/test/lit.cfg.py b/flang/test/lit.cfg.py index d724628dc0bb..76f9c0b9ad3f 100644 --- a/flang/test/lit.cfg.py +++ b/flang/test/lit.cfg.py @@ -74,10 +74,15 @@ tools = [ if config.include_flang_new_driver_test: tools.append(ToolSubst('%flang-new', command=FindTool('flang-new'), unresolved='fatal')) tools.append(ToolSubst('%flang', command=FindTool('flang-new'), unresolved='fatal')) + tools.append(ToolSubst('%flang_fc1', command=FindTool('flang-new'), + extra_args=['-fc1'], unresolved='fatal')) else: tools.append(ToolSubst('%flang', command=FindTool('f18'), extra_args=["-intrinsic-module-directory "+config.flang_intrinsic_modules_dir], unresolved='fatal')) + tools.append(ToolSubst('%flang_fc1', command=FindTool('f18'), + extra_args=["-intrinsic-module-directory "+config.flang_intrinsic_modules_dir], + unresolved='fatal')) if config.flang_standalone_build: llvm_config.add_tool_substitutions(tools, [config.flang_llvm_tools_dir]) diff --git a/flang/tools/f18/f18.cpp b/flang/tools/f18/f18.cpp index 7960403726d5..15d42821f1a1 100644 --- a/flang/tools/f18/f18.cpp +++ b/flang/tools/f18/f18.cpp @@ -540,9 +540,10 @@ int main(int argc, char *const argv[]) { options.instrumentedParse = true; } else if (arg == "-fdebug-no-semantics") { driver.debugNoSemantics = true; - } else if (arg == "-funparse") { + } else if (arg == "-funparse" || arg == "-fdebug-unparse") { driver.dumpUnparse = true; - } else if (arg == "-funparse-with-symbols") { + } else if (arg == "-funparse-with-symbols" || + arg == "-fdebug-unparse-with-symbols") { driver.dumpUnparseWithSymbols = true; } else if (arg == "-funparse-typed-exprs-to-f18-fc") { driver.unparseTypedExprsToF18_FC = true;