From: Chris Lattner Date: Sun, 6 May 2007 07:24:46 +0000 (+0000) Subject: Fix MemoryBuffer::getFile to return null if it has an error opening the X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=82e791dc420c399b7382a4754019b80466c898b0;p=oota-llvm.git Fix MemoryBuffer::getFile to return null if it has an error opening the file instead of aborting. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36858 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Support/MemoryBuffer.cpp b/lib/Support/MemoryBuffer.cpp index 96035354e52..ffbb4beccfa 100644 --- a/lib/Support/MemoryBuffer.cpp +++ b/lib/Support/MemoryBuffer.cpp @@ -111,7 +111,9 @@ namespace { class MemoryBufferMMapFile : public MemoryBuffer { sys::MappedFile File; public: - MemoryBufferMMapFile(const sys::Path &Filename); + MemoryBufferMMapFile() {} + + bool open(const sys::Path &Filename); virtual const char *getBufferIdentifier() const { return File.path().c_str(); @@ -121,12 +123,11 @@ public: }; } -MemoryBufferMMapFile::MemoryBufferMMapFile(const sys::Path &Filename) { +bool MemoryBufferMMapFile::open(const sys::Path &Filename) { // FIXME: This does an extra stat syscall to figure out the size, but we // already know the size! bool Failure = File.open(Filename); - Failure = Failure; // Silence warning in no-asserts mode. - assert(!Failure && "Can't open file??"); + if (Failure) return true; File.map(); @@ -147,10 +148,12 @@ MemoryBufferMMapFile::MemoryBufferMMapFile(const sys::Path &Filename) { // No need to keep the file mapped any longer. File.unmap(); } + return false; } MemoryBufferMMapFile::~MemoryBufferMMapFile() { - File.unmap(); + if (File.isMapped()) + File.unmap(); } //===----------------------------------------------------------------------===// @@ -161,7 +164,11 @@ MemoryBuffer *MemoryBuffer::getFile(const char *FilenameStart, unsigned FnSize, int64_t FileSize) { sys::PathWithStatus P(FilenameStart, FnSize); #if 1 - return new MemoryBufferMMapFile(P); + MemoryBufferMMapFile *M = new MemoryBufferMMapFile(); + if (!M->open(P)) + return M; + delete M; + return 0; #else // FIXME: We need an efficient and portable method to open a file and then use // 'read' to copy the bits out. The unix implementation is below. This is @@ -177,8 +184,13 @@ MemoryBuffer *MemoryBuffer::getFile(const char *FilenameStart, unsigned FnSize, } // If the file is larger than some threshold, use mmap, otherwise use 'read'. - if (FileSize >= 4096*4) - return new MemoryBufferMMapFile(P); + if (FileSize >= 4096*4) { + MemoryBufferMMapFile *M = new MemoryBufferMMapFile(); + if (!M->open(P)) + return M; + delete M; + return 0; + } MemoryBuffer *SB = getNewUninitMemBuffer(FileSize, FilenameStart); char *BufPtr = const_cast(SB->getBufferStart());