1//===-- ModuleCache.h -------------------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLDB_TARGET_MODULECACHE_H 10#define LLDB_TARGET_MODULECACHE_H 11 12#include "lldb/lldb-forward.h" 13#include "lldb/lldb-types.h" 14 15#include "lldb/Host/File.h" 16#include "lldb/Utility/FileSpec.h" 17#include "lldb/Utility/Status.h" 18 19#include <functional> 20#include <string> 21#include <unordered_map> 22 23namespace lldb_private { 24 25class Module; 26class UUID; 27 28/// \class ModuleCache ModuleCache.h "lldb/Target/ModuleCache.h" 29/// A module cache class. 30/// 31/// Caches locally modules that are downloaded from remote targets. Each 32/// cached module maintains 2 views: 33/// - UUID view: 34/// /${CACHE_ROOT}/${PLATFORM_NAME}/.cache/${UUID}/${MODULE_FILENAME} 35/// - Sysroot view: 36/// /${CACHE_ROOT}/${PLATFORM_NAME}/${HOSTNAME}/${MODULE_FULL_FILEPATH} 37/// 38/// UUID views stores a real module file, whereas Sysroot view holds a symbolic 39/// link to UUID-view file. 40/// 41/// Example: 42/// UUID view : 43/// /tmp/lldb/remote- 44/// linux/.cache/30C94DC6-6A1F-E951-80C3-D68D2B89E576-D5AE213C/libc.so.6 45/// Sysroot view: /tmp/lldb/remote-linux/ubuntu/lib/x86_64-linux-gnu/libc.so.6 46 47class ModuleCache { 48public: 49 using ModuleDownloader = 50 std::function<Status(const ModuleSpec &, const FileSpec &)>; 51 using SymfileDownloader = 52 std::function<Status(const lldb::ModuleSP &, const FileSpec &)>; 53 54 Status GetAndPut(const FileSpec &root_dir_spec, const char *hostname, 55 const ModuleSpec &module_spec, 56 const ModuleDownloader &module_downloader, 57 const SymfileDownloader &symfile_downloader, 58 lldb::ModuleSP &cached_module_sp, bool *did_create_ptr); 59 60private: 61 Status Put(const FileSpec &root_dir_spec, const char *hostname, 62 const ModuleSpec &module_spec, const FileSpec &tmp_file, 63 const FileSpec &target_file); 64 65 Status Get(const FileSpec &root_dir_spec, const char *hostname, 66 const ModuleSpec &module_spec, lldb::ModuleSP &cached_module_sp, 67 bool *did_create_ptr); 68 69 std::unordered_map<std::string, lldb::ModuleWP> m_loaded_modules; 70}; 71 72} // namespace lldb_private 73 74#endif // LLDB_TARGET_MODULECACHE_H 75