mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Revert r127409 which broke all the Windows bots.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127413 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -40,8 +40,7 @@ class MemoryBuffer { | |||||||
|   MemoryBuffer &operator=(const MemoryBuffer &); // DO NOT IMPLEMENT |   MemoryBuffer &operator=(const MemoryBuffer &); // DO NOT IMPLEMENT | ||||||
| protected: | protected: | ||||||
|   MemoryBuffer() {} |   MemoryBuffer() {} | ||||||
|   void init(const char *BufStart, const char *BufEnd, |   void init(const char *BufStart, const char *BufEnd); | ||||||
|             bool RequiresNullTerminator); |  | ||||||
| public: | public: | ||||||
|   virtual ~MemoryBuffer(); |   virtual ~MemoryBuffer(); | ||||||
|  |  | ||||||
| @@ -73,10 +72,7 @@ public: | |||||||
|   /// return a MemoryBuffer. |   /// return a MemoryBuffer. | ||||||
|   static error_code getOpenFile(int FD, const char *Filename, |   static error_code getOpenFile(int FD, const char *Filename, | ||||||
|                                 OwningPtr<MemoryBuffer> &result, |                                 OwningPtr<MemoryBuffer> &result, | ||||||
|                                 size_t FileSize = -1, |                                 int64_t FileSize = -1); | ||||||
|                                 size_t MapSize = -1, |  | ||||||
|                                 off_t Offset = 0, |  | ||||||
|                                 bool RequiresNullTerminator = true); |  | ||||||
|  |  | ||||||
|   /// getMemBuffer - Open the specified memory range as a MemoryBuffer.  Note |   /// getMemBuffer - Open the specified memory range as a MemoryBuffer.  Note | ||||||
|   /// that InputData must be null terminated. |   /// that InputData must be null terminated. | ||||||
|   | |||||||
| @@ -608,15 +608,14 @@ namespace sys { | |||||||
|       /// |       /// | ||||||
|       /// This API is not intended for general use, clients should use |       /// This API is not intended for general use, clients should use | ||||||
|       /// MemoryBuffer::getFile instead. |       /// MemoryBuffer::getFile instead. | ||||||
|       static const char *MapInFilePages(int FD, size_t FileSize, |       static const char *MapInFilePages(int FD, uint64_t FileSize); | ||||||
|                                         off_t Offset); |  | ||||||
|  |  | ||||||
|       /// UnMapFilePages - Free pages mapped into the current process by |       /// UnMapFilePages - Free pages mapped into the current process by | ||||||
|       /// MapInFilePages. |       /// MapInFilePages. | ||||||
|       /// |       /// | ||||||
|       /// This API is not intended for general use, clients should use |       /// This API is not intended for general use, clients should use | ||||||
|       /// MemoryBuffer::getFile instead. |       /// MemoryBuffer::getFile instead. | ||||||
|       static void UnMapFilePages(const char *Base, size_t FileSize); |       static void UnMapFilePages(const char *Base, uint64_t FileSize); | ||||||
|  |  | ||||||
|     /// @} |     /// @} | ||||||
|     /// @name Data |     /// @name Data | ||||||
|   | |||||||
| @@ -46,10 +46,8 @@ MemoryBuffer::~MemoryBuffer() { } | |||||||
|  |  | ||||||
| /// init - Initialize this MemoryBuffer as a reference to externally allocated | /// init - Initialize this MemoryBuffer as a reference to externally allocated | ||||||
| /// memory, memory that we know is already null terminated. | /// memory, memory that we know is already null terminated. | ||||||
| void MemoryBuffer::init(const char *BufStart, const char *BufEnd, | void MemoryBuffer::init(const char *BufStart, const char *BufEnd) { | ||||||
|                         bool RequiresNullTerminator) { |   assert(BufEnd[0] == 0 && "Buffer is not null terminated!"); | ||||||
|   assert((BufEnd[0] == 0 || !RequiresNullTerminator) && |  | ||||||
|          "Buffer is not null terminated!"); |  | ||||||
|   BufferStart = BufStart; |   BufferStart = BufStart; | ||||||
|   BufferEnd = BufEnd; |   BufferEnd = BufEnd; | ||||||
| } | } | ||||||
| @@ -67,19 +65,18 @@ static void CopyStringRef(char *Memory, StringRef Data) { | |||||||
|  |  | ||||||
| /// GetNamedBuffer - Allocates a new MemoryBuffer with Name copied after it. | /// GetNamedBuffer - Allocates a new MemoryBuffer with Name copied after it. | ||||||
| template <typename T> | template <typename T> | ||||||
| static T* GetNamedBuffer(StringRef Buffer, StringRef Name, | static T* GetNamedBuffer(StringRef Buffer, StringRef Name) { | ||||||
|                          bool RequiresNullTerminator) { |  | ||||||
|   char *Mem = static_cast<char*>(operator new(sizeof(T) + Name.size() + 1)); |   char *Mem = static_cast<char*>(operator new(sizeof(T) + Name.size() + 1)); | ||||||
|   CopyStringRef(Mem + sizeof(T), Name); |   CopyStringRef(Mem + sizeof(T), Name); | ||||||
|   return new (Mem) T(Buffer, RequiresNullTerminator); |   return new (Mem) T(Buffer); | ||||||
| } | } | ||||||
|  |  | ||||||
| namespace { | namespace { | ||||||
| /// MemoryBufferMem - Named MemoryBuffer pointing to a block of memory. | /// MemoryBufferMem - Named MemoryBuffer pointing to a block of memory. | ||||||
| class MemoryBufferMem : public MemoryBuffer { | class MemoryBufferMem : public MemoryBuffer { | ||||||
| public: | public: | ||||||
|   MemoryBufferMem(StringRef InputData, bool RequiresNullTerminator) { |   MemoryBufferMem(StringRef InputData) { | ||||||
|     init(InputData.begin(), InputData.end(), RequiresNullTerminator); |     init(InputData.begin(), InputData.end()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   virtual const char *getBufferIdentifier() const { |   virtual const char *getBufferIdentifier() const { | ||||||
| @@ -93,7 +90,7 @@ public: | |||||||
| /// that EndPtr[0] must be a null byte and be accessible! | /// that EndPtr[0] must be a null byte and be accessible! | ||||||
| MemoryBuffer *MemoryBuffer::getMemBuffer(StringRef InputData, | MemoryBuffer *MemoryBuffer::getMemBuffer(StringRef InputData, | ||||||
|                                          StringRef BufferName) { |                                          StringRef BufferName) { | ||||||
|   return GetNamedBuffer<MemoryBufferMem>(InputData, BufferName, true); |   return GetNamedBuffer<MemoryBufferMem>(InputData, BufferName); | ||||||
| } | } | ||||||
|  |  | ||||||
| /// getMemBufferCopy - Open the specified memory range as a MemoryBuffer, | /// getMemBufferCopy - Open the specified memory range as a MemoryBuffer, | ||||||
| @@ -130,7 +127,7 @@ MemoryBuffer *MemoryBuffer::getNewUninitMemBuffer(size_t Size, | |||||||
|   char *Buf = Mem + AlignedStringLen; |   char *Buf = Mem + AlignedStringLen; | ||||||
|   Buf[Size] = 0; // Null terminate buffer. |   Buf[Size] = 0; // Null terminate buffer. | ||||||
|  |  | ||||||
|   return new (Mem) MemoryBufferMem(StringRef(Buf, Size), true); |   return new (Mem) MemoryBufferMem(StringRef(Buf, Size)); | ||||||
| } | } | ||||||
|  |  | ||||||
| /// getNewMemBuffer - Allocate a new MemoryBuffer of the specified size that | /// getNewMemBuffer - Allocate a new MemoryBuffer of the specified size that | ||||||
| @@ -175,19 +172,11 @@ namespace { | |||||||
| /// sys::Path::UnMapFilePages method. | /// sys::Path::UnMapFilePages method. | ||||||
| class MemoryBufferMMapFile : public MemoryBufferMem { | class MemoryBufferMMapFile : public MemoryBufferMem { | ||||||
| public: | public: | ||||||
|   MemoryBufferMMapFile(StringRef Buffer, bool RequiresNullTerminator) |   MemoryBufferMMapFile(StringRef Buffer) | ||||||
|     : MemoryBufferMem(Buffer, RequiresNullTerminator) { } |     : MemoryBufferMem(Buffer) { } | ||||||
|  |  | ||||||
|   ~MemoryBufferMMapFile() { |   ~MemoryBufferMMapFile() { | ||||||
|     static int PageSize = sys::Process::GetPageSize(); |     sys::Path::UnMapFilePages(getBufferStart(), getBufferSize()); | ||||||
|  |  | ||||||
|     uintptr_t Start = reinterpret_cast<uintptr_t>(getBufferStart()); |  | ||||||
|     size_t Size = getBufferSize(); |  | ||||||
|     uintptr_t RealStart = Start & ~(PageSize - 1); |  | ||||||
|     size_t RealSize = Size + (Start - RealStart); |  | ||||||
|  |  | ||||||
|     sys::Path::UnMapFilePages(reinterpret_cast<const char*>(RealStart), |  | ||||||
|                               RealSize); |  | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
| } | } | ||||||
| @@ -216,44 +205,12 @@ error_code MemoryBuffer::getFile(const char *Filename, | |||||||
|   return ret; |   return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool shouldUseMmap(size_t FileSize, |  | ||||||
|                           size_t MapSize, |  | ||||||
|                           off_t Offset, |  | ||||||
|                           bool RequiresNullTerminator, |  | ||||||
|                           int PageSize) { |  | ||||||
|   // We don't use mmap for small files because this can severely fragment our |  | ||||||
|   // address space. |  | ||||||
|   if (MapSize < 4096*4) |  | ||||||
|     return false; |  | ||||||
|  |  | ||||||
|   if (!RequiresNullTerminator) |  | ||||||
|     return true; |  | ||||||
|  |  | ||||||
|   // If we need a null terminator and the end of the map is inside the file, |  | ||||||
|   // we cannot use mmap. |  | ||||||
|   size_t End = Offset + MapSize; |  | ||||||
|   assert(End <= FileSize); |  | ||||||
|   if (End != FileSize) |  | ||||||
|     return false; |  | ||||||
|  |  | ||||||
|   // Don't try to map files that are exactly a multiple of the system page size |  | ||||||
|   // if we need a null terminator. |  | ||||||
|   if ((FileSize & (PageSize -1)) == 0) |  | ||||||
|     return false; |  | ||||||
|  |  | ||||||
|   return true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| error_code MemoryBuffer::getOpenFile(int FD, const char *Filename, | error_code MemoryBuffer::getOpenFile(int FD, const char *Filename, | ||||||
|                                      OwningPtr<MemoryBuffer> &result, |                                      OwningPtr<MemoryBuffer> &result, | ||||||
|                                      size_t FileSize, size_t MapSize, |                                      int64_t FileSize) { | ||||||
|                                      off_t Offset, |  | ||||||
|                                      bool RequiresNullTerminator) { |  | ||||||
|   static int PageSize = sys::Process::GetPageSize(); |  | ||||||
|  |  | ||||||
|   // If we don't know the file size, use fstat to find out.  fstat on an open |   // 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. |   // file descriptor is cheaper than stat on a random path. | ||||||
|   if (FileSize == size_t(-1)) { |   if (FileSize == -1) { | ||||||
|     struct stat FileInfo; |     struct stat FileInfo; | ||||||
|     // TODO: This should use fstat64 when available. |     // TODO: This should use fstat64 when available. | ||||||
|     if (fstat(FD, &FileInfo) == -1) { |     if (fstat(FD, &FileInfo) == -1) { | ||||||
| @@ -262,26 +219,23 @@ error_code MemoryBuffer::getOpenFile(int FD, const char *Filename, | |||||||
|     FileSize = FileInfo.st_size; |     FileSize = FileInfo.st_size; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   // Default is to map the full file. |  | ||||||
|   if (MapSize == size_t(-1)) |  | ||||||
|     MapSize = FileSize; |  | ||||||
|  |  | ||||||
|   if (shouldUseMmap(FileSize, MapSize, Offset, RequiresNullTerminator, |   // If the file is large, try to use mmap to read it in.  We don't use mmap | ||||||
|                     PageSize)) { |   // for small files, because this can severely fragment our address space. Also | ||||||
|     off_t RealMapOffset = Offset & ~(PageSize - 1); |   // don't try to map files that are exactly a multiple of the system page size, | ||||||
|     off_t Delta = Offset - RealMapOffset; |   // as the file would not have the required null terminator. | ||||||
|     size_t RealMapSize = MapSize + Delta; |   // | ||||||
|  |   // FIXME: Can we just mmap an extra page in the latter case? | ||||||
|     if (const char *Pages = sys::Path::MapInFilePages(FD, |   if (FileSize >= 4096*4 && | ||||||
|                                                       RealMapSize, |       (FileSize & (sys::Process::GetPageSize()-1)) != 0) { | ||||||
|                                                       RealMapOffset)) { |     if (const char *Pages = sys::Path::MapInFilePages(FD, FileSize)) { | ||||||
|       result.reset(GetNamedBuffer<MemoryBufferMMapFile>( |       result.reset(GetNamedBuffer<MemoryBufferMMapFile>( | ||||||
|           StringRef(Pages + Delta, MapSize), Filename, RequiresNullTerminator)); |         StringRef(Pages, FileSize), Filename)); | ||||||
|       return success; |       return success; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   MemoryBuffer *Buf = MemoryBuffer::getNewUninitMemBuffer(MapSize, Filename); |   MemoryBuffer *Buf = MemoryBuffer::getNewUninitMemBuffer(FileSize, Filename); | ||||||
|   if (!Buf) { |   if (!Buf) { | ||||||
|     // Failed to create a buffer. The only way it can fail is if |     // Failed to create a buffer. The only way it can fail is if | ||||||
|     // new(std::nothrow) returns 0. |     // new(std::nothrow) returns 0. | ||||||
| @@ -291,10 +245,7 @@ error_code MemoryBuffer::getOpenFile(int FD, const char *Filename, | |||||||
|   OwningPtr<MemoryBuffer> SB(Buf); |   OwningPtr<MemoryBuffer> SB(Buf); | ||||||
|   char *BufPtr = const_cast<char*>(SB->getBufferStart()); |   char *BufPtr = const_cast<char*>(SB->getBufferStart()); | ||||||
|  |  | ||||||
|   size_t BytesLeft = MapSize; |   size_t BytesLeft = FileSize; | ||||||
|   if (lseek(FD, Offset, SEEK_SET) == -1) |  | ||||||
|     return error_code(errno, posix_category()); |  | ||||||
|  |  | ||||||
|   while (BytesLeft) { |   while (BytesLeft) { | ||||||
|     ssize_t NumRead = ::read(FD, BufPtr, BytesLeft); |     ssize_t NumRead = ::read(FD, BufPtr, BytesLeft); | ||||||
|     if (NumRead == -1) { |     if (NumRead == -1) { | ||||||
|   | |||||||
| @@ -869,18 +869,18 @@ Path::makeUnique(bool reuse_current, std::string* ErrMsg) { | |||||||
|   return false; |   return false; | ||||||
| } | } | ||||||
|  |  | ||||||
| const char *Path::MapInFilePages(int FD, size_t FileSize, off_t Offset) { | const char *Path::MapInFilePages(int FD, uint64_t FileSize) { | ||||||
|   int Flags = MAP_PRIVATE; |   int Flags = MAP_PRIVATE; | ||||||
| #ifdef MAP_FILE | #ifdef MAP_FILE | ||||||
|   Flags |= MAP_FILE; |   Flags |= MAP_FILE; | ||||||
| #endif | #endif | ||||||
|   void *BasePtr = ::mmap(0, FileSize, PROT_READ, Flags, FD, Offset); |   void *BasePtr = ::mmap(0, FileSize, PROT_READ, Flags, FD, 0); | ||||||
|   if (BasePtr == MAP_FAILED) |   if (BasePtr == MAP_FAILED) | ||||||
|     return 0; |     return 0; | ||||||
|   return (const char*)BasePtr; |   return (const char*)BasePtr; | ||||||
| } | } | ||||||
|  |  | ||||||
| void Path::UnMapFilePages(const char *BasePtr, size_t FileSize) { | void Path::UnMapFilePages(const char *BasePtr, uint64_t FileSize) { | ||||||
|   ::munmap((void*)BasePtr, FileSize); |   ::munmap((void*)BasePtr, FileSize); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user