https://github.com/jmmartinez updated 
https://github.com/llvm/llvm-project/pull/191367

From 1a676754243d72b215456e32fadde03f8797c064 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?=
 <[email protected]>
Date: Fri, 10 Apr 2026 10:25:09 +0200
Subject: [PATCH 1/9] [Support][Cache] Make `pruneCache` return an `Expected`

When `sys::fs::disk_space` would fail in during a call to `pruneCache`,
it would report a `fatal_error`. However, a failure to prune doesn't
mean the caller should fail catastrophically.

Downstream, we use LLVM's cache in the OpenCL runtime. A failure to prune
the cache can be safely ignored without stopping the user's application.
---
 lld/COFF/LTO.cpp                         | 2 +-
 lld/ELF/LTO.cpp                          | 3 ++-
 lld/MachO/LTO.cpp                        | 3 ++-
 lld/wasm/LTO.cpp                         | 3 ++-
 llvm/include/llvm/Support/CachePruning.h | 4 +++-
 llvm/lib/Debuginfod/Debuginfod.cpp       | 5 ++++-
 llvm/lib/LTO/ThinLTOCodeGenerator.cpp    | 6 +++++-
 llvm/lib/Support/CachePruning.cpp        | 8 ++++----
 llvm/tools/gold/gold-plugin.cpp          | 2 +-
 9 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/lld/COFF/LTO.cpp b/lld/COFF/LTO.cpp
index 2d38a13830dad..74ae7cd1089d4 100644
--- a/lld/COFF/LTO.cpp
+++ b/lld/COFF/LTO.cpp
@@ -241,7 +241,7 @@ std::vector<InputFile *> BitcodeCompiler::compile() {
   }
 
   if (!ctx.config.ltoCache.empty())
-    pruneCache(ctx.config.ltoCache, ctx.config.ltoCachePolicy, files);
+    check(pruneCache(ctx.config.ltoCache, ctx.config.ltoCachePolicy, files));
 
   std::vector<InputFile *> ret;
   bool emitASM = ctx.config.emit == EmitKind::ASM;
diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp
index 352848af1551d..81414d5f28f8f 100644
--- a/lld/ELF/LTO.cpp
+++ b/lld/ELF/LTO.cpp
@@ -377,7 +377,8 @@ SmallVector<std::unique_ptr<InputFile>, 0> 
BitcodeCompiler::compile() {
   }
 
   if (!ctx.arg.thinLTOCacheDir.empty())
-    pruneCache(ctx.arg.thinLTOCacheDir, ctx.arg.thinLTOCachePolicy, files);
+    check(
+        pruneCache(ctx.arg.thinLTOCacheDir, ctx.arg.thinLTOCachePolicy, 
files));
 
   if (!ctx.arg.ltoObjPath.empty()) {
     saveBuffer(buf[0].second, ctx.arg.ltoObjPath);
diff --git a/lld/MachO/LTO.cpp b/lld/MachO/LTO.cpp
index c8b7a4e797250..c989ce5f41ff5 100644
--- a/lld/MachO/LTO.cpp
+++ b/lld/MachO/LTO.cpp
@@ -278,7 +278,8 @@ std::vector<ObjFile *> BitcodeCompiler::compile() {
   }
 
   if (!config->thinLTOCacheDir.empty())
-    pruneCache(config->thinLTOCacheDir, config->thinLTOCachePolicy, files);
+    check(
+        pruneCache(config->thinLTOCacheDir, config->thinLTOCachePolicy, 
files));
 
   std::vector<ObjFile *> ret;
   for (unsigned i = 0; i < maxTasks; ++i) {
diff --git a/lld/wasm/LTO.cpp b/lld/wasm/LTO.cpp
index 9fcb95b84b545..073d0125ffd93 100644
--- a/lld/wasm/LTO.cpp
+++ b/lld/wasm/LTO.cpp
@@ -246,7 +246,8 @@ SmallVector<InputFile *, 0> BitcodeCompiler::compile() {
   }
 
   if (!ctx.arg.thinLTOCacheDir.empty())
-    pruneCache(ctx.arg.thinLTOCacheDir, ctx.arg.thinLTOCachePolicy, files);
+    check(
+        pruneCache(ctx.arg.thinLTOCacheDir, ctx.arg.thinLTOCachePolicy, 
files));
 
   SmallVector<InputFile *, 0> ret;
   for (unsigned i = 0; i != maxTasks; ++i) {
diff --git a/llvm/include/llvm/Support/CachePruning.h 
b/llvm/include/llvm/Support/CachePruning.h
index a677a684a221a..b3b3197c933c0 100644
--- a/llvm/include/llvm/Support/CachePruning.h
+++ b/llvm/include/llvm/Support/CachePruning.h
@@ -81,7 +81,9 @@ parseCachePruningPolicy(StringRef PolicyStr);
 /// As a safeguard against data loss if the user specifies the wrong directory
 /// as their cache directory, this function will ignore files not matching the
 /// pattern "llvmcache-*".
-LLVM_ABI bool
+///
+/// On failure, it returns an Error.
+LLVM_ABI Expected<bool>
 pruneCache(StringRef Path, CachePruningPolicy Policy,
            const std::vector<std::unique_ptr<MemoryBuffer>> &Files = {});
 } // namespace llvm
diff --git a/llvm/lib/Debuginfod/Debuginfod.cpp 
b/llvm/lib/Debuginfod/Debuginfod.cpp
index 84fe7ac06336a..e91bf2fc9c9d3 100644
--- a/llvm/lib/Debuginfod/Debuginfod.cpp
+++ b/llvm/lib/Debuginfod/Debuginfod.cpp
@@ -274,7 +274,10 @@ Expected<std::string> getCachedOrDownloadArtifact(
         parseCachePruningPolicy(std::getenv("DEBUGINFOD_CACHE_POLICY"));
     if (!PruningPolicyOrErr)
       return PruningPolicyOrErr.takeError();
-    pruneCache(CacheDirectoryPath, *PruningPolicyOrErr);
+
+    auto ErrOrPruned = pruneCache(CacheDirectoryPath, *PruningPolicyOrErr);
+    if (!ErrOrPruned)
+      return ErrOrPruned.takeError();
 
     // Return the path to the artifact on disk.
     return std::string(AbsCachedArtifactPath);
diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp 
b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
index 93b672ae7840c..c32db1216bc99 100644
--- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
+++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
@@ -1210,7 +1210,11 @@ void ThinLTOCodeGenerator::run() {
     }
   }
 
-  pruneCache(CacheOptions.Path, CacheOptions.Policy, ProducedBinaries);
+  auto ErrOrPruned = pruneCache(CacheOptions.Path, CacheOptions.Policy, 
ProducedBinaries));
+  if (!ErrOrPruned) {
+    errs() << "Error: " << toString(ErrOrPruned.takeError()) << "\n";
+    report_fatal_error("ThinLTO: failure to prune cache");
+  }
 
   // If statistics were requested, print them out now.
   if (llvm::AreStatisticsEnabled())
diff --git a/llvm/lib/Support/CachePruning.cpp 
b/llvm/lib/Support/CachePruning.cpp
index 45d4949231fa8..1e8ba94b94ad1 100644
--- a/llvm/lib/Support/CachePruning.cpp
+++ b/llvm/lib/Support/CachePruning.cpp
@@ -142,8 +142,9 @@ llvm::parseCachePruningPolicy(StringRef PolicyStr) {
 }
 
 /// Prune the cache of files that haven't been accessed in a long time.
-bool llvm::pruneCache(StringRef Path, CachePruningPolicy Policy,
-                      const std::vector<std::unique_ptr<MemoryBuffer>> &Files) 
{
+Expected<bool>
+llvm::pruneCache(StringRef Path, CachePruningPolicy Policy,
+                 const std::vector<std::unique_ptr<MemoryBuffer>> &Files) {
   using namespace std::chrono;
 
   if (Path.empty())
@@ -281,8 +282,7 @@ bool llvm::pruneCache(StringRef Path, CachePruningPolicy 
Policy,
     auto ErrOrSpaceInfo = sys::fs::disk_space(Path);
     if (!ErrOrSpaceInfo) {
       auto EC = ErrOrSpaceInfo.getError();
-      report_fatal_error(Twine("Can't get available size for '") + Path.str() +
-                         "': " + EC.message());
+      return errorCodeToError(EC);
     }
     sys::fs::space_info SpaceInfo = ErrOrSpaceInfo.get();
     auto AvailableSpace = TotalSize + SpaceInfo.free;
diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp
index ba2a1699aaea9..98aafd635651d 100644
--- a/llvm/tools/gold/gold-plugin.cpp
+++ b/llvm/tools/gold/gold-plugin.cpp
@@ -1220,7 +1220,7 @@ static ld_plugin_status cleanup_hook(void) {
   // Prune cache
   if (!options::cache_dir.empty()) {
     CachePruningPolicy policy = 
check(parseCachePruningPolicy(options::cache_policy));
-    pruneCache(options::cache_dir, policy);
+    check(pruneCache(options::cache_dir, policy));
   }
 
   return LDPS_OK;

From f8c660fbccb803b818830efa9e2794f71b38f4e8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?=
 <[email protected]>
Date: Fri, 10 Apr 2026 11:07:06 +0200
Subject: [PATCH 2/9] Missing LLDB side

---
 lldb/source/Core/DataFileCache.cpp | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/lldb/source/Core/DataFileCache.cpp 
b/lldb/source/Core/DataFileCache.cpp
index 9109269711231..c35ee372a2e0a 100644
--- a/lldb/source/Core/DataFileCache.cpp
+++ b/lldb/source/Core/DataFileCache.cpp
@@ -46,7 +46,12 @@ llvm::CachePruningPolicy 
DataFileCache::GetLLDBIndexCachePolicy() {
 
 DataFileCache::DataFileCache(llvm::StringRef path, llvm::CachePruningPolicy 
policy) {
   m_cache_dir.SetPath(path);
-  pruneCache(path, policy);
+  llvm::Expected<bool> err_or_pruned = pruneCache(path, policy);
+  if (!err_or_pruned) {
+    Log *log = GetLog(LLDBLog::Modules);
+    LLDB_LOG_ERROR(log, err_or_pruned.takeError(),
+                   "failed to prune lldb index cache directory: {0}");
+  }
 
   // This lambda will get called when the data is gotten from the cache and
   // also after the data was set for a given key. We only need to take

From 6ec142fd1afc20a1ec06b0ea3e9dd55c4f81f187 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?=
 <[email protected]>
Date: Fri, 10 Apr 2026 11:08:53 +0200
Subject: [PATCH 3/9] Extra )

---
 llvm/lib/LTO/ThinLTOCodeGenerator.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp 
b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
index c32db1216bc99..48c19863470cd 100644
--- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
+++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
@@ -1210,7 +1210,8 @@ void ThinLTOCodeGenerator::run() {
     }
   }
 
-  auto ErrOrPruned = pruneCache(CacheOptions.Path, CacheOptions.Policy, 
ProducedBinaries));
+  auto ErrOrPruned =
+      pruneCache(CacheOptions.Path, CacheOptions.Policy, ProducedBinaries);
   if (!ErrOrPruned) {
     errs() << "Error: " << toString(ErrOrPruned.takeError()) << "\n";
     report_fatal_error("ThinLTO: failure to prune cache");

From 666c5681b7ce8d806b0a6a0650b6595e2c707eac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?=
 <[email protected]>
Date: Thu, 16 Apr 2026 11:11:25 +0200
Subject: [PATCH 4/9] Review: no-auto, use Expected<bool>

---
 llvm/lib/Debuginfod/Debuginfod.cpp    | 3 ++-
 llvm/lib/LTO/ThinLTOCodeGenerator.cpp | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Debuginfod/Debuginfod.cpp 
b/llvm/lib/Debuginfod/Debuginfod.cpp
index e91bf2fc9c9d3..1c53d580a9672 100644
--- a/llvm/lib/Debuginfod/Debuginfod.cpp
+++ b/llvm/lib/Debuginfod/Debuginfod.cpp
@@ -275,7 +275,8 @@ Expected<std::string> getCachedOrDownloadArtifact(
     if (!PruningPolicyOrErr)
       return PruningPolicyOrErr.takeError();
 
-    auto ErrOrPruned = pruneCache(CacheDirectoryPath, *PruningPolicyOrErr);
+    Expected<bool> ErrOrPruned =
+        pruneCache(CacheDirectoryPath, *PruningPolicyOrErr);
     if (!ErrOrPruned)
       return ErrOrPruned.takeError();
 
diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp 
b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
index 48c19863470cd..bf16367045c4e 100644
--- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
+++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
@@ -1210,7 +1210,7 @@ void ThinLTOCodeGenerator::run() {
     }
   }
 
-  auto ErrOrPruned =
+  Expected<bool> ErrOrPruned =
       pruneCache(CacheOptions.Path, CacheOptions.Policy, ProducedBinaries);
   if (!ErrOrPruned) {
     errs() << "Error: " << toString(ErrOrPruned.takeError()) << "\n";

From 2f0b934326705df49363790b182879a10e783905 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?=
 <[email protected]>
Date: Fri, 17 Apr 2026 11:18:48 +0200
Subject: [PATCH 5/9] Review: typo Peform->Perform

---
 llvm/include/llvm/Support/CachePruning.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/include/llvm/Support/CachePruning.h 
b/llvm/include/llvm/Support/CachePruning.h
index b3b3197c933c0..36155b12679d0 100644
--- a/llvm/include/llvm/Support/CachePruning.h
+++ b/llvm/include/llvm/Support/CachePruning.h
@@ -70,7 +70,7 @@ struct CachePruningPolicy {
 LLVM_ABI Expected<CachePruningPolicy>
 parseCachePruningPolicy(StringRef PolicyStr);
 
-/// Peform pruning using the supplied policy, returns true if pruning
+/// Perform pruning using the supplied policy, returns true if pruning
 /// occurred, i.e. if Policy.Interval was expired.
 ///
 /// Check whether cache pruning happens using the supplied policy, adds a

From f418a7b09b51e4fab15769359342b936e146ec32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?=
 <[email protected]>
Date: Fri, 17 Apr 2026 11:19:45 +0200
Subject: [PATCH 6/9] Review: ErrOrPruned->PrunedOrErr

---
 llvm/lib/Debuginfod/Debuginfod.cpp    | 6 +++---
 llvm/lib/LTO/ThinLTOCodeGenerator.cpp | 6 +++---
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/Debuginfod/Debuginfod.cpp 
b/llvm/lib/Debuginfod/Debuginfod.cpp
index 1c53d580a9672..284db473a6d8b 100644
--- a/llvm/lib/Debuginfod/Debuginfod.cpp
+++ b/llvm/lib/Debuginfod/Debuginfod.cpp
@@ -275,10 +275,10 @@ Expected<std::string> getCachedOrDownloadArtifact(
     if (!PruningPolicyOrErr)
       return PruningPolicyOrErr.takeError();
 
-    Expected<bool> ErrOrPruned =
+    Expected<bool> PrunedOrErr =
         pruneCache(CacheDirectoryPath, *PruningPolicyOrErr);
-    if (!ErrOrPruned)
-      return ErrOrPruned.takeError();
+    if (!PrunedOrErr)
+      return PrunedOrErr.takeError();
 
     // Return the path to the artifact on disk.
     return std::string(AbsCachedArtifactPath);
diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp 
b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
index bf16367045c4e..1da4fbffa3607 100644
--- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
+++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp
@@ -1210,10 +1210,10 @@ void ThinLTOCodeGenerator::run() {
     }
   }
 
-  Expected<bool> ErrOrPruned =
+  Expected<bool> PrunedOrErr =
       pruneCache(CacheOptions.Path, CacheOptions.Policy, ProducedBinaries);
-  if (!ErrOrPruned) {
-    errs() << "Error: " << toString(ErrOrPruned.takeError()) << "\n";
+  if (!PrunedOrErr) {
+    errs() << "Error: " << toString(PrunedOrErr.takeError()) << "\n";
     report_fatal_error("ThinLTO: failure to prune cache");
   }
 

From 695a2ccd9559e644ca65e06f125049daf48ecc3c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?=
 <[email protected]>
Date: Fri, 17 Apr 2026 11:25:30 +0200
Subject: [PATCH 7/9] Review: More verbose error on disk space failure

---
 llvm/lib/Support/CachePruning.cpp | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/llvm/lib/Support/CachePruning.cpp 
b/llvm/lib/Support/CachePruning.cpp
index 1e8ba94b94ad1..9aa3ae15ae23c 100644
--- a/llvm/lib/Support/CachePruning.cpp
+++ b/llvm/lib/Support/CachePruning.cpp
@@ -279,12 +279,14 @@ llvm::pruneCache(StringRef Path, CachePruningPolicy 
Policy,
 
   // Prune for size now if needed
   if (Policy.MaxSizePercentageOfAvailableSpace > 0 || Policy.MaxSizeBytes > 0) 
{
-    auto ErrOrSpaceInfo = sys::fs::disk_space(Path);
-    if (!ErrOrSpaceInfo) {
-      auto EC = ErrOrSpaceInfo.getError();
-      return errorCodeToError(EC);
+    auto SpaceInfoOrErr = sys::fs::disk_space(Path);
+    if (!SpaceInfoOrErr) {
+      auto EC = SpaceInfoOrErr.getError();
+      return createStringError(EC,
+                               "cannot get available disk space for '%s': 
'%s'",
+                               Path.str().c_str(), EC.message().c_str());
     }
-    sys::fs::space_info SpaceInfo = ErrOrSpaceInfo.get();
+    sys::fs::space_info SpaceInfo = SpaceInfoOrErr.get();
     auto AvailableSpace = TotalSize + SpaceInfo.free;
 
     if (Policy.MaxSizePercentageOfAvailableSpace == 0)

From c80aca56b2fa6bb1ba26f0cd23105844ff50be14 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?=
 <[email protected]>
Date: Fri, 17 Apr 2026 11:34:21 +0200
Subject: [PATCH 8/9] Review: debuginfod, warn but not fail

---
 llvm/lib/Debuginfod/Debuginfod.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Debuginfod/Debuginfod.cpp 
b/llvm/lib/Debuginfod/Debuginfod.cpp
index 284db473a6d8b..ac75ade516b2b 100644
--- a/llvm/lib/Debuginfod/Debuginfod.cpp
+++ b/llvm/lib/Debuginfod/Debuginfod.cpp
@@ -277,8 +277,10 @@ Expected<std::string> getCachedOrDownloadArtifact(
 
     Expected<bool> PrunedOrErr =
         pruneCache(CacheDirectoryPath, *PruningPolicyOrErr);
+    // Log the error but continue execution: failure to prune the cache is not
+    // fatal.
     if (!PrunedOrErr)
-      return PrunedOrErr.takeError();
+      logAllUnhandledErrors(PrunedOrErr.takeError(), WithColor::warning());
 
     // Return the path to the artifact on disk.
     return std::string(AbsCachedArtifactPath);

From 90cb394a51852c00f62917be50b2639ddd9e048b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?=
 <[email protected]>
Date: Fri, 17 Apr 2026 11:39:28 +0200
Subject: [PATCH 9/9] Review: move the on failure line

---
 llvm/include/llvm/Support/CachePruning.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/include/llvm/Support/CachePruning.h 
b/llvm/include/llvm/Support/CachePruning.h
index 36155b12679d0..ffc29f65a854c 100644
--- a/llvm/include/llvm/Support/CachePruning.h
+++ b/llvm/include/llvm/Support/CachePruning.h
@@ -73,6 +73,8 @@ parseCachePruningPolicy(StringRef PolicyStr);
 /// Perform pruning using the supplied policy, returns true if pruning
 /// occurred, i.e. if Policy.Interval was expired.
 ///
+/// On failure, it returns an Expected with the Error.
+///
 /// Check whether cache pruning happens using the supplied policy, adds a
 /// ThinLTO warning if cache_size_bytes or cache_size_files is too small for 
the
 /// current link job. The warning recommends the user to consider adjusting
@@ -81,8 +83,6 @@ parseCachePruningPolicy(StringRef PolicyStr);
 /// As a safeguard against data loss if the user specifies the wrong directory
 /// as their cache directory, this function will ignore files not matching the
 /// pattern "llvmcache-*".
-///
-/// On failure, it returns an Error.
 LLVM_ABI Expected<bool>
 pruneCache(StringRef Path, CachePruningPolicy Policy,
            const std::vector<std::unique_ptr<MemoryBuffer>> &Files = {});

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to