mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[Support] Allow FileOutputBuffer::create to create an empty file
Size==0 triggers `assert(Size != 0)` in mapped_file_region::init. I plan to use an empty file in D79339 (llvm-objcopy --dump-section). According to POSIX, "If len is zero, mmap() shall fail and no mapping shall be established." Just specialize case Size=0 to use createInMemoryBuffer. Reviewed By: jhenderson Differential Revision: https://reviews.llvm.org/D79338
This commit is contained in:
parent
41fde1024a
commit
8bc7bc4570
@ -172,6 +172,10 @@ FileOutputBuffer::create(StringRef Path, size_t Size, unsigned Flags) {
|
|||||||
if (Flags & F_executable)
|
if (Flags & F_executable)
|
||||||
Mode |= fs::all_exe;
|
Mode |= fs::all_exe;
|
||||||
|
|
||||||
|
// If Size is zero, don't use mmap which will fail with EINVAL.
|
||||||
|
if (Size == 0)
|
||||||
|
return createInMemoryBuffer(Path, Size, Mode);
|
||||||
|
|
||||||
fs::file_status Stat;
|
fs::file_status Stat;
|
||||||
fs::status(Path, Stat);
|
fs::status(Path, Stat);
|
||||||
|
|
||||||
|
@ -140,6 +140,21 @@ TEST(FileOutputBuffer, Test) {
|
|||||||
ASSERT_NO_ERROR(fs::file_size(Twine(File5), File5Size));
|
ASSERT_NO_ERROR(fs::file_size(Twine(File5), File5Size));
|
||||||
ASSERT_EQ(File5Size, 8000ULL);
|
ASSERT_EQ(File5Size, 8000ULL);
|
||||||
ASSERT_NO_ERROR(fs::remove(File5.str()));
|
ASSERT_NO_ERROR(fs::remove(File5.str()));
|
||||||
|
|
||||||
|
// TEST 6: Create an empty file.
|
||||||
|
SmallString<128> File6(TestDirectory);
|
||||||
|
File6.append("/file6");
|
||||||
|
{
|
||||||
|
Expected<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
|
||||||
|
FileOutputBuffer::create(File6, 0);
|
||||||
|
ASSERT_NO_ERROR(errorToErrorCode(BufferOrErr.takeError()));
|
||||||
|
ASSERT_NO_ERROR(errorToErrorCode((*BufferOrErr)->commit()));
|
||||||
|
}
|
||||||
|
uint64_t File6Size;
|
||||||
|
ASSERT_NO_ERROR(fs::file_size(Twine(File6), File6Size));
|
||||||
|
ASSERT_EQ(File6Size, 0ULL);
|
||||||
|
ASSERT_NO_ERROR(fs::remove(File6.str()));
|
||||||
|
|
||||||
// Clean up.
|
// Clean up.
|
||||||
ASSERT_NO_ERROR(fs::remove(TestDirectory.str()));
|
ASSERT_NO_ERROR(fs::remove(TestDirectory.str()));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user