[PATCH] D120913: [NFC][llvm-nm] create a new helper function exportSymbolNamesFromFiles for --export-symbols

Digger Lin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 3 08:38:10 PST 2022


DiggerLin created this revision.
DiggerLin added reviewers: jhenderson, MaskRay, hubert.reinterpretcast.
Herald added a subscriber: rupprecht.
Herald added a project: All.
DiggerLin requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

create a new helper function exportSymbolNamesFromFiles for --export-symbols


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D120913

Files:
  llvm/tools/llvm-nm/llvm-nm.cpp


Index: llvm/tools/llvm-nm/llvm-nm.cpp
===================================================================
--- llvm/tools/llvm-nm/llvm-nm.cpp
+++ llvm/tools/llvm-nm/llvm-nm.cpp
@@ -2237,12 +2237,12 @@
                             /*PrintObjectLabel=*/false);
 }
 
-static void dumpSymbolNamesFromFile(std::string &Filename,
-                                    std::vector<NMSymbol> *SymbolList) {
+static std::vector<NMSymbol> dumpSymbolNamesFromFile(std::string &Filename) {
+  std::vector<NMSymbol> SymbolList;
   ErrorOr<std::unique_ptr<MemoryBuffer>> 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<Archive>(&Bin))
-    dumpArchive(A, *SymbolList, Filename, ContextPtr);
+    dumpArchive(A, SymbolList, Filename, ContextPtr);
   else if (MachOUniversalBinary *UB = dyn_cast<MachOUniversalBinary>(&Bin))
-    dumpMachOUniversalBinary(UB, *SymbolList, Filename, ContextPtr);
+    dumpMachOUniversalBinary(UB, SymbolList, Filename, ContextPtr);
   else if (TapiUniversal *TU = dyn_cast<TapiUniversal>(&Bin))
-    dumpTapiUniversal(TU, *SymbolList, Filename);
+    dumpTapiUniversal(TU, SymbolList, Filename);
   else if (SymbolicFile *O = dyn_cast<SymbolicFile>(&Bin))
-    dumpSymbolicFile(O, *SymbolList, Filename);
+    dumpSymbolicFile(O, SymbolList, Filename);
+  return SymbolList;
+}
+
+static void
+exportSymbolNamesFromFiles(const std::vector<std::string> &InputFilenames) {
+  std::vector<NMSymbol> SymbolList;
+  for (auto &FileName : InputFilenames) {
+    const std::vector<NMSymbol> &FileSymList =
+        dumpSymbolNamesFromFile(const_cast<std::string &>(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<NMSymbol> 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;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120913.412735.patch
Type: text/x-patch
Size: 3601 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220303/82cb98e3/attachment.bin>


More information about the llvm-commits mailing list