diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -2237,12 +2237,12 @@ /*PrintObjectLabel=*/false); } -static void dumpSymbolNamesFromFile(std::string &Filename, - std::vector *SymbolList) { +static std::vector dumpSymbolNamesFromFile(std::string &Filename) { + std::vector SymbolList; ErrorOr> BufferOrErr = MemoryBuffer::getFileOrSTDIN(Filename); if (error(BufferOrErr.getError(), Filename)) - return; + return SymbolList; LLVMContext Context; LLVMContext *ContextPtr = NoLLVMBitcode ? nullptr : &Context; @@ -2250,17 +2250,38 @@ createBinary(BufferOrErr.get()->getMemBufferRef(), ContextPtr); if (!BinaryOrErr) { error(BinaryOrErr.takeError(), Filename); - return; + return SymbolList; } Binary &Bin = *BinaryOrErr.get(); if (Archive *A = dyn_cast(&Bin)) - dumpArchive(A, *SymbolList, Filename, ContextPtr); + dumpArchive(A, SymbolList, Filename, ContextPtr); else if (MachOUniversalBinary *UB = dyn_cast(&Bin)) - dumpMachOUniversalBinary(UB, *SymbolList, Filename, ContextPtr); + dumpMachOUniversalBinary(UB, SymbolList, Filename, ContextPtr); else if (TapiUniversal *TU = dyn_cast(&Bin)) - dumpTapiUniversal(TU, *SymbolList, Filename); + dumpTapiUniversal(TU, SymbolList, Filename); else if (SymbolicFile *O = dyn_cast(&Bin)) - dumpSymbolicFile(O, *SymbolList, Filename); + dumpSymbolicFile(O, SymbolList, Filename); + return SymbolList; +} + +static void +exportSymbolNamesFromFiles(const std::vector &InputFilenames) { + std::vector SymbolList; + for (auto &FileName : InputFilenames) { + const std::vector &FileSymList = + dumpSymbolNamesFromFile(const_cast(FileName)); + SymbolList.insert(SymbolList.end(), FileSymList.begin(), FileSymList.end()); + } + + // Delete symbols which should not be printed from SymolList. + SymbolList.erase( + std::remove_if(SymbolList.begin(), SymbolList.end(), + [](const NMSymbol &s) { return !s.shouldPrint(); }), + SymbolList.end()); + sortSymbolList(SymbolList); + SymbolList.erase(std::unique(SymbolList.begin(), SymbolList.end()), + SymbolList.end()); + printExportSymbolList(SymbolList); } int main(int argc, char **argv) { @@ -2418,22 +2439,10 @@ if (NoDyldInfo && (AddDyldInfo || DyldInfoOnly)) error("--no-dyldinfo can't be used with --add-dyldinfo or --dyldinfo-only"); - std::vector SymbolList; - - llvm::for_each(InputFilenames, std::bind(dumpSymbolNamesFromFile, - std::placeholders::_1, &SymbolList)); - - if (ExportSymbols) { - // Delete symbols which should not be printed from SymolList. - SymbolList.erase( - std::remove_if(SymbolList.begin(), SymbolList.end(), - [](const NMSymbol &s) { return !s.shouldPrint(); }), - SymbolList.end()); - sortSymbolList(SymbolList); - SymbolList.erase(std::unique(SymbolList.begin(), SymbolList.end()), - SymbolList.end()); - printExportSymbolList(SymbolList); - } + if (ExportSymbols) + exportSymbolNamesFromFiles(InputFilenames); + else + llvm::for_each(InputFilenames, dumpSymbolNamesFromFile); if (HadError) return 1;