mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-20 10:24:12 +00:00
Fix a problem with llvm-ranlib that (on some platforms) caused the archive
file to become corrupted due to interactions between mmap'd memory segments and file descriptors closing. The problem is completely avoiding by using a third temporary file. Patch provided by Evan Jones git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24527 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -140,13 +140,28 @@ Archive::Archive(const sys::Path& filename, bool map )
|
||||
}
|
||||
}
|
||||
|
||||
// Archive destructor - just clean up memory
|
||||
Archive::~Archive() {
|
||||
void Archive::cleanUpMemory() {
|
||||
// Shutdown the file mapping
|
||||
if (mapfile) {
|
||||
mapfile->close();
|
||||
delete mapfile;
|
||||
|
||||
mapfile = 0;
|
||||
base = 0;
|
||||
}
|
||||
|
||||
// Forget the entire symbol table
|
||||
symTab.clear();
|
||||
symTabSize = 0;
|
||||
|
||||
firstFileOffset = 0;
|
||||
|
||||
// Free the foreign symbol table member
|
||||
if (foreignST) {
|
||||
delete foreignST;
|
||||
foreignST = 0;
|
||||
}
|
||||
|
||||
// Delete any ModuleProviders and ArchiveMember's we've allocated as a result
|
||||
// of symbol table searches.
|
||||
for (ModuleMap::iterator I=modules.begin(), E=modules.end(); I != E; ++I ) {
|
||||
@ -155,3 +170,8 @@ Archive::~Archive() {
|
||||
}
|
||||
}
|
||||
|
||||
// Archive destructor - just clean up memory
|
||||
Archive::~Archive() {
|
||||
cleanUpMemory();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user