[llvm-commits] CVS: llvm/lib/Support/MemoryBuffer.cpp
Reid Spencer
rspencer at reidspencer.com
Sun May 6 00:35:22 PDT 2007
On Sun, 2007-05-06 at 02:25 -0500, Chris Lattner wrote:
>
> 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);
Shouldn't this have a parameter to receive the error message ?
>
> 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);
This needs to have an error message parameter to receive the error
message.
> - Failure = Failure; // Silence warning in no-asserts mode.
> - assert(!Failure && "Can't open file??");
> + if (Failure) return true;
This is insufficient. The caller doesn't know why the
MemoryBufferMMapFile couldn't be opened.
>
> 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());
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list