|
@@ -10,7 +10,6 @@
|
|
|
//
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
-
|
|
|
#include "ASTReaderInternals.h"
|
|
|
#include "clang/Basic/FileManager.h"
|
|
|
#include "clang/Lex/HeaderSearch.h"
|
|
@@ -21,10 +20,12 @@
|
|
|
#include "llvm/ADT/DenseMap.h"
|
|
|
#include "llvm/ADT/MapVector.h"
|
|
|
#include "llvm/ADT/SmallString.h"
|
|
|
+#include "llvm/ADT/StringRef.h"
|
|
|
#include "llvm/Bitstream/BitstreamReader.h"
|
|
|
#include "llvm/Bitstream/BitstreamWriter.h"
|
|
|
#include "llvm/Support/DJB.h"
|
|
|
#include "llvm/Support/FileSystem.h"
|
|
|
+#include "llvm/Support/FileUtilities.h"
|
|
|
#include "llvm/Support/LockFileManager.h"
|
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
|
#include "llvm/Support/OnDiskHashTable.h"
|
|
@@ -912,37 +913,9 @@ GlobalModuleIndex::writeIndex(FileManager &FileMgr,
|
|
|
"failed writing index");
|
|
|
}
|
|
|
|
|
|
- // Write the global index file to a temporary file.
|
|
|
- llvm::SmallString<128> IndexTmpPath;
|
|
|
- int TmpFD;
|
|
|
- if (llvm::sys::fs::createUniqueFile(IndexPath + "-%%%%%%%%", TmpFD,
|
|
|
- IndexTmpPath))
|
|
|
- return llvm::createStringError(std::errc::io_error,
|
|
|
- "failed creating unique file");
|
|
|
-
|
|
|
- // Open the temporary global index file for output.
|
|
|
- llvm::raw_fd_ostream Out(TmpFD, true);
|
|
|
- if (Out.has_error())
|
|
|
- return llvm::createStringError(Out.error(), "failed outputting to stream");
|
|
|
-
|
|
|
- // Write the index.
|
|
|
- Out.write(OutputBuffer.data(), OutputBuffer.size());
|
|
|
- Out.close();
|
|
|
- if (Out.has_error())
|
|
|
- return llvm::createStringError(Out.error(), "failed writing to stream");
|
|
|
-
|
|
|
- // Remove the old index file. It isn't relevant any more.
|
|
|
- llvm::sys::fs::remove(IndexPath);
|
|
|
-
|
|
|
- // Rename the newly-written index file to the proper name.
|
|
|
- if (std::error_code Err = llvm::sys::fs::rename(IndexTmpPath, IndexPath)) {
|
|
|
- // Remove the file on failure, don't check whether removal succeeded.
|
|
|
- llvm::sys::fs::remove(IndexTmpPath);
|
|
|
- return llvm::createStringError(Err, "failed renaming file \"%s\" to \"%s\"",
|
|
|
- IndexTmpPath.c_str(), IndexPath.c_str());
|
|
|
- }
|
|
|
-
|
|
|
- return llvm::Error::success();
|
|
|
+ return llvm::writeFileAtomically(
|
|
|
+ (IndexPath + "-%%%%%%%%").str(), IndexPath,
|
|
|
+ llvm::StringRef(OutputBuffer.data(), OutputBuffer.size()));
|
|
|
}
|
|
|
|
|
|
namespace {
|