diff --git a/lib/ARCMigrate/FileRemapper.cpp b/lib/ARCMigrate/FileRemapper.cpp index aa249f916e0c4ec1b283caa1b38bfe974bf08d02..40e6060900647c04c4c18fbbc199040f4444eeb4 100644 --- a/lib/ARCMigrate/FileRemapper.cpp +++ b/lib/ARCMigrate/FileRemapper.cpp @@ -65,12 +65,13 @@ bool FileRemapper::initFromFile(StringRef filePath, DiagnosticsEngine &Diag, std::vector<std::pair<const FileEntry *, const FileEntry *> > pairs; - std::unique_ptr<llvm::MemoryBuffer> fileBuf; - if (llvm::MemoryBuffer::getFile(infoFile.c_str(), fileBuf)) + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> fileBuf = + llvm::MemoryBuffer::getFile(infoFile.c_str()); + if (!fileBuf) return report("Error opening file: " + infoFile, Diag); SmallVector<StringRef, 64> lines; - fileBuf->getBuffer().split(lines, "\n"); + fileBuf.get()->getBuffer().split(lines, "\n"); for (unsigned idx = 0; idx+3 <= lines.size(); idx += 3) { StringRef fromFilename = lines[idx]; diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp index ccd9c9a2cf9d9b2be5c5ca0b11cad81eecd00ab6..1a2055e9c452a5eb3803aea00b1ebb84dd69bd29 100644 --- a/lib/ARCMigrate/ObjCMT.cpp +++ b/lib/ARCMigrate/ObjCMT.cpp @@ -1943,12 +1943,13 @@ public: bool parse(StringRef File, SmallVectorImpl<EditEntry> &Entries) { using namespace llvm::yaml; - std::unique_ptr<llvm::MemoryBuffer> FileBuf; - if (llvm::MemoryBuffer::getFile(File, FileBuf)) + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileBufOrErr = + llvm::MemoryBuffer::getFile(File); + if (!FileBufOrErr) return true; llvm::SourceMgr SM; - Stream YAMLStream(FileBuf.release(), SM); + Stream YAMLStream(FileBufOrErr.get().release(), SM); document_iterator I = YAMLStream.begin(); if (I == YAMLStream.end()) return true; diff --git a/lib/Basic/VirtualFileSystem.cpp b/lib/Basic/VirtualFileSystem.cpp index 3d5e1ad24a24ca555497e08f0c4929bf83ef9d79..1f2a856b5c4e98215b136dc9fecdb85d93bc2c98 100644 --- a/lib/Basic/VirtualFileSystem.cpp +++ b/lib/Basic/VirtualFileSystem.cpp @@ -126,8 +126,13 @@ std::error_code RealFile::getBuffer(const Twine &Name, bool RequiresNullTerminator, bool IsVolatile) { assert(FD != -1 && "cannot get buffer for closed file"); - return MemoryBuffer::getOpenFile(FD, Name.str().c_str(), Result, FileSize, - RequiresNullTerminator, IsVolatile); + ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr = + MemoryBuffer::getOpenFile(FD, Name.str().c_str(), FileSize, + RequiresNullTerminator, IsVolatile); + if (std::error_code EC = BufferOrErr.getError()) + return EC; + Result = std::move(BufferOrErr.get()); + return std::error_code(); } // FIXME: This is terrible, we need this for ::close. @@ -1202,4 +1207,4 @@ recursive_directory_iterator::increment(std::error_code &EC) { State.reset(); // end iterator return *this; -} \ No newline at end of file +} diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 1e47a62359a3614a704398e509cfd452e33e0e21..99bde6c38b2e5308534ed1e43405654cfb9e9c27 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -2794,8 +2794,9 @@ static bool IsUbuntu(enum Distro Distro) { } static Distro DetectDistro(llvm::Triple::ArchType Arch) { - std::unique_ptr<llvm::MemoryBuffer> File; - if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) { + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File = + llvm::MemoryBuffer::getFile("/etc/lsb-release"); + if (File) { StringRef Data = File.get()->getBuffer(); SmallVector<StringRef, 8> Lines; Data.split(Lines, "\n"); @@ -2820,7 +2821,8 @@ static Distro DetectDistro(llvm::Triple::ArchType Arch) { return Version; } - if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) { + File = llvm::MemoryBuffer::getFile("/etc/redhat-release"); + if (File) { StringRef Data = File.get()->getBuffer(); if (Data.startswith("Fedora release")) return Fedora; @@ -2836,7 +2838,8 @@ static Distro DetectDistro(llvm::Triple::ArchType Arch) { return UnknownDistro; } - if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) { + File = llvm::MemoryBuffer::getFile("/etc/debian_version"); + if (File) { StringRef Data = File.get()->getBuffer(); if (Data[0] == '5') return DebianLenny; diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 5cbad82edb33074b761c9458bff2b0f027221a47..2ac5c9da0f9b8c467d3cf668ff70a19d9e369242 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -2082,13 +2082,14 @@ FormatStyle getStyle(StringRef StyleName, StringRef FileName, } if (IsFile) { - std::unique_ptr<llvm::MemoryBuffer> Text; - if (std::error_code ec = - llvm::MemoryBuffer::getFile(ConfigFile.c_str(), Text)) { - llvm::errs() << ec.message() << "\n"; + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text = + llvm::MemoryBuffer::getFile(ConfigFile.c_str()); + if (std::error_code EC = Text.getError()) { + llvm::errs() << EC.message() << "\n"; break; } - if (std::error_code ec = parseConfiguration(Text->getBuffer(), &Style)) { + if (std::error_code ec = + parseConfiguration(Text.get()->getBuffer(), &Style)) { if (ec == ParseError::Unsuitable) { if (!UnsuitableConfigFiles.empty()) UnsuitableConfigFiles.append(", "); diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 93799c8c43a647016d98caadfb8f2ba424e12b7f..49918f4c06d2516c70c5285f29322f2f4a26edba 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -683,11 +683,14 @@ bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input, SourceMgr.setMainFileID( SourceMgr.createFileID(File, SourceLocation(), Kind)); } else { - std::unique_ptr<llvm::MemoryBuffer> SB; - if (std::error_code ec = llvm::MemoryBuffer::getSTDIN(SB)) { - Diags.Report(diag::err_fe_error_reading_stdin) << ec.message(); + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> SBOrErr = + llvm::MemoryBuffer::getSTDIN(); + if (std::error_code EC = SBOrErr.getError()) { + Diags.Report(diag::err_fe_error_reading_stdin) << EC.message(); return false; } + std::unique_ptr<llvm::MemoryBuffer> SB = std::move(SBOrErr.get()); + const FileEntry *File = FileMgr.getVirtualFile(SB->getBufferIdentifier(), SB->getBufferSize(), 0); SourceMgr.setMainFileID( diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index d04d8291a488cecc508f552a9ee438140549bfa2..3d79ac797e91d844855099fba642dcc06862ac66 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1957,14 +1957,16 @@ std::string CompilerInvocation::getModuleHash() const { // $sysroot/System/Library/CoreServices/SystemVersion.plist // as part of the module hash. if (!hsOpts.Sysroot.empty()) { - std::unique_ptr<llvm::MemoryBuffer> buffer; SmallString<128> systemVersionFile; systemVersionFile += hsOpts.Sysroot; llvm::sys::path::append(systemVersionFile, "System"); llvm::sys::path::append(systemVersionFile, "Library"); llvm::sys::path::append(systemVersionFile, "CoreServices"); llvm::sys::path::append(systemVersionFile, "SystemVersion.plist"); - if (!llvm::MemoryBuffer::getFile(systemVersionFile.str(), buffer)) { + + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buffer = + llvm::MemoryBuffer::getFile(systemVersionFile.str()); + if (buffer) { code = hash_combine(code, buffer.get()->getBuffer()); struct stat statBuf; @@ -2031,14 +2033,15 @@ createVFSFromCompilerInvocation(const CompilerInvocation &CI, Overlay(new vfs::OverlayFileSystem(vfs::getRealFileSystem())); // earlier vfs files are on the bottom for (const std::string &File : CI.getHeaderSearchOpts().VFSOverlayFiles) { - std::unique_ptr<llvm::MemoryBuffer> Buffer; - if (llvm::MemoryBuffer::getFile(File, Buffer)) { + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer = + llvm::MemoryBuffer::getFile(File); + if (!Buffer) { Diags.Report(diag::err_missing_vfs_overlay_file) << File; return IntrusiveRefCntPtr<vfs::FileSystem>(); } IntrusiveRefCntPtr<vfs::FileSystem> FS = - vfs::getVFSFromYAML(Buffer.release(), /*DiagHandler*/nullptr); + vfs::getVFSFromYAML(Buffer->release(), /*DiagHandler*/ nullptr); if (!FS.get()) { Diags.Report(diag::err_invalid_vfs_overlay) << File; return IntrusiveRefCntPtr<vfs::FileSystem>(); diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp index 844d66a8a1c7b705c93e8bb032f8d04b7b3ec1c0..d985abac6b3121781709b4d373c566297d44cf4f 100644 --- a/lib/Lex/PTHLexer.cpp +++ b/lib/Lex/PTHLexer.cpp @@ -440,13 +440,15 @@ static void InvalidPTH(DiagnosticsEngine &Diags, const char *Msg) { PTHManager *PTHManager::Create(const std::string &file, DiagnosticsEngine &Diags) { // Memory map the PTH file. - std::unique_ptr<llvm::MemoryBuffer> File; + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileOrErr = + llvm::MemoryBuffer::getFile(file); - if (llvm::MemoryBuffer::getFile(file, File)) { + if (!FileOrErr) { // FIXME: Add ec.message() to this diag. Diags.Report(diag::err_invalid_pth_file) << file; return nullptr; } + std::unique_ptr<llvm::MemoryBuffer> File = std::move(FileOrErr.get()); using namespace llvm::support; diff --git a/lib/Serialization/GlobalModuleIndex.cpp b/lib/Serialization/GlobalModuleIndex.cpp index a1bec89efb9da8d24d358177bcf7bdb1e4c2ca64..985812232505342defb496fd9156da0982aa3637 100644 --- a/lib/Serialization/GlobalModuleIndex.cpp +++ b/lib/Serialization/GlobalModuleIndex.cpp @@ -239,9 +239,11 @@ GlobalModuleIndex::readIndex(StringRef Path) { IndexPath += Path; llvm::sys::path::append(IndexPath, IndexFileName); - std::unique_ptr<llvm::MemoryBuffer> Buffer; - if (llvm::MemoryBuffer::getFile(IndexPath.c_str(), Buffer)) + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> BufferOrErr = + llvm::MemoryBuffer::getFile(IndexPath.c_str()); + if (!BufferOrErr) return std::make_pair(nullptr, EC_NotFound); + std::unique_ptr<llvm::MemoryBuffer> Buffer = std::move(BufferOrErr.get()); /// \brief The bitstream reader from which we'll read the AST file. llvm::BitstreamReader Reader((const unsigned char *)Buffer->getBufferStart(), diff --git a/lib/Serialization/ModuleManager.cpp b/lib/Serialization/ModuleManager.cpp index 0a9ea69d695c3a339df82b58804b6c3887223c41..2c10c119a07bd268ebacf6159bef5bd77a1361e0 100644 --- a/lib/Serialization/ModuleManager.cpp +++ b/lib/Serialization/ModuleManager.cpp @@ -106,9 +106,13 @@ ModuleManager::addModule(StringRef FileName, ModuleKind Type, // Open the AST file. std::error_code ec; if (FileName == "-") { - ec = llvm::MemoryBuffer::getSTDIN(New->Buffer); + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buf = + llvm::MemoryBuffer::getSTDIN(); + ec = Buf.getError(); if (ec) ErrorStr = ec.message(); + else + New->Buffer = std::move(Buf.get()); } else { // Leave the FileEntry open so if it gets read again by another // ModuleManager it must be the same underlying file. diff --git a/lib/Tooling/JSONCompilationDatabase.cpp b/lib/Tooling/JSONCompilationDatabase.cpp index 94fdb5f9a9e96f809751031a066e0349c739c008..8b8bd293851f3713ed9f2d4e6c2f9223e81744d2 100644 --- a/lib/Tooling/JSONCompilationDatabase.cpp +++ b/lib/Tooling/JSONCompilationDatabase.cpp @@ -144,15 +144,14 @@ volatile int JSONAnchorSource = 0; JSONCompilationDatabase * JSONCompilationDatabase::loadFromFile(StringRef FilePath, std::string &ErrorMessage) { - std::unique_ptr<llvm::MemoryBuffer> DatabaseBuffer; - std::error_code Result = - llvm::MemoryBuffer::getFile(FilePath, DatabaseBuffer); - if (Result) { + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> DatabaseBuffer = + llvm::MemoryBuffer::getFile(FilePath); + if (std::error_code Result = DatabaseBuffer.getError()) { ErrorMessage = "Error while opening JSON database: " + Result.message(); return nullptr; } std::unique_ptr<JSONCompilationDatabase> Database( - new JSONCompilationDatabase(DatabaseBuffer.release())); + new JSONCompilationDatabase(DatabaseBuffer->release())); if (!Database->parse(ErrorMessage)) return nullptr; return Database.release(); diff --git a/tools/arcmt-test/arcmt-test.cpp b/tools/arcmt-test/arcmt-test.cpp index 8a329929357263411febacc7665df234170332de..27da45fffae80665ed4c60027e56416b0b70112c 100644 --- a/tools/arcmt-test/arcmt-test.cpp +++ b/tools/arcmt-test/arcmt-test.cpp @@ -207,17 +207,15 @@ static bool performTransformations(StringRef resourcesPath, static bool filesCompareEqual(StringRef fname1, StringRef fname2) { using namespace llvm; - std::unique_ptr<MemoryBuffer> file1; - MemoryBuffer::getFile(fname1, file1); + ErrorOr<std::unique_ptr<MemoryBuffer>> file1 = MemoryBuffer::getFile(fname1); if (!file1) return false; - std::unique_ptr<MemoryBuffer> file2; - MemoryBuffer::getFile(fname2, file2); + ErrorOr<std::unique_ptr<MemoryBuffer>> file2 = MemoryBuffer::getFile(fname2); if (!file2) return false; - return file1->getBuffer() == file2->getBuffer(); + return file1.get()->getBuffer() == file2.get()->getBuffer(); } static bool verifyTransformedFiles(ArrayRef<std::string> resultFiles) { @@ -238,18 +236,19 @@ static bool verifyTransformedFiles(ArrayRef<std::string> resultFiles) { resultMap[sys::path::stem(fname)] = fname; } - std::unique_ptr<MemoryBuffer> inputBuf; + ErrorOr<std::unique_ptr<MemoryBuffer>> inputBuf = std::error_code(); if (RemappingsFile.empty()) - MemoryBuffer::getSTDIN(inputBuf); + inputBuf = MemoryBuffer::getSTDIN(); else - MemoryBuffer::getFile(RemappingsFile, inputBuf); + inputBuf = MemoryBuffer::getFile(RemappingsFile); if (!inputBuf) { errs() << "error: could not read remappings input\n"; return true; } SmallVector<StringRef, 8> strs; - inputBuf->getBuffer().split(strs, "\n", /*MaxSplit=*/-1, /*KeepEmpty=*/false); + inputBuf.get()->getBuffer().split(strs, "\n", /*MaxSplit=*/-1, + /*KeepEmpty=*/false); if (strs.empty()) { errs() << "error: no files to verify from stdin\n"; diff --git a/tools/clang-format/ClangFormat.cpp b/tools/clang-format/ClangFormat.cpp index 575ac7a93d8ce8ea131ebb6e2cf49312affb4dbb..cebb2757d4da0ae953ef6f81f0dd3cbd810320c9 100644 --- a/tools/clang-format/ClangFormat.cpp +++ b/tools/clang-format/ClangFormat.cpp @@ -209,11 +209,13 @@ static bool format(StringRef FileName) { IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs), new DiagnosticOptions); SourceManager Sources(Diagnostics, Files); - std::unique_ptr<MemoryBuffer> Code; - if (std::error_code ec = MemoryBuffer::getFileOrSTDIN(FileName, Code)) { - llvm::errs() << ec.message() << "\n"; + ErrorOr<std::unique_ptr<MemoryBuffer>> CodeOrErr = + MemoryBuffer::getFileOrSTDIN(FileName); + if (std::error_code EC = CodeOrErr.getError()) { + llvm::errs() << EC.message() << "\n"; return true; } + std::unique_ptr<llvm::MemoryBuffer> Code = std::move(CodeOrErr.get()); if (Code->getBufferSize() == 0) return false; // Empty files are formatted correctly. FileID ID = createInMemoryFile(FileName, Code.get(), Sources, Files); diff --git a/tools/driver/cc1as_main.cpp b/tools/driver/cc1as_main.cpp index 2b4e97d8d8b47708d2f59e28505f9981369ba4b8..2393d198cc1fa65ce2550332d876f88fe8ef4b63 100644 --- a/tools/driver/cc1as_main.cpp +++ b/tools/driver/cc1as_main.cpp @@ -281,17 +281,18 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, if (!TheTarget) return Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; - std::unique_ptr<MemoryBuffer> Buffer; - if (std::error_code ec = - MemoryBuffer::getFileOrSTDIN(Opts.InputFile, Buffer)) { - Error = ec.message(); + ErrorOr<std::unique_ptr<MemoryBuffer>> Buffer = + MemoryBuffer::getFileOrSTDIN(Opts.InputFile); + + if (std::error_code EC = Buffer.getError()) { + Error = EC.message(); return Diags.Report(diag::err_fe_error_reading) << Opts.InputFile; } SourceMgr SrcMgr; // Tell SrcMgr about this buffer, which is what the parser will pick up. - SrcMgr.AddNewSourceBuffer(Buffer.release(), SMLoc()); + SrcMgr.AddNewSourceBuffer(Buffer->release(), SMLoc()); // Record the location of the include directories so that the lexer can find // it later.