[lld] f79e65e - [lld-macho] Cache library paths from findLibrary

Keith Smiley via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 3 10:07:33 PDT 2021


Author: Keith Smiley
Date: 2021-11-03T10:02:23-07:00
New Revision: f79e65e61fafedd439cbc120b2461fab831127f5

URL: https://github.com/llvm/llvm-project/commit/f79e65e61fafedd439cbc120b2461fab831127f5
DIFF: https://github.com/llvm/llvm-project/commit/f79e65e61fafedd439cbc120b2461fab831127f5.diff

LOG: [lld-macho] Cache library paths from findLibrary

On top of https://reviews.llvm.org/D113063 this took another 10 seconds
off our overall link time.

Reviewed By: #lld-macho, int3

Differential Revision: https://reviews.llvm.org/D113073

Added: 
    

Modified: 
    lld/MachO/Driver.cpp

Removed: 
    


################################################################################
diff  --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
index 826e5e816adc2..2bcea9ad505d7 100644
--- a/lld/MachO/Driver.cpp
+++ b/lld/MachO/Driver.cpp
@@ -80,16 +80,30 @@ static HeaderFileType getOutputType(const InputArgList &args) {
   }
 }
 
+static DenseMap<CachedHashStringRef, StringRef> resolvedLibraries;
 static Optional<StringRef> findLibrary(StringRef name) {
-  if (config->searchDylibsFirst) {
-    if (Optional<StringRef> path = findPathCombination(
-            "lib" + name, config->librarySearchPaths, {".tbd", ".dylib"}))
-      return path;
+  CachedHashStringRef key(name);
+  auto entry = resolvedLibraries.find(key);
+  if (entry != resolvedLibraries.end())
+    return entry->second;
+
+  auto doFind = [&] {
+    if (config->searchDylibsFirst) {
+      if (Optional<StringRef> path = findPathCombination(
+              "lib" + name, config->librarySearchPaths, {".tbd", ".dylib"}))
+        return path;
+      return findPathCombination("lib" + name, config->librarySearchPaths,
+                                 {".a"});
+    }
     return findPathCombination("lib" + name, config->librarySearchPaths,
-                               {".a"});
-  }
-  return findPathCombination("lib" + name, config->librarySearchPaths,
-                             {".tbd", ".dylib", ".a"});
+                               {".tbd", ".dylib", ".a"});
+  };
+
+  Optional<StringRef> path = doFind();
+  if (path)
+    resolvedLibraries[key] = *path;
+
+  return path;
 }
 
 static Optional<StringRef> findFramework(StringRef name) {
@@ -1076,6 +1090,7 @@ bool macho::link(ArrayRef<const char *> argsArr, bool canExitEarly,
   errorHandler().cleanupCallback = []() {
     freeArena();
 
+    resolvedLibraries.clear();
     concatOutputSections.clear();
     inputFiles.clear();
     inputSections.clear();


        


More information about the llvm-commits mailing list