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 23 namespace lldb_private { 24 25 class Module; 26 class 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 47 class ModuleCache { 48 public: 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 60 private: 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