[libcxx-commits] [libcxx] [libc++][AIX] Support file offsets larger than 2GB in basic_filebuf on 32-bit (PR #215892)
via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Aug 12 14:11:26 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libcxx
Author: Jake Egan (jakeegan)
<details>
<summary>Changes</summary>
Currently, opening files greater than 2GB on 32-bit AIX doesn't work, even with the `_LARGE_FILES` macro defined in the user program. Instead of building libc++ with `_LARGE_FILES`, we can swap `fopen`/`fseeko`/`ftello` calls with their 64-bit counter-parts.
---
Full diff: https://github.com/llvm/llvm-project/pull/215892.diff
2 Files Affected:
- (modified) libcxx/include/fstream (+15-1)
- (modified) libcxx/test/std/input.output/file.streams/fstreams/ifstream.members/offset_range.pass.cpp (+3-3)
``````````diff
diff --git a/libcxx/include/fstream b/libcxx/include/fstream
index 0023191166c3b..a47b899857e4e 100644
--- a/libcxx/include/fstream
+++ b/libcxx/include/fstream
@@ -432,6 +432,7 @@ private:
_LIBCPP_HIDE_FROM_ABI static int __fseek(FILE* __file, pos_type __offset, int __whence);
_LIBCPP_HIDE_FROM_ABI static pos_type __ftell(FILE* __file);
+ _LIBCPP_HIDE_FROM_ABI static FILE* __fopen(const char* __name, const char* __mode);
_LIBCPP_EXPORTED_FROM_ABI friend FILE* __get_ostream_file(ostream&);
@@ -779,6 +780,15 @@ const wchar_t* basic_filebuf<_CharT, _Traits>::__make_mdwstring(ios_base::openmo
}
# endif
+template <class _CharT, class _Traits>
+FILE* basic_filebuf<_CharT, _Traits>::__fopen(const char* __name, const char* __mode) {
+# if defined(_AIX) && !defined(__64BIT__)
+ return fopen64(__name, __mode);
+# else
+ return std::fopen(__name, __mode);
+# endif
+}
+
template <class _CharT, class _Traits>
basic_filebuf<_CharT, _Traits>* basic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode) {
if (__file_)
@@ -787,7 +797,7 @@ basic_filebuf<_CharT, _Traits>* basic_filebuf<_CharT, _Traits>::open(const char*
if (!__mdstr)
return nullptr;
- return __adopt_file(std::fopen(__s, __mdstr), __mode);
+ return __adopt_file(__fopen(__s, __mdstr), __mode);
}
template <class _CharT, class _Traits>
@@ -1067,6 +1077,8 @@ int basic_filebuf<_CharT, _Traits>::__fseek(FILE* __file, pos_type __offset, int
return _fseeki64(__file, __offset, __whence);
# elif _LIBCPP_LIBC_NEWLIB
return fseek(__file, __offset, __whence);
+# elif defined(_AIX) && !defined(__64BIT__)
+ return fseeko64(__file, __offset, __whence);
# else
return ::fseeko(__file, __offset, __whence);
# endif
@@ -1078,6 +1090,8 @@ typename basic_filebuf<_CharT, _Traits>::pos_type basic_filebuf<_CharT, _Traits>
return _ftelli64(__file);
# elif _LIBCPP_LIBC_NEWLIB
return ftell(__file);
+# elif defined(_AIX) && !defined(__64BIT__)
+ return ftello64(__file);
# else
return ftello(__file);
# endif
diff --git a/libcxx/test/std/input.output/file.streams/fstreams/ifstream.members/offset_range.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/ifstream.members/offset_range.pass.cpp
index d176059ff87bf..7a11378541c1d 100644
--- a/libcxx/test/std/input.output/file.streams/fstreams/ifstream.members/offset_range.pass.cpp
+++ b/libcxx/test/std/input.output/file.streams/fstreams/ifstream.members/offset_range.pass.cpp
@@ -18,10 +18,10 @@
//
// XFAIL: target={{i686|arm.*}}-{{.+}}-android{{.*}}
-// By default, off_t is typically a 32-bit integer on ARMv7 Linux systems and
-// 32-bit AIX, meaning it can represent file sizes up to 2GB (2^31 bytes) only.
+// By default, off_t is typically a 32-bit integer on ARMv7 Linux systems,
+// meaning it can represent file sizes up to 2GB (2^31 bytes) only.
//
-// UNSUPPORTED: target=armv7-unknown-linux-gnueabihf, target=powerpc-{{.+}}-aix{{.*}}
+// UNSUPPORTED: target=armv7-unknown-linux-gnueabihf
#include <fstream>
#include <iostream>
``````````
</details>
https://github.com/llvm/llvm-project/pull/215892
More information about the libcxx-commits
mailing list