diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-11-19 03:18:22 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-11-19 03:18:22 +0000 |
commit | 7783e8ad69a2ac14ba50f6b015806b48c4131240 (patch) | |
tree | 599c39598e9a847f48572bfd44d854601edaf70f /lib/Archive | |
parent | 3cf2c32202c9bccfa3005c5b1edcecc69dd64598 (diff) | |
download | external_llvm-7783e8ad69a2ac14ba50f6b015806b48c4131240.zip external_llvm-7783e8ad69a2ac14ba50f6b015806b48c4131240.tar.gz external_llvm-7783e8ad69a2ac14ba50f6b015806b48c4131240.tar.bz2 |
Make findModulesDefiningSymbols modify its symbols argument so we can \
eliminate symbols defined by the archive efficiently
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17976 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Archive')
-rw-r--r-- | lib/Archive/ArchiveReader.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/Archive/ArchiveReader.cpp b/lib/Archive/ArchiveReader.cpp index 615df2b..6f5b9d3 100644 --- a/lib/Archive/ArchiveReader.cpp +++ b/lib/Archive/ArchiveReader.cpp @@ -407,7 +407,7 @@ Archive::findModuleDefiningSymbol(const std::string& symbol) { // Look up multiple symbols in the symbol table and return a set of // ModuleProviders that define those symbols. void -Archive::findModulesDefiningSymbols(const std::set<std::string>& symbols, +Archive::findModulesDefiningSymbols(std::set<std::string>& symbols, std::set<ModuleProvider*>& result) { assert(mapfile && base && "Can't findModulesDefiningSymbols on new archive"); @@ -462,11 +462,22 @@ Archive::findModulesDefiningSymbols(const std::set<std::string>& symbols, // At this point we have a valid symbol table (one way or another) so we // just use it to quickly find the symbols requested. - for (std::set<std::string>::const_iterator I=symbols.begin(), - E=symbols.end(); I != E; ++I) { + for (std::set<std::string>::iterator I=symbols.begin(), + E=symbols.end(); I != E;) { + // See if this symbol exists ModuleProvider* mp = findModuleDefiningSymbol(*I); if (mp) { + // The symbol exists, insert the ModuleProvider into our result, + // duplicates wil be ignored result.insert(mp); + + // Remove the symbol now that its been resolved, being careful to + // not invalidate our iterator. + std::set<std::string>::iterator save = I; + ++I; + symbols.erase(save); + } else { + ++I; } } } |