//===--- FrontendActions.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/FrontendActions.h" #include "flang/Frontend/CompilerInstance.h" #include "flang/Parser/parsing.h" #include "flang/Parser/provenance.h" #include "flang/Parser/source.h" using namespace Fortran::frontend; void InputOutputTestAction::ExecuteAction() { // Get the name of the file from FrontendInputFile current. std::string path{GetCurrentFileOrBufferName()}; std::string buf; llvm::raw_string_ostream error_stream{buf}; bool binaryMode = true; // Set/store input file info into CompilerInstance. CompilerInstance &ci = instance(); Fortran::parser::AllSources &allSources{ci.allSources()}; const Fortran::parser::SourceFile *sf; sf = allSources.Open(path, error_stream); llvm::ArrayRef fileContent = sf->content(); // Output file descriptor to receive the content of input file. std::unique_ptr os; // Do not write on the output file if using outputStream_. if (ci.IsOutputStreamNull()) { os = ci.CreateDefaultOutputFile( binaryMode, GetCurrentFileOrBufferName(), "txt"); if (!os) return; (*os) << fileContent.data(); } else { ci.WriteOutputStream(fileContent.data()); } } void PrintPreprocessedAction::ExecuteAction() { std::string buf; llvm::raw_string_ostream outForPP{buf}; // Run the preprocessor CompilerInstance &ci = this->instance(); ci.parsing().DumpCookedChars(outForPP); // If a pre-defined output stream exists, dump the preprocessed content there if (!ci.IsOutputStreamNull()) { // Send the output to the pre-defined output buffer. ci.WriteOutputStream(outForPP.str()); return; } // Create a file and save the preprocessed output there if (auto os{ci.CreateDefaultOutputFile( /*Binary=*/true, /*InFile=*/GetCurrentFileOrBufferName())}) { (*os) << outForPP.str(); } else { llvm::errs() << "Unable to create the output file\n"; return; } }