[llvm] c2b4e48 - [libLTO] add thinlto caching flags to libLTO (#168567)

via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 19 07:19:29 PST 2025


Author: Wael Yehia
Date: 2025-11-19T10:19:24-05:00
New Revision: c2b4e481a0504cbb50e83098d2634b063be6b5c9

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

LOG: [libLTO] add thinlto caching flags to libLTO (#168567)

On AIX, the linker's release cadence is once per year and it doesn't
backport non-critical fixes to previous releases.
We would like to get thinLTO caching accessible for current customers,
so this PR adds the cache flags as cl::opt options.

Added: 
    

Modified: 
    llvm/tools/lto/lto.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/tools/lto/lto.cpp b/llvm/tools/lto/lto.cpp
index 467a4da27dcd8..513d0578af24a 100644
--- a/llvm/tools/lto/lto.cpp
+++ b/llvm/tools/lto/lto.cpp
@@ -24,6 +24,7 @@
 #include "llvm/LTO/legacy/LTOCodeGenerator.h"
 #include "llvm/LTO/legacy/LTOModule.h"
 #include "llvm/LTO/legacy/ThinLTOCodeGenerator.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/TargetSelect.h"
@@ -44,6 +45,29 @@ static cl::opt<bool> EnableFreestanding(
     "lto-freestanding", cl::init(false),
     cl::desc("Enable Freestanding (disable builtins / TLI) during LTO"));
 
+static cl::opt<std::string> ThinLTOCacheDir(
+    "legacy-thinlto-cache-dir",
+    cl::desc("Experimental option, enable ThinLTO caching. Note: the cache "
+             "currently does not take the mcmodel setting into account, so you "
+             "might get false hits if 
diff erent mcmodels are used in 
diff erent "
+             "builds using the same cache directory."));
+
+static cl::opt<int> ThinLTOCachePruningInterval(
+    "legacy-thinlto-cache-pruning-interval", cl::init(1200),
+    cl::desc("Set ThinLTO cache pruning interval (seconds)."));
+
+static cl::opt<uint64_t> ThinLTOCacheMaxSizeBytes(
+    "legacy-thinlto-cache-max-size-bytes",
+    cl::desc("Set ThinLTO cache pruning directory maximum size in bytes."));
+
+static cl::opt<int> ThinLTOCacheMaxSizeFiles(
+    "legacy-thinlto-cache-max-size-files", cl::init(1000000),
+    cl::desc("Set ThinLTO cache pruning directory maximum number of files."));
+
+static cl::opt<unsigned> ThinLTOCacheEntryExpiration(
+    "legacy-thinlto-cache-entry-expiration", cl::init(604800) /* 1w */,
+    cl::desc("Set ThinLTO cache entry expiration time (seconds)."));
+
 #ifdef NDEBUG
 static bool VerifyByDefault = false;
 #else
@@ -543,6 +567,25 @@ thinlto_code_gen_t thinlto_create_codegen(void) {
     assert(CGOptLevelOrNone);
     CodeGen->setCodeGenOptLevel(*CGOptLevelOrNone);
   }
+  if (!ThinLTOCacheDir.empty()) {
+    auto Err = llvm::sys::fs::create_directories(ThinLTOCacheDir);
+    if (Err)
+      report_fatal_error(Twine("Unable to create thinLTO cache directory: ") +
+                         Err.message());
+    bool result;
+    Err = llvm::sys::fs::is_directory(ThinLTOCacheDir, result);
+    if (Err || !result)
+      report_fatal_error(Twine("Unable to get status of thinLTO cache path or "
+                               "path is not a directory: ") +
+                         Err.message());
+    CodeGen->setCacheDir(ThinLTOCacheDir);
+
+    CodeGen->setCachePruningInterval(ThinLTOCachePruningInterval);
+    CodeGen->setCacheEntryExpiration(ThinLTOCacheEntryExpiration);
+    CodeGen->setCacheMaxSizeFiles(ThinLTOCacheMaxSizeFiles);
+    CodeGen->setCacheMaxSizeBytes(ThinLTOCacheMaxSizeBytes);
+  }
+
   return wrap(CodeGen);
 }
 


        


More information about the llvm-commits mailing list