summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/FileOutputBuffer.cpp
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2019-01-22 21:49:56 +0000
committerRui Ueyama <ruiu@google.com>2019-01-22 21:49:56 +0000
commit21d451caa065f5ff2807cb692fdc1d7de6fc0bb5 (patch)
treee6093346904ec357c35c3d66d37958de53f18662 /llvm/lib/Support/FileOutputBuffer.cpp
parent30989e492b8e32ec5f558777b8988ccea8ce5155 (diff)
downloadbcm5719-llvm-21d451caa065f5ff2807cb692fdc1d7de6fc0bb5.tar.gz
bcm5719-llvm-21d451caa065f5ff2807cb692fdc1d7de6fc0bb5.zip
FileOutputBuffer: handle mmap(2) failure
If the underlying filesystem does not support mmap system call, FileOutputBuffer may fail when it attempts to mmap an output temporary file. This patch handles such situation. Unfortunately, it looks like it is very hard to test this functionality without a filesystem that doesn't support mmap using llvm-lit. I tested this locally by passing an invalid parameter to mmap so that it fails and falls back to the in-memory buffer. Maybe that's all what we can do. I believe it is reasonable to submit this without a test. Differential Revision: https://reviews.llvm.org/D56949 llvm-svn: 351883
Diffstat (limited to 'llvm/lib/Support/FileOutputBuffer.cpp')
-rw-r--r--llvm/lib/Support/FileOutputBuffer.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/Support/FileOutputBuffer.cpp b/llvm/lib/Support/FileOutputBuffer.cpp
index cf21cc19c01..b0b817b4bdd 100644
--- a/llvm/lib/Support/FileOutputBuffer.cpp
+++ b/llvm/lib/Support/FileOutputBuffer.cpp
@@ -120,7 +120,7 @@ createInMemoryBuffer(StringRef Path, size_t Size, unsigned Mode) {
return llvm::make_unique<InMemoryBuffer>(Path, MB, Mode);
}
-static Expected<std::unique_ptr<OnDiskBuffer>>
+static Expected<std::unique_ptr<FileOutputBuffer>>
createOnDiskBuffer(StringRef Path, size_t Size, unsigned Mode) {
Expected<fs::TempFile> FileOrErr =
fs::TempFile::create(Path + ".tmp%%%%%%%", Mode);
@@ -144,10 +144,14 @@ createOnDiskBuffer(StringRef Path, size_t Size, unsigned Mode) {
std::error_code EC;
auto MappedFile = llvm::make_unique<fs::mapped_file_region>(
File.FD, fs::mapped_file_region::readwrite, Size, 0, EC);
+
+ // mmap(2) can fail if the underlying filesystem does not support it.
+ // If that happens, we fall back to in-memory buffer as the last resort.
if (EC) {
consumeError(File.discard());
- return errorCodeToError(EC);
+ return createInMemoryBuffer(Path, Size, Mode);
}
+
return llvm::make_unique<OnDiskBuffer>(Path, std::move(File),
std::move(MappedFile));
}
OpenPOWER on IntegriCloud