This patch introduces the dependencies required to read and manage input files provided by the command line option. It also adds the infrastructure to create and write to output files. The output is sent to either stdout or a file (specified with the `-o` flag). Separately, in order to be able to test the code for file I/O, it adds infrastructure to create frontend actions. As a basic testable example, it adds the `InputOutputTest` FrontendAction. The sole purpose of this action is to read a file from the command line and print it either to stdout or the output file. This action is run by using the `-test-io` flag also introduced in this patch (available for `flang-new` and `flang-new -fc1`). With this patch: ``` flang-new -test-io input-file.f90 ``` will read input-file.f90 and print it in the output file. The `InputOutputTest` frontend action has been introduced primarily to facilitate testing. It is hidden from users (i.e. it's only displayed with `--help-hidden`). Currently Clang doesn’t have an equivalent action. `-test-io` is used to trigger the InputOutputTest action in the Flang frontend driver. This patch makes sure that “flang-new” forwards it to “flang-new -fc1" by creating a preprocessor job. However, in Flang.cpp, `-test-io` is passed to “flang-new -fc1” without `-E`. This way we make sure that the preprocessor is _not_ run in the frontend driver. This is the desired behaviour: `-test-io` should only read the input file and print it to the output stream. co-authored-by: Andrzej Warzynski <andrzej.warzynski@arm.com> Differential Revision: https://reviews.llvm.org/D87989
62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
//===--- FrontendAction.cpp -----------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "flang/Frontend/FrontendAction.h"
|
|
#include "flang/Frontend/CompilerInstance.h"
|
|
#include "flang/Frontend/FrontendActions.h"
|
|
#include "llvm/Support/Errc.h"
|
|
|
|
using namespace Fortran::frontend;
|
|
|
|
void FrontendAction::SetCurrentInput(const FrontendInputFile ¤tInput) {
|
|
this->currentInput_ = currentInput;
|
|
}
|
|
|
|
// Call this method if BeginSourceFile fails.
|
|
// Deallocate compiler instance, input and output descriptors
|
|
static void BeginSourceFileCleanUp(FrontendAction &fa, CompilerInstance &ci) {
|
|
ci.ClearOutputFiles(/*EraseFiles=*/true);
|
|
fa.SetCurrentInput(FrontendInputFile());
|
|
fa.SetCompilerInstance(nullptr);
|
|
}
|
|
|
|
bool FrontendAction::BeginSourceFile(
|
|
CompilerInstance &ci, const FrontendInputFile &realInput) {
|
|
|
|
FrontendInputFile input(realInput);
|
|
assert(!instance_ && "Already processing a source file!");
|
|
assert(!realInput.IsEmpty() && "Unexpected empty filename!");
|
|
SetCurrentInput(realInput);
|
|
SetCompilerInstance(&ci);
|
|
if (!ci.HasAllSources()) {
|
|
BeginSourceFileCleanUp(*this, ci);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool FrontendAction::ShouldEraseOutputFiles() {
|
|
return GetCompilerInstance().getDiagnostics().hasErrorOccurred();
|
|
}
|
|
|
|
llvm::Error FrontendAction::Execute() {
|
|
ExecuteAction();
|
|
return llvm::Error::success();
|
|
}
|
|
|
|
void FrontendAction::EndSourceFile() {
|
|
CompilerInstance &ci = GetCompilerInstance();
|
|
|
|
// Cleanup the output streams, and erase the output files if instructed by the
|
|
// FrontendAction.
|
|
ci.ClearOutputFiles(/*EraseFiles=*/ShouldEraseOutputFiles());
|
|
|
|
SetCompilerInstance(nullptr);
|
|
SetCurrentInput(FrontendInputFile());
|
|
}
|