Skip to content

Commit

Permalink
[dsymutil] Force mmap'ing of binaries
Browse files Browse the repository at this point in the history
After the recent refactoring that introduced parallel handling of
different object, the binary holder became unique per object file. This
defeats its optimization of caching archives, leading to an archive
being opened for every binary it contains. This is obviously unfortunate
and will need to be refactored soon.

Luckily in practice, the impact of this is limited as most files are
mmap'ed instead of memcopy'd. There's a caveat however: when the memory
buffer requires a null terminator and it's a multiple of the page size,
we allocate instead of mmap'ing. If this happens for a static archive,
we end up with N copies of it in memory, where N is the number of
objects in the archive, leading to exuberant memory usage. This provided
a stopgap solution to ensure that all the files it loads are mmap in
memory by removing the requirement for a terminating null byte.

Differential revision: https://reviews.llvm.org/D48397

llvm-svn: 335293
  • Loading branch information
JDevlieghere committed Jun 21, 2018
1 parent 63f244c commit 0bad3f6
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions llvm/tools/dsymutil/BinaryHolder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ ErrorOr<std::vector<MemoryBufferRef>> BinaryHolder::GetMemoryBuffersForFile(
// (either because the archive is not there anymore, or because the
// archive doesn't contain the requested member), this will still
// provide a sensible error message.
auto ErrOrFile = MemoryBuffer::getFileOrSTDIN(Filename);
auto ErrOrFile = MemoryBuffer::getFileOrSTDIN(Filename, -1, false);
if (auto Err = ErrOrFile.getError())
return Err;

Expand Down Expand Up @@ -136,7 +136,7 @@ BinaryHolder::MapArchiveAndGetMemberBuffers(
StringRef Filename, sys::TimePoint<std::chrono::seconds> Timestamp) {
StringRef ArchiveFilename = Filename.substr(0, Filename.find('('));

auto ErrOrBuff = MemoryBuffer::getFileOrSTDIN(ArchiveFilename);
auto ErrOrBuff = MemoryBuffer::getFileOrSTDIN(ArchiveFilename, -1, false);
if (auto Err = ErrOrBuff.getError())
return Err;

Expand Down

0 comments on commit 0bad3f6

Please sign in to comment.