llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-flang-runtime Author: Slava Zakharin (vzakhari) <details> <summary>Changes</summary> Use InternalUnit with own buffer to accumulate output and print it at the end of the statement. Some code was disabled with RT_DEVICE_COMPILATION checks. It can be enabled later. --- Patch is 121.73 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/85182.diff 40 Files Affected: - (modified) flang/include/flang/Common/real.h (+3) - (modified) flang/include/flang/Common/uint128.h (+3) - (modified) flang/include/flang/Decimal/binary-floating-point.h (+31-20) - (modified) flang/include/flang/Decimal/decimal.h (+27-26) - (modified) flang/include/flang/Runtime/api-attrs.h (+1-1) - (modified) flang/include/flang/Runtime/io-api.h (+11-3) - (modified) flang/include/flang/Runtime/iostat.h (+2-1) - (modified) flang/include/flang/Runtime/memory.h (+13-3) - (modified) flang/include/flang/Runtime/type-code.h (-1) - (modified) flang/runtime/CMakeLists.txt (+12) - (modified) flang/runtime/connection.cpp (+8-6) - (modified) flang/runtime/connection.h (+16-13) - (modified) flang/runtime/descriptor-io.h (+27-12) - (modified) flang/runtime/edit-input.cpp (+62-33) - (modified) flang/runtime/edit-input.h (+15-13) - (modified) flang/runtime/edit-output.cpp (+48-34) - (modified) flang/runtime/edit-output.h (+40-36) - (modified) flang/runtime/emit-encoded.h (+4-3) - (modified) flang/runtime/environment.h (+2) - (modified) flang/runtime/format-implementation.h (+9-7) - (modified) flang/runtime/format.cpp (+4) - (modified) flang/runtime/format.h (+23-16) - (modified) flang/runtime/freestanding-tools.h (+26-3) - (modified) flang/runtime/internal-unit.cpp (+23-13) - (modified) flang/runtime/internal-unit.h (+15-13) - (modified) flang/runtime/io-api.cpp (+20-5) - (modified) flang/runtime/io-error.cpp (+31-10) - (modified) flang/runtime/io-error.h (+20-16) - (modified) flang/runtime/io-stmt.cpp (+64-42) - (modified) flang/runtime/io-stmt.h (+96-79) - (modified) flang/runtime/iostat.cpp (+5-1) - (modified) flang/runtime/memory.cpp (+3-2) - (modified) flang/runtime/namelist.cpp (+12-5) - (modified) flang/runtime/namelist.h (+2-1) - (modified) flang/runtime/numeric-templates.h (+7-7) - (modified) flang/runtime/terminator.h (+1-1) - (modified) flang/runtime/tools.cpp (+1-1) - (modified) flang/runtime/tools.h (+1-1) - (modified) flang/runtime/utf.cpp (+7-3) - (modified) flang/runtime/utf.h (+8-6) ``````````diff diff --git a/flang/include/flang/Common/real.h b/flang/include/flang/Common/real.h index 50aab7d89a597e..9ca58bed2dd7c2 100644 --- a/flang/include/flang/Common/real.h +++ b/flang/include/flang/Common/real.h @@ -13,6 +13,7 @@ // The various representations are distinguished by their binary precisions // (number of explicit significand bits and any implicit MSB in the fraction). +#include "flang/Runtime/api-attrs.h" #include <cinttypes> namespace Fortran::common { @@ -119,6 +120,7 @@ template <int BINARY_PRECISION> class RealDetails { } public: + RT_OFFLOAD_VAR_GROUP_BEGIN static constexpr int binaryPrecision{BINARY_PRECISION}; static constexpr int bits{BitsForBinaryPrecision(binaryPrecision)}; static constexpr bool isImplicitMSB{binaryPrecision != 64 /*x87*/}; @@ -138,6 +140,7 @@ template <int BINARY_PRECISION> class RealDetails { static constexpr int maxHexadecimalConversionDigits{ MaxHexadecimalConversionDigits(binaryPrecision)}; + RT_OFFLOAD_VAR_GROUP_END static_assert(binaryPrecision > 0); static_assert(exponentBits > 1); diff --git a/flang/include/flang/Common/uint128.h b/flang/include/flang/Common/uint128.h index 03e44eb6997d5b..55841c0d9b9028 100644 --- a/flang/include/flang/Common/uint128.h +++ b/flang/include/flang/Common/uint128.h @@ -20,6 +20,7 @@ #endif #include "leading-zero-bit-count.h" +#include "flang/Runtime/api-attrs.h" #include <cstdint> #include <type_traits> @@ -260,7 +261,9 @@ template <bool IS_SIGNED = false> class Int128 { return LeadingZeroBitCount(high_); } } + RT_VAR_GROUP_BEGIN static constexpr std::uint64_t topBit{std::uint64_t{1} << 63}; + RT_VAR_GROUP_END #if FLANG_LITTLE_ENDIAN std::uint64_t low_{0}, high_{0}; #elif FLANG_BIG_ENDIAN diff --git a/flang/include/flang/Decimal/binary-floating-point.h b/flang/include/flang/Decimal/binary-floating-point.h index d1992819f85aa6..1c8829550043de 100644 --- a/flang/include/flang/Decimal/binary-floating-point.h +++ b/flang/include/flang/Decimal/binary-floating-point.h @@ -14,6 +14,7 @@ #include "flang/Common/real.h" #include "flang/Common/uint128.h" +#include "flang/Runtime/api-attrs.h" #include <cinttypes> #include <climits> #include <cstring> @@ -47,9 +48,11 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> { using RawType = common::HostUnsignedIntType<bits>; static_assert(CHAR_BIT * sizeof(RawType) >= bits); + RT_OFFLOAD_VAR_GROUP_BEGIN static constexpr RawType significandMask{(RawType{1} << significandBits) - 1}; - constexpr BinaryFloatingPointNumber() {} // zero + constexpr RT_API_ATTRS BinaryFloatingPointNumber() {} // zero + RT_OFFLOAD_VAR_GROUP_END constexpr BinaryFloatingPointNumber( const BinaryFloatingPointNumber &that) = default; constexpr BinaryFloatingPointNumber( @@ -58,26 +61,30 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> { const BinaryFloatingPointNumber &that) = default; constexpr BinaryFloatingPointNumber &operator=( BinaryFloatingPointNumber &&that) = default; - constexpr explicit BinaryFloatingPointNumber(RawType raw) : raw_{raw} {} + constexpr explicit RT_API_ATTRS BinaryFloatingPointNumber(RawType raw) + : raw_{raw} {} - RawType raw() const { return raw_; } + RT_API_ATTRS RawType raw() const { return raw_; } - template <typename A> explicit constexpr BinaryFloatingPointNumber(A x) { + template <typename A> + explicit constexpr RT_API_ATTRS BinaryFloatingPointNumber(A x) { static_assert(sizeof raw_ <= sizeof x); std::memcpy(reinterpret_cast<void *>(&raw_), reinterpret_cast<const void *>(&x), sizeof raw_); } - constexpr int BiasedExponent() const { + constexpr RT_API_ATTRS int BiasedExponent() const { return static_cast<int>( (raw_ >> significandBits) & ((1 << exponentBits) - 1)); } - constexpr int UnbiasedExponent() const { + constexpr RT_API_ATTRS int UnbiasedExponent() const { int biased{BiasedExponent()}; return biased - exponentBias + (biased == 0); } - constexpr RawType Significand() const { return raw_ & significandMask; } - constexpr RawType Fraction() const { + constexpr RT_API_ATTRS RawType Significand() const { + return raw_ & significandMask; + } + constexpr RT_API_ATTRS RawType Fraction() const { RawType sig{Significand()}; if (isImplicitMSB && BiasedExponent() > 0) { sig |= RawType{1} << significandBits; @@ -85,10 +92,10 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> { return sig; } - constexpr bool IsZero() const { + constexpr RT_API_ATTRS bool IsZero() const { return (raw_ & ((RawType{1} << (bits - 1)) - 1)) == 0; } - constexpr bool IsNaN() const { + constexpr RT_API_ATTRS bool IsNaN() const { auto expo{BiasedExponent()}; auto sig{Significand()}; if constexpr (bits == 80) { // x87 @@ -102,7 +109,7 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> { return expo == maxExponent && sig != 0; } } - constexpr bool IsInfinite() const { + constexpr RT_API_ATTRS bool IsInfinite() const { if constexpr (bits == 80) { // x87 return BiasedExponent() == maxExponent && Significand() == ((significandMask >> 1) + 1); @@ -110,27 +117,30 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> { return BiasedExponent() == maxExponent && Significand() == 0; } } - constexpr bool IsMaximalFiniteMagnitude() const { + constexpr RT_API_ATTRS bool IsMaximalFiniteMagnitude() const { return BiasedExponent() == maxExponent - 1 && Significand() == significandMask; } - constexpr bool IsNegative() const { return ((raw_ >> (bits - 1)) & 1) != 0; } + constexpr RT_API_ATTRS bool IsNegative() const { + return ((raw_ >> (bits - 1)) & 1) != 0; + } - constexpr void Negate() { raw_ ^= RawType{1} << (bits - 1); } + constexpr RT_API_ATTRS void Negate() { raw_ ^= RawType{1} << (bits - 1); } // For calculating the nearest neighbors of a floating-point value - constexpr void Previous() { + constexpr RT_API_ATTRS void Previous() { RemoveExplicitMSB(); --raw_; InsertExplicitMSB(); } - constexpr void Next() { + constexpr RT_API_ATTRS void Next() { RemoveExplicitMSB(); ++raw_; InsertExplicitMSB(); } - static constexpr BinaryFloatingPointNumber Infinity(bool isNegative) { + static constexpr RT_API_ATTRS BinaryFloatingPointNumber Infinity( + bool isNegative) { RawType result{RawType{maxExponent} << significandBits}; if (isNegative) { result |= RawType{1} << (bits - 1); @@ -139,7 +149,8 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> { } // Returns true when the result is exact - constexpr bool RoundToBits(int keepBits, enum FortranRounding mode) { + constexpr RT_API_ATTRS bool RoundToBits( + int keepBits, enum FortranRounding mode) { if (IsNaN() || IsInfinite() || keepBits >= binaryPrecision) { return true; } @@ -180,12 +191,12 @@ class BinaryFloatingPointNumber : public common::RealDetails<BINARY_PRECISION> { } private: - constexpr void RemoveExplicitMSB() { + constexpr RT_API_ATTRS void RemoveExplicitMSB() { if constexpr (!isImplicitMSB) { raw_ = (raw_ & (significandMask >> 1)) | ((raw_ & ~significandMask) >> 1); } } - constexpr void InsertExplicitMSB() { + constexpr RT_API_ATTRS void InsertExplicitMSB() { if constexpr (!isImplicitMSB) { constexpr RawType mask{significandMask >> 1}; raw_ = (raw_ & mask) | ((raw_ & ~mask) << 1); diff --git a/flang/include/flang/Decimal/decimal.h b/flang/include/flang/Decimal/decimal.h index f0997fb63df018..aeda01c44fa6f6 100644 --- a/flang/include/flang/Decimal/decimal.h +++ b/flang/include/flang/Decimal/decimal.h @@ -12,6 +12,7 @@ #ifndef FORTRAN_DECIMAL_DECIMAL_H_ #define FORTRAN_DECIMAL_DECIMAL_H_ +#include "flang/Runtime/api-attrs.h" #include <stddef.h> #ifdef __cplusplus @@ -65,27 +66,27 @@ enum DecimalConversionFlags { #ifdef __cplusplus template <int PREC> -ConversionToDecimalResult ConvertToDecimal(char *, size_t, +RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal(char *, size_t, DecimalConversionFlags, int digits, enum FortranRounding rounding, BinaryFloatingPointNumber<PREC> x); -extern template ConversionToDecimalResult ConvertToDecimal<8>(char *, size_t, - enum DecimalConversionFlags, int, enum FortranRounding, +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<8>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, BinaryFloatingPointNumber<8>); -extern template ConversionToDecimalResult ConvertToDecimal<11>(char *, size_t, - enum DecimalConversionFlags, int, enum FortranRounding, +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<11>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, BinaryFloatingPointNumber<11>); -extern template ConversionToDecimalResult ConvertToDecimal<24>(char *, size_t, - enum DecimalConversionFlags, int, enum FortranRounding, +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<24>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, BinaryFloatingPointNumber<24>); -extern template ConversionToDecimalResult ConvertToDecimal<53>(char *, size_t, - enum DecimalConversionFlags, int, enum FortranRounding, +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<53>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, BinaryFloatingPointNumber<53>); -extern template ConversionToDecimalResult ConvertToDecimal<64>(char *, size_t, - enum DecimalConversionFlags, int, enum FortranRounding, +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<64>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, BinaryFloatingPointNumber<64>); -extern template ConversionToDecimalResult ConvertToDecimal<113>(char *, size_t, - enum DecimalConversionFlags, int, enum FortranRounding, +extern template RT_API_ATTRS ConversionToDecimalResult ConvertToDecimal<113>( + char *, size_t, enum DecimalConversionFlags, int, enum FortranRounding, BinaryFloatingPointNumber<113>); template <int PREC> struct ConversionToBinaryResult { @@ -94,20 +95,20 @@ template <int PREC> struct ConversionToBinaryResult { }; template <int PREC> -ConversionToBinaryResult<PREC> ConvertToBinary(const char *&, +RT_API_ATTRS ConversionToBinaryResult<PREC> ConvertToBinary(const char *&, enum FortranRounding = RoundNearest, const char *end = nullptr); -extern template ConversionToBinaryResult<8> ConvertToBinary<8>( +extern template RT_API_ATTRS ConversionToBinaryResult<8> ConvertToBinary<8>( const char *&, enum FortranRounding, const char *end); -extern template ConversionToBinaryResult<11> ConvertToBinary<11>( +extern template RT_API_ATTRS ConversionToBinaryResult<11> ConvertToBinary<11>( const char *&, enum FortranRounding, const char *end); -extern template ConversionToBinaryResult<24> ConvertToBinary<24>( +extern template RT_API_ATTRS ConversionToBinaryResult<24> ConvertToBinary<24>( const char *&, enum FortranRounding, const char *end); -extern template ConversionToBinaryResult<53> ConvertToBinary<53>( +extern template RT_API_ATTRS ConversionToBinaryResult<53> ConvertToBinary<53>( const char *&, enum FortranRounding, const char *end); -extern template ConversionToBinaryResult<64> ConvertToBinary<64>( +extern template RT_API_ATTRS ConversionToBinaryResult<64> ConvertToBinary<64>( const char *&, enum FortranRounding, const char *end); -extern template ConversionToBinaryResult<113> ConvertToBinary<113>( +extern template RT_API_ATTRS ConversionToBinaryResult<113> ConvertToBinary<113>( const char *&, enum FortranRounding, const char *end); } // namespace Fortran::decimal extern "C" { @@ -116,21 +117,21 @@ extern "C" { #define NS(x) x #endif /* C++ */ -struct NS(ConversionToDecimalResult) +RT_API_ATTRS struct NS(ConversionToDecimalResult) ConvertFloatToDecimal(char *, size_t, enum NS(DecimalConversionFlags), int digits, enum NS(FortranRounding), float); -struct NS(ConversionToDecimalResult) +RT_API_ATTRS struct NS(ConversionToDecimalResult) ConvertDoubleToDecimal(char *, size_t, enum NS(DecimalConversionFlags), int digits, enum NS(FortranRounding), double); -struct NS(ConversionToDecimalResult) +RT_API_ATTRS struct NS(ConversionToDecimalResult) ConvertLongDoubleToDecimal(char *, size_t, enum NS(DecimalConversionFlags), int digits, enum NS(FortranRounding), long double); -enum NS(ConversionResultFlags) +RT_API_ATTRS enum NS(ConversionResultFlags) ConvertDecimalToFloat(const char **, float *, enum NS(FortranRounding)); -enum NS(ConversionResultFlags) +RT_API_ATTRS enum NS(ConversionResultFlags) ConvertDecimalToDouble(const char **, double *, enum NS(FortranRounding)); -enum NS(ConversionResultFlags) ConvertDecimalToLongDouble( +RT_API_ATTRS enum NS(ConversionResultFlags) ConvertDecimalToLongDouble( const char **, long double *, enum NS(FortranRounding)); #undef NS #ifdef __cplusplus diff --git a/flang/include/flang/Runtime/api-attrs.h b/flang/include/flang/Runtime/api-attrs.h index fc3eb42e1b73f5..050d2366b8e165 100644 --- a/flang/include/flang/Runtime/api-attrs.h +++ b/flang/include/flang/Runtime/api-attrs.h @@ -102,7 +102,7 @@ * to appear as part of a C++ decl-specifier. */ #ifndef RT_CONST_VAR_ATTRS -#if defined(__CUDACC__) || defined(__CUDA__) +#if (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__) #define RT_CONST_VAR_ATTRS __constant__ #else #define RT_CONST_VAR_ATTRS diff --git a/flang/include/flang/Runtime/io-api.h b/flang/include/flang/Runtime/io-api.h index 556cc20c5a121e..fae4e83e1b35db 100644 --- a/flang/include/flang/Runtime/io-api.h +++ b/flang/include/flang/Runtime/io-api.h @@ -58,6 +58,14 @@ extern "C" { #define IONAME(name) RTNAME(io##name) +#ifndef IODECL +#define IODECL(name) RT_API_ATTRS IONAME(name) +#endif + +#ifndef IODEF +#define IODEF(name) RT_API_ATTRS IONAME(name) +#endif + // These functions initiate data transfer statements (READ, WRITE, PRINT). // Example: PRINT *, 666 is implemented as the series of calls: // Cookie cookie{BeginExternalListOutput(DefaultOutputUnit, @@ -139,7 +147,7 @@ enum Iostat IONAME(CheckUnitNumberInRange128)(common::int128_t unit, const char *sourceFile = nullptr, int sourceLine = 0); // External synchronous I/O initiation -Cookie IONAME(BeginExternalListOutput)(ExternalUnit = DefaultOutputUnit, +Cookie IODECL(BeginExternalListOutput)(ExternalUnit = DefaultOutputUnit, const char *sourceFile = nullptr, int sourceLine = 0); Cookie IONAME(BeginExternalListInput)(ExternalUnit = DefaultInputUnit, const char *sourceFile = nullptr, int sourceLine = 0); @@ -253,7 +261,7 @@ bool IONAME(InputDescriptor)(Cookie, const Descriptor &); // Formatted (including list directed) I/O data items bool IONAME(OutputInteger8)(Cookie, std::int8_t); bool IONAME(OutputInteger16)(Cookie, std::int16_t); -bool IONAME(OutputInteger32)(Cookie, std::int32_t); +bool IODECL(OutputInteger32)(Cookie, std::int32_t); bool IONAME(OutputInteger64)(Cookie, std::int64_t); bool IONAME(OutputInteger128)(Cookie, common::int128_t); bool IONAME(InputInteger)(Cookie, std::int64_t &, int kind = 8); @@ -357,7 +365,7 @@ bool IONAME(InquireInteger64)( // returned is guaranteed to only be one of the problems that the // EnableHandlers() call has indicated should be handled in compiled code // rather than by terminating the image. -enum Iostat IONAME(EndIoStatement)(Cookie); +enum Iostat IODECL(EndIoStatement)(Cookie); } // extern "C" } // namespace Fortran::runtime::io diff --git a/flang/include/flang/Runtime/iostat.h b/flang/include/flang/Runtime/iostat.h index afce509cf1f564..0c947f6cb552c1 100644 --- a/flang/include/flang/Runtime/iostat.h +++ b/flang/include/flang/Runtime/iostat.h @@ -11,6 +11,7 @@ #ifndef FORTRAN_RUNTIME_IOSTAT_H_ #define FORTRAN_RUNTIME_IOSTAT_H_ +#include "flang/Runtime/api-attrs.h" #include "flang/Runtime/magic-numbers.h" namespace Fortran::runtime::io { @@ -88,7 +89,7 @@ enum Iostat { IostatNonExternalDefinedUnformattedIo, }; -const char *IostatErrorString(int); +const RT_API_ATTRS char *IostatErrorString(int); } // namespace Fortran::runtime::io #endif // FORTRAN_RUNTIME_IOSTAT_H_ diff --git a/flang/include/flang/Runtime/memory.h b/flang/include/flang/Runtime/memory.h index e24c509f4e90cb..5a1d352963400b 100644 --- a/flang/include/flang/Runtime/memory.h +++ b/flang/include/flang/Runtime/memory.h @@ -128,12 +128,21 @@ inline RT_API_ATTRS bool operator!=(std::nullptr_t, const OwningPtr<X> &x) { template <typename A> class SizedNew { public: - explicit SizedNew(const Terminator &terminator) : terminator_{terminator} {} + explicit RT_API_ATTRS SizedNew(const Terminator &terminator) + : terminator_{terminator} {} + + // Disable warnings about calling constructors for host-only + // classes (those thare are not supposed to be constructed) + // on the device. + RT_DIAG_PUSH + RT_DIAG_DISABLE_CALL_HOST_FROM_DEVICE_WARN template <typename... X> - [[nodiscard]] OwningPtr<A> operator()(std::size_t bytes, X &&...x) { + [[nodiscard]] RT_API_ATTRS OwningPtr<A> operator()( + std::size_t bytes, X &&...x) { return OwningPtr<A>{new (AllocateMemoryOrCrash(terminator_, bytes)) A{std::forward<X>(x)...}}; } + RT_DIAG_POP private: const Terminator &terminator_; @@ -141,7 +150,8 @@ template <typename A> class SizedNew { template <typename A> struct New : public SizedNew<A> { using SizedNew<A>::SizedNew; - template <typename... X> [[nodiscard]] OwningPtr<A> operator()(X &&...x) { + template <typename... X> + [[nodiscard]] RT_API_ATTRS OwningPtr<A> operator()(X &&...x) { return SizedNew<A>::operator()(sizeof(A), std::forward<X>(x)...); } }; diff --git a/flang/include/flang/Runtime/type-code.h b/flang/include/flang/Runtime/type-code.h index f7419249c2ba9c..8e7314e0af1efc 100644 --- a/flang/include/flang/Runtime/type-code.h +++ b/flang/include/flang/Runtime/type-code.h @@ -12,7 +12,6 @@ #include "flang/Common/Fortran.h" #include "flang/Common/optional.h" #include "flang/ISO_Fortran_binding_wrapper.h" -#include <optional> #include <utility> namespace Fortran::runtime { diff --git a/flang/runtime/CMakeLists.txt b/flang/runtime/CMakeLists.txt index 7dd60b5edcd5fb..984e7b97537752 100644 --- a/flang/runtime/CMakeLists.txt +++ b/flang/runtime/CMakeLists.txt @@ -179,18 +179,29 @@ set(supported_files array-constructor.cpp assign.cpp character.cpp + connection.cpp copy.cpp derived-api.cpp derived.cpp descriptor.cpp dot-product.cpp + edit-input.cpp + edit-output.cpp + environment.cpp extrema.cpp findloc.cpp + format.cpp inquiry.cpp + internal-unit.cpp + io-api.cpp + io-error.cpp + io-stmt.cpp + iostat.cpp matmul-transpose.cpp matmul.cpp memory.cpp misc-intrinsic.cpp + namelist.cpp numeric.cpp pointer.cpp product.cpp @@ -203,6 +214,7 @@ set(supported_files transformational.cpp type-code.cpp type-info.cpp + utf.cpp ) if (FLANG_EXPERIMENTAL_CUDA_RUNTIME) diff --git a/flang/runtime/connection.cpp b/flang/runtime/connection.cpp index 91ac9a0e14e47b..94a16222fc1eda 100644 --- a/flang/runtime/connection.cpp +++ b/flang/runtime/connection.cpp @@ -13,31 +13,33 @@ namespace Fortran::runtime::io { -std::size_t ConnectionState::RemainingSpaceInRecord() const { +RT_OFFLOAD_API_GROUP_BEGIN +RT_API_ATTRS std::size_t ConnectionState::RemainingSpaceInRecord() const { auto recl{recordLength.value_or(openRecl.value_or( executionEnvironment.listDirectedOutputLineLengthLimit))}; return positionInRecord >= recl ? 0 : recl - positionInRecord; } -bool ConnectionState::NeedAdvance(std::size_t width) const { +RT_API_ATTRS bool ConnectionState::NeedAdvance(std::size_t width) const { return positionInRecord > 0 && width > RemainingSpaceInRecord(); } -bool ConnectionState::IsAtEOF() const { +RT_API_ATTRS bool ConnectionState::IsAtEOF() const { return endfileRecordNumber && currentRecordNumber >= *en... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/85182 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits