99#include < executorch/extension/data_loader/mmap_data_loader.h>
1010
1111#include < cstring>
12+ #include < vector>
1213
1314#include < gtest/gtest.h>
1415
@@ -428,4 +429,61 @@ TEST_F(MmapDataLoaderTest, LoadIntoCopiesOffsetCorrectly) {
428429
429430 // Verify memory copied correctly.
430431 EXPECT_EQ (0 , std::memcmp (dst, contents + offset, size));
431- }
432+ }
433+
434+ // Tests that the loader can handle files requiring 64-bit file systems.
435+ // This test verifies that offsets and sizes beyond 32-bit limits are handled
436+ // correctly by creating a sparse file with data at a large offset.
437+ TEST_F (MmapDataLoaderTest, LargeFileOffsetSupport) {
438+ // We run some 32 bit tests on Linux so we need to skip this
439+ // test.
440+ #ifndef _WIN32
441+ if (sizeof (off_t ) <= 8 ) {
442+ return ;
443+ }
444+ #endif
445+ // Create a sparse file with a marker at an offset beyond 2GB (32-bit limit).
446+ // We use 3GB to ensure we're testing 64-bit offset handling.
447+ const size_t large_offset = 3ULL * 1024 * 1024 * 1024 ; // 3GB
448+ const std::string test_marker = " TEST_MARKER_AT_LARGE_OFFSET" ;
449+
450+ // Use TempFile sparse file API to create a 3GB+ file
451+ TempFile tf (large_offset, test_marker, large_offset + test_marker.size ());
452+
453+ // Now try to load the data using MmapDataLoader.
454+ Result<MmapDataLoader> mdl = MmapDataLoader::from (tf.path ().c_str ());
455+ ASSERT_EQ (mdl.error (), Error::Ok)
456+ << " Failed to create MmapDataLoader for large sparse file" ;
457+
458+ // Verify the file size is reported correctly (should be > 3GB).
459+ Result<size_t > file_size = mdl->size ();
460+ ASSERT_EQ (file_size.error (), Error::Ok);
461+ EXPECT_GT (*file_size, large_offset)
462+ << " File size should be larger than the large offset" ;
463+ EXPECT_EQ (*file_size, large_offset + test_marker.size ())
464+ << " File size should match offset + marker size" ;
465+
466+ // Try to load the marker data from the large offset.
467+ Result<FreeableBuffer> fb = mdl->load (
468+ large_offset,
469+ test_marker.size (),
470+ DataLoader::SegmentInfo (DataLoader::SegmentInfo::Type::Program));
471+ ASSERT_EQ (fb.error (), Error::Ok) << " Failed to load data from large offset" ;
472+
473+ EXPECT_EQ (fb->size (), test_marker.size ());
474+ EXPECT_EQ (0 , std::memcmp (fb->data (), test_marker.data (), test_marker.size ()))
475+ << " Data at large offset does not match expected marker" ;
476+
477+ // Test load_into as well.
478+ std::vector<uint8_t > buffer (test_marker.size ());
479+ Error err = mdl->load_into (
480+ large_offset,
481+ test_marker.size (),
482+ DataLoader::SegmentInfo (DataLoader::SegmentInfo::Type::Program),
483+ buffer.data ());
484+ ASSERT_EQ (err, Error::Ok) << " load_into failed for large offset" ;
485+
486+ EXPECT_EQ (
487+ 0 , std::memcmp (buffer.data (), test_marker.data (), test_marker.size ()))
488+ << " load_into data at large offset does not match expected marker" ;
489+ }
0 commit comments