diff options
author | Carlo Kok <ck@remobjects.com> | 2013-09-26 18:52:08 +0000 |
---|---|---|
committer | Carlo Kok <ck@remobjects.com> | 2013-09-26 18:52:08 +0000 |
commit | b1a63bdf55b03f0252a8e46c08eb338d821a96cb (patch) | |
tree | 1631fb8bcfd154ccc831bd3569fd0fefe8d586e5 /lldb/source/Core/DataBufferMemoryMap.cpp | |
parent | a46964f1bb93d2d4b8bd2880d7007baa53887f29 (diff) | |
download | bcm5719-llvm-b1a63bdf55b03f0252a8e46c08eb338d821a96cb.tar.gz bcm5719-llvm-b1a63bdf55b03f0252a8e46c08eb338d821a96cb.zip |
On Windows MapViewOfFile requires the offset to be aligned on the system dwAllocationGranularity
llvm-svn: 191447
Diffstat (limited to 'lldb/source/Core/DataBufferMemoryMap.cpp')
-rw-r--r-- | lldb/source/Core/DataBufferMemoryMap.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/lldb/source/Core/DataBufferMemoryMap.cpp b/lldb/source/Core/DataBufferMemoryMap.cpp index 374834a00e0..008b736ef72 100644 --- a/lldb/source/Core/DataBufferMemoryMap.cpp +++ b/lldb/source/Core/DataBufferMemoryMap.cpp @@ -147,7 +147,17 @@ DataBufferMemoryMap::MemoryMapFromFileSpec (const FileSpec* filespec, Clear(); return 0; } - +
+
+#ifdef _WIN32
+static size_t win32memmapalignment = 0;
+void LoadWin32MemMapAlignment ()
+{
+ SYSTEM_INFO data;
+ GetSystemInfo(&data);
+ win32memmapalignment = data.dwAllocationGranularity;
+}
+#endif //---------------------------------------------------------------------- // The file descriptor FD is assumed to already be opened as read only @@ -206,13 +216,23 @@ DataBufferMemoryMap::MemoryMapFromFileDescriptor (int fd, HANDLE fileMapping = CreateFileMapping(handle, NULL, writeable ? PAGE_READWRITE : PAGE_READONLY, file_size_high, file_size_low, NULL); if (fileMapping != NULL) { - m_mmap_addr = (uint8_t*)MapViewOfFile(fileMapping, writeable ? FILE_MAP_ALL_ACCESS : FILE_MAP_READ, (DWORD)(offset >> 32), (DWORD)(offset), length); - if (m_mmap_addr != NULL) - { - m_mmap_size = length; - m_data = m_mmap_addr; - m_size = length; - } + if (win32memmapalignment == 0) LoadWin32MemMapAlignment();
+ lldb::offset_t realoffset = offset;
+ lldb::offset_t delta = 0;
+ if (realoffset % win32memmapalignment != 0) {
+ realoffset = realoffset / win32memmapalignment * win32memmapalignment;
+ delta = offset - realoffset;
+ } +
+ LPVOID data = MapViewOfFile(fileMapping, writeable ? FILE_MAP_WRITE : FILE_MAP_READ, 0, realoffset, length + delta);
+ m_mmap_addr = (uint8_t *)data;
+ if (!data) {
+ Error error;
+ error.SetErrorToErrno ();
+ } else { + m_data = m_mmap_addr + delta;
+ m_size = length;
+ }
CloseHandle(fileMapping); } } |