From 9f9bd8e4af8c5e7ae02eb5de418a49a6fdafb3f1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 23 Nov 2010 06:09:51 +0000 Subject: Revert functionality doug added in r98575 that was never documented and only used by some clang stuff I just removed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120002 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/MemoryBuffer.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) (limited to 'lib/Support/MemoryBuffer.cpp') diff --git a/lib/Support/MemoryBuffer.cpp b/lib/Support/MemoryBuffer.cpp index 542162d..da46853 100644 --- a/lib/Support/MemoryBuffer.cpp +++ b/lib/Support/MemoryBuffer.cpp @@ -144,20 +144,18 @@ MemoryBuffer *MemoryBuffer::getNewMemBuffer(size_t Size, StringRef BufferName) { /// returns an empty buffer. MemoryBuffer *MemoryBuffer::getFileOrSTDIN(StringRef Filename, std::string *ErrStr, - int64_t FileSize, - struct stat *FileInfo) { + int64_t FileSize) { if (Filename == "-") return getSTDIN(ErrStr); - return getFile(Filename, ErrStr, FileSize, FileInfo); + return getFile(Filename, ErrStr, FileSize); } MemoryBuffer *MemoryBuffer::getFileOrSTDIN(const char *Filename, std::string *ErrStr, - int64_t FileSize, - struct stat *FileInfo) { + int64_t FileSize) { if (strcmp(Filename, "-") == 0) return getSTDIN(ErrStr); - return getFile(Filename, ErrStr, FileSize, FileInfo); + return getFile(Filename, ErrStr, FileSize); } //===----------------------------------------------------------------------===// @@ -188,13 +186,13 @@ public: } MemoryBuffer *MemoryBuffer::getFile(StringRef Filename, std::string *ErrStr, - int64_t FileSize, struct stat *FileInfo) { + int64_t FileSize) { SmallString<256> PathBuf(Filename.begin(), Filename.end()); - return MemoryBuffer::getFile(PathBuf.c_str(), ErrStr, FileSize, FileInfo); + return MemoryBuffer::getFile(PathBuf.c_str(), ErrStr, FileSize); } MemoryBuffer *MemoryBuffer::getFile(const char *Filename, std::string *ErrStr, - int64_t FileSize, struct stat *FileInfo) { + int64_t FileSize) { int OpenFlags = O_RDONLY; #ifdef O_BINARY OpenFlags |= O_BINARY; // Open input file in binary mode on win32. @@ -208,16 +206,14 @@ MemoryBuffer *MemoryBuffer::getFile(const char *Filename, std::string *ErrStr, // If we don't know the file size, use fstat to find out. fstat on an open // file descriptor is cheaper than stat on a random path. - if (FileSize == -1 || FileInfo) { - struct stat MyFileInfo; - struct stat *FileInfoPtr = FileInfo? FileInfo : &MyFileInfo; - + if (FileSize == -1) { + struct stat FileInfo; // TODO: This should use fstat64 when available. - if (fstat(FD, FileInfoPtr) == -1) { + if (fstat(FD, &FileInfo) == -1) { if (ErrStr) *ErrStr = sys::StrError(); return 0; } - FileSize = FileInfoPtr->st_size; + FileSize = FileInfo.st_size; } -- cgit v1.1 From 7cf705461cfdca5dd5b48a5065f8e24a1ce8c8c4 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 23 Nov 2010 22:20:27 +0000 Subject: add a MemoryBuffer::getOpenFile method, which turns an open file descriptor into a MemoryBuffer (and closes the FD). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120065 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/MemoryBuffer.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'lib/Support/MemoryBuffer.cpp') diff --git a/lib/Support/MemoryBuffer.cpp b/lib/Support/MemoryBuffer.cpp index da46853..5b701a5 100644 --- a/lib/Support/MemoryBuffer.cpp +++ b/lib/Support/MemoryBuffer.cpp @@ -187,6 +187,7 @@ public: MemoryBuffer *MemoryBuffer::getFile(StringRef Filename, std::string *ErrStr, int64_t FileSize) { + // Ensure the path is null terminated. SmallString<256> PathBuf(Filename.begin(), Filename.end()); return MemoryBuffer::getFile(PathBuf.c_str(), ErrStr, FileSize); } @@ -202,6 +203,12 @@ MemoryBuffer *MemoryBuffer::getFile(const char *Filename, std::string *ErrStr, if (ErrStr) *ErrStr = sys::StrError(); return 0; } + + return getOpenFile(FD, Filename, ErrStr, FileSize); +} + +MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, + std::string *ErrStr, int64_t FileSize) { FileCloser FC(FD); // Close FD on return. // If we don't know the file size, use fstat to find out. fstat on an open -- cgit v1.1 From 1f6efa3996dd1929fbc129203ce5009b620e6969 Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Mon, 29 Nov 2010 18:16:10 +0000 Subject: Merge System into Support. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120298 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/MemoryBuffer.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'lib/Support/MemoryBuffer.cpp') diff --git a/lib/Support/MemoryBuffer.cpp b/lib/Support/MemoryBuffer.cpp index 5b701a5..07a5ed4 100644 --- a/lib/Support/MemoryBuffer.cpp +++ b/lib/Support/MemoryBuffer.cpp @@ -15,10 +15,10 @@ #include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/MathExtras.h" -#include "llvm/System/Errno.h" -#include "llvm/System/Path.h" -#include "llvm/System/Process.h" -#include "llvm/System/Program.h" +#include "llvm/Support/Errno.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/Program.h" #include #include #include @@ -203,14 +203,14 @@ MemoryBuffer *MemoryBuffer::getFile(const char *Filename, std::string *ErrStr, if (ErrStr) *ErrStr = sys::StrError(); return 0; } - + return getOpenFile(FD, Filename, ErrStr, FileSize); } - + MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, std::string *ErrStr, int64_t FileSize) { FileCloser FC(FD); // Close FD on return. - + // If we don't know the file size, use fstat to find out. fstat on an open // file descriptor is cheaper than stat on a random path. if (FileSize == -1) { @@ -222,8 +222,8 @@ MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, } FileSize = FileInfo.st_size; } - - + + // If the file is large, try to use mmap to read it in. We don't use mmap // for small files, because this can severely fragment our address space. Also // don't try to map files that are exactly a multiple of the system page size, -- cgit v1.1 From 333fb04506233255f10d8095c9e2de5e5f0fdc6f Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Thu, 9 Dec 2010 17:36:48 +0000 Subject: Support/MemoryBuffer: Replace all uses of std::string *ErrMsg with error_code &ec. And fix clients. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121379 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/MemoryBuffer.cpp | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) (limited to 'lib/Support/MemoryBuffer.cpp') diff --git a/lib/Support/MemoryBuffer.cpp b/lib/Support/MemoryBuffer.cpp index 07a5ed4..0966f90 100644 --- a/lib/Support/MemoryBuffer.cpp +++ b/lib/Support/MemoryBuffer.cpp @@ -19,6 +19,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" #include "llvm/Support/Program.h" +#include "llvm/Support/system_error.h" #include #include #include @@ -143,19 +144,19 @@ MemoryBuffer *MemoryBuffer::getNewMemBuffer(size_t Size, StringRef BufferName) { /// in *ErrStr with a reason. If stdin is empty, this API (unlike getSTDIN) /// returns an empty buffer. MemoryBuffer *MemoryBuffer::getFileOrSTDIN(StringRef Filename, - std::string *ErrStr, + error_code &ec, int64_t FileSize) { if (Filename == "-") - return getSTDIN(ErrStr); - return getFile(Filename, ErrStr, FileSize); + return getSTDIN(ec); + return getFile(Filename, ec, FileSize); } MemoryBuffer *MemoryBuffer::getFileOrSTDIN(const char *Filename, - std::string *ErrStr, + error_code &ec, int64_t FileSize) { if (strcmp(Filename, "-") == 0) - return getSTDIN(ErrStr); - return getFile(Filename, ErrStr, FileSize); + return getSTDIN(ec); + return getFile(Filename, ec, FileSize); } //===----------------------------------------------------------------------===// @@ -185,14 +186,14 @@ public: }; } -MemoryBuffer *MemoryBuffer::getFile(StringRef Filename, std::string *ErrStr, +MemoryBuffer *MemoryBuffer::getFile(StringRef Filename, error_code &ec, int64_t FileSize) { // Ensure the path is null terminated. SmallString<256> PathBuf(Filename.begin(), Filename.end()); - return MemoryBuffer::getFile(PathBuf.c_str(), ErrStr, FileSize); + return MemoryBuffer::getFile(PathBuf.c_str(), ec, FileSize); } -MemoryBuffer *MemoryBuffer::getFile(const char *Filename, std::string *ErrStr, +MemoryBuffer *MemoryBuffer::getFile(const char *Filename, error_code &ec, int64_t FileSize) { int OpenFlags = O_RDONLY; #ifdef O_BINARY @@ -200,15 +201,15 @@ MemoryBuffer *MemoryBuffer::getFile(const char *Filename, std::string *ErrStr, #endif int FD = ::open(Filename, OpenFlags); if (FD == -1) { - if (ErrStr) *ErrStr = sys::StrError(); + ec = error_code(errno, posix_category()); return 0; } - return getOpenFile(FD, Filename, ErrStr, FileSize); + return getOpenFile(FD, Filename, ec, FileSize); } MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, - std::string *ErrStr, int64_t FileSize) { + error_code &ec, int64_t FileSize) { FileCloser FC(FD); // Close FD on return. // If we don't know the file size, use fstat to find out. fstat on an open @@ -217,7 +218,7 @@ MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, struct stat FileInfo; // TODO: This should use fstat64 when available. if (fstat(FD, &FileInfo) == -1) { - if (ErrStr) *ErrStr = sys::StrError(); + ec = error_code(errno, posix_category()); return 0; } FileSize = FileInfo.st_size; @@ -240,8 +241,9 @@ MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, MemoryBuffer *Buf = MemoryBuffer::getNewUninitMemBuffer(FileSize, Filename); if (!Buf) { - // Failed to create a buffer. - if (ErrStr) *ErrStr = "could not allocate buffer"; + // Failed to create a buffer. The only way it can fail is if + // new(std::nothrow) returns 0. + ec = make_error_code(errc::not_enough_memory); return 0; } @@ -255,7 +257,7 @@ MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, if (errno == EINTR) continue; // Error while reading. - if (ErrStr) *ErrStr = sys::StrError(); + ec = error_code(errno, posix_category()); return 0; } else if (NumRead == 0) { // We hit EOF early, truncate and terminate buffer. @@ -274,7 +276,7 @@ MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, // MemoryBuffer::getSTDIN implementation. //===----------------------------------------------------------------------===// -MemoryBuffer *MemoryBuffer::getSTDIN(std::string *ErrStr) { +MemoryBuffer *MemoryBuffer::getSTDIN(error_code &ec) { // Read in all of the data from stdin, we cannot mmap stdin. // // FIXME: That isn't necessarily true, we should try to mmap stdin and @@ -290,7 +292,7 @@ MemoryBuffer *MemoryBuffer::getSTDIN(std::string *ErrStr) { ReadBytes = read(0, Buffer.end(), ChunkSize); if (ReadBytes == -1) { if (errno == EINTR) continue; - if (ErrStr) *ErrStr = sys::StrError(); + ec = error_code(errno, posix_category()); return 0; } Buffer.set_size(Buffer.size() + ReadBytes); -- cgit v1.1 From 3ff9563c3e391954b2e224afcf8b2b0fcc3888aa Mon Sep 17 00:00:00 2001 From: "Michael J. Spencer" Date: Thu, 16 Dec 2010 03:29:14 +0000 Subject: MemoryBuffer now return an error_code and returns a OwningPtr via an out parm. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121958 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/MemoryBuffer.cpp | 72 +++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 34 deletions(-) (limited to 'lib/Support/MemoryBuffer.cpp') diff --git a/lib/Support/MemoryBuffer.cpp b/lib/Support/MemoryBuffer.cpp index 0966f90..d3c71b9 100644 --- a/lib/Support/MemoryBuffer.cpp +++ b/lib/Support/MemoryBuffer.cpp @@ -35,6 +35,8 @@ #include using namespace llvm; +namespace { const llvm::error_code success; } + //===----------------------------------------------------------------------===// // MemoryBuffer implementation itself. //===----------------------------------------------------------------------===// @@ -143,20 +145,20 @@ MemoryBuffer *MemoryBuffer::getNewMemBuffer(size_t Size, StringRef BufferName) { /// if the Filename is "-". If an error occurs, this returns null and fills /// in *ErrStr with a reason. If stdin is empty, this API (unlike getSTDIN) /// returns an empty buffer. -MemoryBuffer *MemoryBuffer::getFileOrSTDIN(StringRef Filename, - error_code &ec, - int64_t FileSize) { +error_code MemoryBuffer::getFileOrSTDIN(StringRef Filename, + OwningPtr &result, + int64_t FileSize) { if (Filename == "-") - return getSTDIN(ec); - return getFile(Filename, ec, FileSize); + return getSTDIN(result); + return getFile(Filename, result, FileSize); } -MemoryBuffer *MemoryBuffer::getFileOrSTDIN(const char *Filename, - error_code &ec, - int64_t FileSize) { +error_code MemoryBuffer::getFileOrSTDIN(const char *Filename, + OwningPtr &result, + int64_t FileSize) { if (strcmp(Filename, "-") == 0) - return getSTDIN(ec); - return getFile(Filename, ec, FileSize); + return getSTDIN(result); + return getFile(Filename, result, FileSize); } //===----------------------------------------------------------------------===// @@ -186,30 +188,32 @@ public: }; } -MemoryBuffer *MemoryBuffer::getFile(StringRef Filename, error_code &ec, - int64_t FileSize) { +error_code MemoryBuffer::getFile(StringRef Filename, + OwningPtr &result, + int64_t FileSize) { // Ensure the path is null terminated. SmallString<256> PathBuf(Filename.begin(), Filename.end()); - return MemoryBuffer::getFile(PathBuf.c_str(), ec, FileSize); + return MemoryBuffer::getFile(PathBuf.c_str(), result, FileSize); } -MemoryBuffer *MemoryBuffer::getFile(const char *Filename, error_code &ec, - int64_t FileSize) { +error_code MemoryBuffer::getFile(const char *Filename, + OwningPtr &result, + int64_t FileSize) { int OpenFlags = O_RDONLY; #ifdef O_BINARY OpenFlags |= O_BINARY; // Open input file in binary mode on win32. #endif int FD = ::open(Filename, OpenFlags); if (FD == -1) { - ec = error_code(errno, posix_category()); - return 0; + return error_code(errno, posix_category()); } - return getOpenFile(FD, Filename, ec, FileSize); + return getOpenFile(FD, Filename, result, FileSize); } -MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, - error_code &ec, int64_t FileSize) { +error_code MemoryBuffer::getOpenFile(int FD, const char *Filename, + OwningPtr &result, + int64_t FileSize) { FileCloser FC(FD); // Close FD on return. // If we don't know the file size, use fstat to find out. fstat on an open @@ -218,8 +222,7 @@ MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, struct stat FileInfo; // TODO: This should use fstat64 when available. if (fstat(FD, &FileInfo) == -1) { - ec = error_code(errno, posix_category()); - return 0; + return error_code(errno, posix_category()); } FileSize = FileInfo.st_size; } @@ -234,8 +237,9 @@ MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, if (FileSize >= 4096*4 && (FileSize & (sys::Process::GetPageSize()-1)) != 0) { if (const char *Pages = sys::Path::MapInFilePages(FD, FileSize)) { - return GetNamedBuffer(StringRef(Pages, FileSize), - Filename); + result.reset(GetNamedBuffer( + StringRef(Pages, FileSize), Filename)); + return success; } } @@ -243,8 +247,7 @@ MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, if (!Buf) { // Failed to create a buffer. The only way it can fail is if // new(std::nothrow) returns 0. - ec = make_error_code(errc::not_enough_memory); - return 0; + return make_error_code(errc::not_enough_memory); } OwningPtr SB(Buf); @@ -257,26 +260,27 @@ MemoryBuffer *MemoryBuffer::getOpenFile(int FD, const char *Filename, if (errno == EINTR) continue; // Error while reading. - ec = error_code(errno, posix_category()); - return 0; + return error_code(errno, posix_category()); } else if (NumRead == 0) { // We hit EOF early, truncate and terminate buffer. Buf->BufferEnd = BufPtr; *BufPtr = 0; - return SB.take(); + result.swap(SB); + return success; } BytesLeft -= NumRead; BufPtr += NumRead; } - return SB.take(); + result.swap(SB); + return success; } //===----------------------------------------------------------------------===// // MemoryBuffer::getSTDIN implementation. //===----------------------------------------------------------------------===// -MemoryBuffer *MemoryBuffer::getSTDIN(error_code &ec) { +error_code MemoryBuffer::getSTDIN(OwningPtr &result) { // Read in all of the data from stdin, we cannot mmap stdin. // // FIXME: That isn't necessarily true, we should try to mmap stdin and @@ -292,11 +296,11 @@ MemoryBuffer *MemoryBuffer::getSTDIN(error_code &ec) { ReadBytes = read(0, Buffer.end(), ChunkSize); if (ReadBytes == -1) { if (errno == EINTR) continue; - ec = error_code(errno, posix_category()); - return 0; + return error_code(errno, posix_category()); } Buffer.set_size(Buffer.size() + ReadBytes); } while (ReadBytes != 0); - return getMemBufferCopy(Buffer, ""); + result.reset(getMemBufferCopy(Buffer, "")); + return success; } -- cgit v1.1 From 476b242fe7a61e5f9ac6214b0bc5c680d24f152e Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sun, 19 Dec 2010 20:43:38 +0000 Subject: Add missing standard headers. Patch by Joerg Sonnenberger! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122193 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/MemoryBuffer.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/Support/MemoryBuffer.cpp') diff --git a/lib/Support/MemoryBuffer.cpp b/lib/Support/MemoryBuffer.cpp index d3c71b9..b7d70dd 100644 --- a/lib/Support/MemoryBuffer.cpp +++ b/lib/Support/MemoryBuffer.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #if !defined(_MSC_VER) && !defined(__MINGW32__) -- cgit v1.1 From b4cc031a3e1306fea74c9211d50c5cde6d9a8cd5 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 8 Feb 2011 22:40:47 +0000 Subject: Don't open the file again in the gold plugin. To be able to do this, update MemoryBuffer::getOpenFile to not close the file descriptor. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125128 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/MemoryBuffer.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) (limited to 'lib/Support/MemoryBuffer.cpp') diff --git a/lib/Support/MemoryBuffer.cpp b/lib/Support/MemoryBuffer.cpp index b7d70dd..a0c650d 100644 --- a/lib/Support/MemoryBuffer.cpp +++ b/lib/Support/MemoryBuffer.cpp @@ -179,14 +179,6 @@ public: sys::Path::UnMapFilePages(getBufferStart(), getBufferSize()); } }; - -/// FileCloser - RAII object to make sure an FD gets closed properly. -class FileCloser { - int FD; -public: - explicit FileCloser(int FD) : FD(FD) {} - ~FileCloser() { ::close(FD); } -}; } error_code MemoryBuffer::getFile(StringRef Filename, @@ -208,15 +200,14 @@ error_code MemoryBuffer::getFile(const char *Filename, if (FD == -1) { return error_code(errno, posix_category()); } - - return getOpenFile(FD, Filename, result, FileSize); + error_code ret = getOpenFile(FD, Filename, result, FileSize); + close(FD); + return ret; } error_code MemoryBuffer::getOpenFile(int FD, const char *Filename, OwningPtr &result, int64_t FileSize) { - FileCloser FC(FD); // Close FD on return. - // If we don't know the file size, use fstat to find out. fstat on an open // file descriptor is cheaper than stat on a random path. if (FileSize == -1) { -- cgit v1.1