diff options
author | Abhina Sree <Abhina.Sreeskantharajan@ibm.com> | 2024-12-11 07:46:51 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-11 07:46:51 -0500 |
commit | 04379c98638ac3901257b5fa319f9ece828af767 (patch) | |
tree | ccfc13328102602462bede899c94a6208154c3e2 /llvm/lib/Support/MemoryBuffer.cpp | |
parent | 0100c631f85480ecdf1b35f2aedbfc0200a81174 (diff) | |
download | llvm-04379c98638ac3901257b5fa319f9ece828af767.zip llvm-04379c98638ac3901257b5fa319f9ece828af767.tar.gz llvm-04379c98638ac3901257b5fa319f9ece828af767.tar.bz2 |
[SystemZ][z/OS] Update autoconversion functions to improve support for UTF-8 (#98652)
This fixes the following error when reading source and header files on
z/OS: error: source file is not valid UTF-8
Diffstat (limited to 'llvm/lib/Support/MemoryBuffer.cpp')
-rw-r--r-- | llvm/lib/Support/MemoryBuffer.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/Support/MemoryBuffer.cpp b/llvm/lib/Support/MemoryBuffer.cpp index 7ea68ee..e2044bc 100644 --- a/llvm/lib/Support/MemoryBuffer.cpp +++ b/llvm/lib/Support/MemoryBuffer.cpp @@ -361,6 +361,11 @@ static bool shouldUseMmap(sys::fs::file_t FD, bool RequiresNullTerminator, int PageSize, bool IsVolatile) { +#if defined(__MVS__) + // zOS Enhanced ASCII auto convert does not support mmap. + return false; +#endif + // mmap may leave the buffer without null terminator if the file size changed // by the time the last page is mapped in, so avoid it if the file size is // likely to change. @@ -503,9 +508,16 @@ getOpenFileImpl(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize, } #ifdef __MVS__ - // Set codepage auto-conversion for z/OS. - if (auto EC = llvm::enablezOSAutoConversion(FD)) + ErrorOr<bool> NeedConversion = needzOSConversion(Filename.str().c_str(), FD); + if (std::error_code EC = NeedConversion.getError()) return EC; + // File size may increase due to EBCDIC -> UTF-8 conversion, therefore we + // cannot trust the file size and we create the memory buffer by copying + // off the stream. + // Note: This only works with the assumption of reading a full file (i.e, + // Offset == 0 and MapSize == FileSize). Reading a file slice does not work. + if (Offset == 0 && MapSize == FileSize && *NeedConversion) + return getMemoryBufferForStream(FD, Filename); #endif auto Buf = |