s390: Fix linker test TLS -fpic and -fno-pic exec transitions
[binutils-gdb.git] / gdb / dwarf2 / index-cache.h
blob08a2d56493c7831a527a5f7505e2400a18b0c763
1 /* Caching of GDB/DWARF index files.
3 Copyright (C) 2018-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #ifndef DWARF_INDEX_CACHE_H
21 #define DWARF_INDEX_CACHE_H
23 #include "gdbsupport/array-view.h"
25 class dwarf2_per_bfd;
26 class index_cache;
28 /* Base of the classes used to hold the resources of the indices loaded from
29 the cache (e.g. mmapped files). */
31 struct index_cache_resource
33 virtual ~index_cache_resource () = 0;
36 /* Information to be captured in the main thread, and to be used by worker
37 threads during store (). */
39 struct index_cache_store_context
41 index_cache_store_context (const index_cache &ic, dwarf2_per_bfd *per_bfd);
43 /* Store the index in the cache. */
44 void store () const;
46 private:
47 /* Captured value of enabled (). */
48 bool m_enabled;
50 /* Captured value of index cache directory. */
51 std::string m_dir;
53 /* The per-bfd object that we're caching. */
54 dwarf2_per_bfd *m_per_bfd;
56 /* Captured value of build id. */
57 std::string m_build_id_str;
59 /* Captured value of dwz build id. */
60 std::optional<std::string> m_dwz_build_id_str;
63 /* Class to manage the access to the DWARF index cache. */
65 class index_cache
67 friend struct index_cache_store_context;
68 public:
69 /* Change the directory used to save/load index files. */
70 void set_directory (std::string dir);
72 /* Return true if the usage of the cache is enabled. */
73 bool enabled () const
75 return m_enabled;
78 /* Enable the cache. */
79 void enable ();
81 /* Disable the cache. */
82 void disable ();
84 /* Look for an index file matching BUILD_ID. If found, return the contents
85 as an array_view and store the underlying resources (allocated memory,
86 mapped file, etc) in RESOURCE. The returned array_view is valid as long
87 as RESOURCE is not destroyed.
89 If no matching index file is found, return an empty array view. */
90 gdb::array_view<const gdb_byte>
91 lookup_gdb_index (const bfd_build_id *build_id,
92 std::unique_ptr<index_cache_resource> *resource);
94 /* Return the number of cache hits. */
95 unsigned int n_hits () const
96 { return m_n_hits; }
98 /* Record a cache hit. */
99 void hit ()
101 if (enabled ())
102 m_n_hits++;
105 /* Return the number of cache misses. */
106 unsigned int n_misses () const
107 { return m_n_misses; }
109 /* Record a cache miss. */
110 void miss ()
112 if (enabled ())
113 m_n_misses++;
116 private:
118 /* Compute the absolute filename where the index of the objfile with build
119 id BUILD_ID will be stored. SUFFIX is appended at the end of the
120 filename. */
121 std::string make_index_filename (const bfd_build_id *build_id,
122 const char *suffix) const;
124 /* The base directory where we are storing and looking up index files. */
125 std::string m_dir;
127 /* Whether the cache is enabled. */
128 bool m_enabled = false;
130 /* Number of cache hits and misses during this GDB session. */
131 unsigned int m_n_hits = 0;
132 unsigned int m_n_misses = 0;
135 /* The global instance of the index cache. */
136 extern index_cache global_index_cache;
138 #endif /* DWARF_INDEX_CACHE_H */