diff options
author | Kyungwoo Lee <kyulee@meta.com> | 2024-10-04 07:50:28 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-04 07:50:28 -0700 |
commit | ed59d571f2704aff4dfdeace57c286a2c6deac74 (patch) | |
tree | eea3089e673bf43c5ab11fd4e5531d85d0d0caa2 | |
parent | dada3c316d69ab641c9972062745ac16af34533e (diff) | |
download | llvm-ed59d571f2704aff4dfdeace57c286a2c6deac74.zip llvm-ed59d571f2704aff4dfdeace57c286a2c6deac74.tar.gz llvm-ed59d571f2704aff4dfdeace57c286a2c6deac74.tar.bz2 |
[ThinLTO][NFC] Refactor FileCache (#110463)
This is a prep for https://github.com/llvm/llvm-project/pull/90933.
- Change `FileCache` from a function to a type.
- Store the cache directory in the type, which will be used when creating additional caches for two-codegen round runs that inherit this value.
-rw-r--r-- | llvm/include/llvm/LTO/LTO.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/Support/Caching.h | 47 | ||||
-rw-r--r-- | llvm/lib/LTO/LTO.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Support/Caching.cpp | 5 |
4 files changed, 42 insertions, 14 deletions
diff --git a/llvm/include/llvm/LTO/LTO.h b/llvm/include/llvm/LTO/LTO.h index 214aa4e..a281c37 100644 --- a/llvm/include/llvm/LTO/LTO.h +++ b/llvm/include/llvm/LTO/LTO.h @@ -298,7 +298,7 @@ public: /// /// The client will receive at most one callback (via either AddStream or /// Cache) for each task identifier. - Error run(AddStreamFn AddStream, FileCache Cache = nullptr); + Error run(AddStreamFn AddStream, FileCache Cache = {}); /// Static method that returns a list of libcall symbols that can be generated /// by LTO but might not be visible from bitcode symbol table. diff --git a/llvm/include/llvm/Support/Caching.h b/llvm/include/llvm/Support/Caching.h index 4fa57cc..cf45145 100644 --- a/llvm/include/llvm/Support/Caching.h +++ b/llvm/include/llvm/Support/Caching.h @@ -41,21 +41,48 @@ public: using AddStreamFn = std::function<Expected<std::unique_ptr<CachedFileStream>>( unsigned Task, const Twine &ModuleName)>; -/// This is the type of a file cache. To request an item from the cache, pass a -/// unique string as the Key. For hits, the cached file will be added to the -/// link and this function will return AddStreamFn(). For misses, the cache will -/// return a stream callback which must be called at most once to produce -/// content for the stream. The file stream produced by the stream callback will -/// add the file to the link after the stream is written to. ModuleName is the -/// unique module identifier for the bitcode module the cache is being checked -/// for. +/// This is a callable that manages file caching operations. It accepts a task +/// ID \p Task, a unique key \p Key, and a module name \p ModuleName, and +/// returns AddStreamFn(). This function determines whether a cache hit or miss +/// occurs and handles the appropriate actions. +using FileCacheFunction = std::function<Expected<AddStreamFn>( + unsigned Task, StringRef Key, const Twine &ModuleName)>; + +/// This type represents a file cache system that manages caching of files. +/// It encapsulates a caching function and the directory path where the cache is +/// stored. To request an item from the cache, pass a unique string as the Key. +/// For hits, the cached file will be added to the link and this function will +/// return AddStreamFn(). For misses, the cache will return a stream callback +/// which must be called at most once to produce content for the stream. The +/// file stream produced by the stream callback will add the file to the link +/// after the stream is written to. ModuleName is the unique module identifier +/// for the bitcode module the cache is being checked for. /// /// Clients generally look like this: /// /// if (AddStreamFn AddStream = Cache(Task, Key, ModuleName)) /// ProduceContent(AddStream); -using FileCache = std::function<Expected<AddStreamFn>( - unsigned Task, StringRef Key, const Twine &ModuleName)>; +/// +/// CacheDirectoryPath stores the directory path where cached files are kept. +struct FileCache { + FileCache(FileCacheFunction CacheFn, const std::string &DirectoryPath) + : CacheFunction(std::move(CacheFn)), CacheDirectoryPath(DirectoryPath) {} + FileCache() = default; + + Expected<AddStreamFn> operator()(unsigned Task, StringRef Key, + const Twine &ModuleName) { + assert(isValid() && "Invalid cache function"); + return CacheFunction(Task, Key, ModuleName); + } + const std::string &getCacheDirectoryPath() const { + return CacheDirectoryPath; + } + bool isValid() const { return static_cast<bool>(CacheFunction); } + +private: + FileCacheFunction CacheFunction = nullptr; + std::string CacheDirectoryPath; +}; /// This type defines the callback to add a pre-existing file (e.g. in a cache). /// diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index f4c25f8..b5eb795 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -1484,7 +1484,7 @@ public: return E; } - if (!Cache || !CombinedIndex.modulePaths().count(ModuleID) || + if (!Cache.isValid() || !CombinedIndex.modulePaths().count(ModuleID) || all_of(CombinedIndex.getModuleHash(ModuleID), [](uint32_t V) { return V == 0; })) // Cache disabled or no entry for this module in the combined index or diff --git a/llvm/lib/Support/Caching.cpp b/llvm/lib/Support/Caching.cpp index 1ef51db..66e540e 100644 --- a/llvm/lib/Support/Caching.cpp +++ b/llvm/lib/Support/Caching.cpp @@ -37,8 +37,8 @@ Expected<FileCache> llvm::localCache(const Twine &CacheNameRef, TempFilePrefixRef.toVector(TempFilePrefix); CacheDirectoryPathRef.toVector(CacheDirectoryPath); - return [=](unsigned Task, StringRef Key, - const Twine &ModuleName) -> Expected<AddStreamFn> { + auto Func = [=](unsigned Task, StringRef Key, + const Twine &ModuleName) -> Expected<AddStreamFn> { // This choice of file name allows the cache to be pruned (see pruneCache() // in include/llvm/Support/CachePruning.h). SmallString<64> EntryPath; @@ -167,4 +167,5 @@ Expected<FileCache> llvm::localCache(const Twine &CacheNameRef, Task); }; }; + return FileCache(Func, CacheDirectoryPathRef.str()); } |