[llvm] r313592 - [ThinLTO/gold] Implement ThinLTO cache pruning support

Yi Kong via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 18 16:24:55 PDT 2017


Author: kongyi
Date: Mon Sep 18 16:24:55 2017
New Revision: 313592

URL: http://llvm.org/viewvc/llvm-project?rev=313592&view=rev
Log:
[ThinLTO/gold] Implement ThinLTO cache pruning support

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

Modified:
    llvm/trunk/test/tools/gold/X86/cache.ll
    llvm/trunk/tools/gold/gold-plugin.cpp

Modified: llvm/trunk/test/tools/gold/X86/cache.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/gold/X86/cache.ll?rev=313592&r1=313591&r2=313592&view=diff
==============================================================================
--- llvm/trunk/test/tools/gold/X86/cache.ll (original)
+++ llvm/trunk/test/tools/gold/X86/cache.ll Mon Sep 18 16:24:55 2017
@@ -24,6 +24,42 @@
 
 ; RUN: ls %t.cache | count 2
 
+
+; Create two files that would be removed by cache pruning due to age.
+; We should only remove files matching the pattern "llvmcache-*".
+
+; RUN: touch -t 197001011200 %t.cache/llvmcache-foo %t.cache/foo
+; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
+; RUN:     --plugin-opt=thinlto \
+; RUN:     --plugin-opt=cache-dir=%t.cache \
+; RUN:     --plugin-opt=cache-policy=prune_after=1h \
+; RUN:     -o %t3.o %t2.o %t.o
+
+; Two cached objects, plus a timestamp file and "foo", minus the file we removed.
+; RUN: ls %t.cache | count 4
+
+
+; Create a file of size 64KB.
+; RUN: %python -c "print(' ' * 65536)" > %t.cache/llvmcache-foo
+
+; This should leave the file in place.
+; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
+; RUN:     --plugin-opt=thinlto \
+; RUN:     --plugin-opt=cache-dir=%t.cache \
+; RUN:     --plugin-opt=cache-policy=cache_size_bytes=128k \
+; RUN:     -o %t3.o %t2.o %t.o
+; RUN: ls %t.cache | count 5
+
+
+; This should remove it.
+; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
+; RUN:     --plugin-opt=thinlto \
+; RUN:     --plugin-opt=cache-dir=%t.cache \
+; RUN:     --plugin-opt=cache-policy=cache_size_bytes=32k \
+; RUN:     -o %t3.o %t2.o %t.o
+; RUN: ls %t.cache | count 4
+
+
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 

Modified: llvm/trunk/tools/gold/gold-plugin.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/gold-plugin.cpp?rev=313592&r1=313591&r2=313592&view=diff
==============================================================================
--- llvm/trunk/tools/gold/gold-plugin.cpp (original)
+++ llvm/trunk/tools/gold/gold-plugin.cpp Mon Sep 18 16:24:55 2017
@@ -22,6 +22,7 @@
 #include "llvm/LTO/Caching.h"
 #include "llvm/LTO/LTO.h"
 #include "llvm/Object/Error.h"
+#include "llvm/Support/CachePruning.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/ManagedStatic.h"
@@ -174,6 +175,8 @@ namespace options {
   static std::string thinlto_object_suffix_replace;
   // Optional path to a directory for caching ThinLTO objects.
   static std::string cache_dir;
+  // Optional pruning policy for ThinLTO caches.
+  static std::string cache_policy;
   // Additional options to pass into the code generator.
   // Note: This array will contain all plugin options which are not claimed
   // as plugin exclusive to pass to the code generator.
@@ -222,6 +225,8 @@ namespace options {
                 "thinlto-object-suffix-replace expects 'old;new' format");
     } else if (opt.startswith("cache-dir=")) {
       cache_dir = opt.substr(strlen("cache-dir="));
+    } else if (opt.startswith("cache-policy=")) {
+      cache_policy = opt.substr(strlen("cache-policy="));
     } else if (opt.size() == 2 && opt[0] == 'O') {
       if (opt[1] < '0' || opt[1] > '3')
         message(LDPL_FATAL, "Optimization level must be between 0 and 3");
@@ -971,5 +976,11 @@ static ld_plugin_status cleanup_hook(voi
               EC.message().c_str());
   }
 
+  // Prune cache
+  if (!options::cache_policy.empty()) {
+    CachePruningPolicy policy = check(parseCachePruningPolicy(options::cache_policy));
+    pruneCache(options::cache_dir, policy);
+  }
+
   return LDPS_OK;
 }




More information about the llvm-commits mailing list