summaryrefslogtreecommitdiffstats
path: root/lldb/source/Core/DataBufferMemoryMap.cpp
diff options
context:
space:
mode:
authorCarlo Kok <ck@remobjects.com>2013-09-26 18:52:08 +0000
committerCarlo Kok <ck@remobjects.com>2013-09-26 18:52:08 +0000
commitb1a63bdf55b03f0252a8e46c08eb338d821a96cb (patch)
tree1631fb8bcfd154ccc831bd3569fd0fefe8d586e5 /lldb/source/Core/DataBufferMemoryMap.cpp
parenta46964f1bb93d2d4b8bd2880d7007baa53887f29 (diff)
downloadbcm5719-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.cpp36
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);
}
}
OpenPOWER on IntegriCloud