diff --git a/lib/Support/FileOutputBuffer.cpp b/lib/Support/FileOutputBuffer.cpp index e6e4da34652..df4ae9322bc 100644 --- a/lib/Support/FileOutputBuffer.cpp +++ b/lib/Support/FileOutputBuffer.cpp @@ -77,6 +77,10 @@ FileOutputBuffer::create(StringRef FilePath, size_t Size, if (EC) return EC; + EC = sys::fs::resize_file(FD, Size); + if (EC) + return EC; + auto MappedFile = llvm::make_unique( FD, mapped_file_region::readwrite, Size, 0, EC); int Ret = close(FD); diff --git a/lib/Support/Unix/Path.inc b/lib/Support/Unix/Path.inc index 75bcc03bbd3..bd6a605a93d 100644 --- a/lib/Support/Unix/Path.inc +++ b/lib/Support/Unix/Path.inc @@ -414,19 +414,7 @@ std::error_code setLastModificationAndAccessTime(int FD, TimeValue Time) { std::error_code mapped_file_region::init(int FD, uint64_t Offset, mapmode Mode) { - // Figure out how large the file is. - struct stat FileInfo; - if (fstat(FD, &FileInfo) == -1) - return std::error_code(errno, std::generic_category()); - uint64_t FileSize = FileInfo.st_size; - - if (Size == 0) - Size = FileSize; - else if (FileSize < Size) { - // We need to grow the file. - if (ftruncate(FD, Size) == -1) - return std::error_code(errno, std::generic_category()); - } + assert(Size != 0); int flags = (Mode == readwrite) ? MAP_SHARED : MAP_PRIVATE; int prot = (Mode == readonly) ? PROT_READ : (PROT_READ | PROT_WRITE); diff --git a/unittests/Support/Path.cpp b/unittests/Support/Path.cpp index 88baadeca02..0d661c8ae6c 100644 --- a/unittests/Support/Path.cpp +++ b/unittests/Support/Path.cpp @@ -654,12 +654,15 @@ TEST_F(FileSystemTest, FileMapping) { SmallString<64> TempPath; ASSERT_NO_ERROR( fs::createTemporaryFile("prefix", "temp", FileDescriptor, TempPath)); + unsigned Size = 4096; + ASSERT_NO_ERROR(fs::resize_file(FileDescriptor, Size)); + // Map in temp file and add some content std::error_code EC; StringRef Val("hello there"); { fs::mapped_file_region mfr(FileDescriptor, - fs::mapped_file_region::readwrite, 4096, 0, EC); + fs::mapped_file_region::readwrite, Size, 0, EC); ASSERT_NO_ERROR(EC); std::copy(Val.begin(), Val.end(), mfr.data()); // Explicitly add a 0. @@ -671,14 +674,14 @@ TEST_F(FileSystemTest, FileMapping) { int FD; EC = fs::openFileForRead(Twine(TempPath), FD); ASSERT_NO_ERROR(EC); - fs::mapped_file_region mfr(FD, fs::mapped_file_region::readonly, 0, 0, EC); + fs::mapped_file_region mfr(FD, fs::mapped_file_region::readonly, Size, 0, EC); ASSERT_NO_ERROR(EC); // Verify content EXPECT_EQ(StringRef(mfr.const_data()), Val); // Unmap temp file - fs::mapped_file_region m(FD, fs::mapped_file_region::readonly, 0, 0, EC); + fs::mapped_file_region m(FD, fs::mapped_file_region::readonly, Size, 0, EC); ASSERT_NO_ERROR(EC); ASSERT_EQ(close(FD), 0); }