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)
|
||||
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::status(Path, Stat);
|
||||
|
||||
|
@ -140,6 +140,21 @@ TEST(FileOutputBuffer, Test) {
|
||||
ASSERT_NO_ERROR(fs::file_size(Twine(File5), File5Size));
|
||||
ASSERT_EQ(File5Size, 8000ULL);
|
||||
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.
|
||||
ASSERT_NO_ERROR(fs::remove(TestDirectory.str()));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user