1f678e45dSDimitry Andric //===-- ModuleCache.h -------------------------------------------*- C++ -*-===// 2f678e45dSDimitry Andric // 3f678e45dSDimitry Andric // The LLVM Compiler Infrastructure 4f678e45dSDimitry Andric // 5f678e45dSDimitry Andric // This file is distributed under the University of Illinois Open Source 6f678e45dSDimitry Andric // License. See LICENSE.TXT for details. 7f678e45dSDimitry Andric // 8f678e45dSDimitry Andric //===----------------------------------------------------------------------===// 9f678e45dSDimitry Andric 10f678e45dSDimitry Andric #ifndef LLDB_TARGET_MODULECACHE_H 11f678e45dSDimitry Andric #define LLDB_TARGET_MODULECACHE_H 12f678e45dSDimitry Andric 13f678e45dSDimitry Andric #include "lldb/lldb-forward.h" 14f678e45dSDimitry Andric #include "lldb/lldb-types.h" 15f678e45dSDimitry Andric 16f678e45dSDimitry Andric #include "lldb/Host/File.h" 17f678e45dSDimitry Andric #include "lldb/Utility/FileSpec.h" 185517e702SDimitry Andric #include "lldb/Utility/Status.h" 19f678e45dSDimitry Andric 20f678e45dSDimitry Andric #include <functional> 21f678e45dSDimitry Andric #include <string> 22f678e45dSDimitry Andric #include <unordered_map> 23f678e45dSDimitry Andric 24f678e45dSDimitry Andric namespace lldb_private { 25f678e45dSDimitry Andric 26f678e45dSDimitry Andric class Module; 27f678e45dSDimitry Andric class UUID; 28f678e45dSDimitry Andric 29f678e45dSDimitry Andric //---------------------------------------------------------------------- 30f678e45dSDimitry Andric /// @class ModuleCache ModuleCache.h "lldb/Target/ModuleCache.h" 31*4ba319b5SDimitry Andric /// A module cache class. 32f678e45dSDimitry Andric /// 33*4ba319b5SDimitry Andric /// Caches locally modules that are downloaded from remote targets. Each 34*4ba319b5SDimitry Andric /// cached module maintains 2 views: 35f678e45dSDimitry Andric /// - UUID view: 36f678e45dSDimitry Andric /// /${CACHE_ROOT}/${PLATFORM_NAME}/.cache/${UUID}/${MODULE_FILENAME} 37f678e45dSDimitry Andric /// - Sysroot view: 38f678e45dSDimitry Andric /// /${CACHE_ROOT}/${PLATFORM_NAME}/${HOSTNAME}/${MODULE_FULL_FILEPATH} 39f678e45dSDimitry Andric /// 40f678e45dSDimitry Andric /// UUID views stores a real module file, whereas Sysroot view holds a symbolic 41f678e45dSDimitry Andric /// link to UUID-view file. 42f678e45dSDimitry Andric /// 43f678e45dSDimitry Andric /// Example: 44f678e45dSDimitry Andric /// UUID view : 45*4ba319b5SDimitry Andric /// /tmp/lldb/remote- 46*4ba319b5SDimitry Andric /// linux/.cache/30C94DC6-6A1F-E951-80C3-D68D2B89E576-D5AE213C/libc.so.6 47f678e45dSDimitry Andric /// Sysroot view: /tmp/lldb/remote-linux/ubuntu/lib/x86_64-linux-gnu/libc.so.6 48f678e45dSDimitry Andric //---------------------------------------------------------------------- 49f678e45dSDimitry Andric 50f678e45dSDimitry Andric class ModuleCache { 51f678e45dSDimitry Andric public: 52f678e45dSDimitry Andric using ModuleDownloader = 535517e702SDimitry Andric std::function<Status(const ModuleSpec &, const FileSpec &)>; 54f678e45dSDimitry Andric using SymfileDownloader = 555517e702SDimitry Andric std::function<Status(const lldb::ModuleSP &, const FileSpec &)>; 56f678e45dSDimitry Andric 575517e702SDimitry Andric Status GetAndPut(const FileSpec &root_dir_spec, const char *hostname, 58f678e45dSDimitry Andric const ModuleSpec &module_spec, 59f678e45dSDimitry Andric const ModuleDownloader &module_downloader, 60f678e45dSDimitry Andric const SymfileDownloader &symfile_downloader, 61f678e45dSDimitry Andric lldb::ModuleSP &cached_module_sp, bool *did_create_ptr); 62f678e45dSDimitry Andric 63f678e45dSDimitry Andric private: 645517e702SDimitry Andric Status Put(const FileSpec &root_dir_spec, const char *hostname, 65f678e45dSDimitry Andric const ModuleSpec &module_spec, const FileSpec &tmp_file, 66f678e45dSDimitry Andric const FileSpec &target_file); 67f678e45dSDimitry Andric 685517e702SDimitry Andric Status Get(const FileSpec &root_dir_spec, const char *hostname, 69f678e45dSDimitry Andric const ModuleSpec &module_spec, lldb::ModuleSP &cached_module_sp, 70f678e45dSDimitry Andric bool *did_create_ptr); 71f678e45dSDimitry Andric 72f678e45dSDimitry Andric std::unordered_map<std::string, lldb::ModuleWP> m_loaded_modules; 73f678e45dSDimitry Andric }; 74f678e45dSDimitry Andric 75f678e45dSDimitry Andric } // namespace lldb_private 76f678e45dSDimitry Andric 77f678e45dSDimitry Andric #endif // utility_ModuleCache_h_ 78