[llvm-commits] CVS: llvm/lib/Support/MemoryBuffer.cpp

Chris Lattner sabre at nondot.org
Sun May 6 00:25:04 PDT 2007



Changes in directory llvm/lib/Support:

MemoryBuffer.cpp updated: 1.3 -> 1.4
---
Log message:

Fix MemoryBuffer::getFile to return null if it has an error opening the
file instead of aborting.


---
Diffs of the changes:  (+20 -8)

 MemoryBuffer.cpp |   28 ++++++++++++++++++++--------
 1 files changed, 20 insertions(+), 8 deletions(-)


Index: llvm/lib/Support/MemoryBuffer.cpp
diff -u llvm/lib/Support/MemoryBuffer.cpp:1.3 llvm/lib/Support/MemoryBuffer.cpp:1.4
--- llvm/lib/Support/MemoryBuffer.cpp:1.3	Sun Apr 29 09:43:31 2007
+++ llvm/lib/Support/MemoryBuffer.cpp	Sun May  6 02:24:46 2007
@@ -111,7 +111,9 @@
 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 @@
 };
 }
 
-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 @@
     // 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 @@
                                     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 @@
   }
   
   // 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<char*>(SB->getBufferStart());






More information about the llvm-commits mailing list