//===-- lib/runtime/pseudo-unit.cpp -----------------------------*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // // Implemenation of ExternalFileUnit and PseudoOpenFile for // RT_USE_PSEUDO_FILE_UNIT=1. // //===----------------------------------------------------------------------===// #include "unit.h" #include "flang-rt/runtime/io-error.h" #include "flang-rt/runtime/tools.h" // NOTE: the header files above may define OpenMP declare target // variables, so they have to be included unconditionally // so that the offload entries are consistent between host and device. #if defined(RT_USE_PSEUDO_FILE_UNIT) #include namespace Fortran::runtime::io { void FlushOutputOnCrash(const Terminator &) {} ExternalFileUnit *ExternalFileUnit::LookUp(int, Terminator &terminator) { terminator.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } ExternalFileUnit *ExternalFileUnit::LookUpOrCreate( int, const Terminator &terminator, bool &) { terminator.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } ExternalFileUnit *ExternalFileUnit::LookUpOrCreateAnonymous(int unit, Direction direction, common::optional, IoErrorHandler &handler) { if (direction != Direction::Output || unit != 6) { handler.Crash("ExternalFileUnit only supports output to unit 6"); } // The pseudo-unit allocated here will be released in // ExternalIoStatementBase::EndIoStatement(). return New{handler}(unit).release(); } ExternalFileUnit *ExternalFileUnit::LookUp( const char *, std::size_t, Terminator &terminator) { terminator.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } ExternalFileUnit &ExternalFileUnit::CreateNew( int, const Terminator &terminator) { terminator.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } ExternalFileUnit *ExternalFileUnit::LookUpForClose( int, Terminator &terminator) { terminator.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } ExternalFileUnit &ExternalFileUnit::NewUnit( const Terminator &terminator, bool) { terminator.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } bool ExternalFileUnit::OpenUnit(common::optional status, common::optional, Position, OwningPtr &&, std::size_t, Convert, IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } bool ExternalFileUnit::OpenAnonymousUnit(common::optional, common::optional, Position, Convert convert, IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } void ExternalFileUnit::CloseUnit(CloseStatus, IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } void ExternalFileUnit::DestroyClosed(Terminator &terminator) { terminator.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } Iostat ExternalFileUnit::SetDirection(Direction direction) { if (direction != Direction::Output) { return IostatReadFromWriteOnly; } direction_ = direction; return IostatOk; } void ExternalFileUnit::CloseAll(IoErrorHandler &) {} void ExternalFileUnit::FlushAll(IoErrorHandler &) {} int ExternalFileUnit::GetAsynchronousId(IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } bool ExternalFileUnit::Wait(int) { Terminator{__FILE__, __LINE__}.Crash("unsupported"); } void PseudoOpenFile::set_mayAsynchronous(bool yes) { if (yes) { Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } } common::optional PseudoOpenFile::knownSize() const { Terminator{__FILE__, __LINE__}.Crash("unsupported"); } void PseudoOpenFile::Open( OpenStatus, common::optional, Position, IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } void PseudoOpenFile::Close(CloseStatus, IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } std::size_t PseudoOpenFile::Read( FileOffset, char *, std::size_t, std::size_t, IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } std::size_t PseudoOpenFile::Write(FileOffset at, const char *buffer, std::size_t bytes, IoErrorHandler &handler) { char *mutableBuffer{const_cast(buffer)}; char save{buffer[bytes]}; mutableBuffer[bytes] = '\0'; std::printf("%s", buffer); mutableBuffer[bytes] = save; return bytes; } void PseudoOpenFile::Truncate(FileOffset, IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } int PseudoOpenFile::ReadAsynchronously( FileOffset, char *, std::size_t, IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } int PseudoOpenFile::WriteAsynchronously( FileOffset, const char *, std::size_t, IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } void PseudoOpenFile::Wait(int, IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } void PseudoOpenFile::WaitAll(IoErrorHandler &handler) { handler.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } Position PseudoOpenFile::InquirePosition(FileOffset) const { Terminator{__FILE__, __LINE__}.Crash("%s: unsupported", RT_PRETTY_FUNCTION); } } // namespace Fortran::runtime::io #endif // defined(RT_USE_PSEUDO_FILE_UNIT)