From 63e65de3ffc20eeadcbffe994cbe0ccd6ea4c4ed Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Wed, 3 Nov 2021 11:08:57 -0700 Subject: [PATCH] [lld-macho] Cache discovered framework paths On our large iOS project this took a link from 1 minute 45 seconds to 45 seconds. For reference ld64 does the same link in ~20 seconds. Reviewed By: #lld-macho, int3 Differential Revision: https://reviews.llvm.org/D113063 --- lld/MachO/Driver.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp index 2bcea9a..adfe716 100644 --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -106,7 +106,13 @@ static Optional findLibrary(StringRef name) { return path; } +static DenseMap resolvedFrameworks; static Optional findFramework(StringRef name) { + CachedHashStringRef key(name); + auto entry = resolvedFrameworks.find(key); + if (entry != resolvedFrameworks.end()) + return entry->second; + SmallString<260> symlink; StringRef suffix; std::tie(name, suffix) = name.split(","); @@ -122,13 +128,13 @@ static Optional findFramework(StringRef name) { // only append suffix if realpath() succeeds Twine suffixed = location + suffix; if (fs::exists(suffixed)) - return saver.save(suffixed.str()); + return resolvedFrameworks[key] = saver.save(suffixed.str()); } // Suffix lookup failed, fall through to the no-suffix case. } if (Optional path = resolveDylibPath(symlink.str())) - return path; + return resolvedFrameworks[key] = *path; } return {}; } @@ -1090,6 +1096,7 @@ bool macho::link(ArrayRef argsArr, bool canExitEarly, errorHandler().cleanupCallback = []() { freeArena(); + resolvedFrameworks.clear(); resolvedLibraries.clear(); concatOutputSections.clear(); inputFiles.clear(); -- 2.7.4