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