aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Support/FileUtilities.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Support/FileUtilities.cpp')
-rw-r--r--llvm/lib/Support/FileUtilities.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/llvm/lib/Support/FileUtilities.cpp b/llvm/lib/Support/FileUtilities.cpp
index 62eb7bfd..b933692 100644
--- a/llvm/lib/Support/FileUtilities.cpp
+++ b/llvm/lib/Support/FileUtilities.cpp
@@ -15,6 +15,7 @@
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/ErrorOr.h"
#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
#include <cctype>
#include <cmath>
@@ -264,3 +265,37 @@ int llvm::DiffFilesWithTolerance(StringRef NameA,
return CompareFailed;
}
+
+Error llvm::writeFileAtomically(StringRef TempPathModel, StringRef FinalPath,
+ StringRef Buffer) {
+ SmallString<128> GeneratedUniqPath;
+ int TempFD;
+ if (const std::error_code Error = sys::fs::createUniqueFile(
+ TempPathModel.str(), TempFD, GeneratedUniqPath)) {
+ return createStringError(
+ Error, "failed to create temporary file with model \"%s\"",
+ TempPathModel.str().c_str());
+ }
+
+ raw_fd_ostream OS(TempFD, /*shouldClose=*/true);
+ OS.write(Buffer.data(), Buffer.size());
+ OS.close();
+ TempFD = -1;
+
+ if (OS.has_error()) {
+ const std::error_code Error = OS.error();
+ OS.clear_error();
+ return createStringError(Error, "failed to write to \"%s\"",
+ GeneratedUniqPath.c_str());
+ }
+
+ if (const std::error_code Error =
+ sys::fs::rename(/*from=*/GeneratedUniqPath.c_str(),
+ /*to=*/FinalPath.str().c_str())) {
+ return createStringError(Error, "failed to rename file \"%s\" to \"%s\"",
+ GeneratedUniqPath.c_str(),
+ FinalPath.str().c_str());
+ }
+
+ return Error::success();
+}