Fix copy-pasto, allocate objfile_per_bfd_storage with obstack_new
[deliverable/binutils-gdb.git] / gdb / dwarf-index-write.c
1 /* DWARF index writing support for GDB.
2
3 Copyright (C) 1994-2018 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20 #include "defs.h"
21
22 #include "addrmap.h"
23 #include "cli/cli-decode.h"
24 #include "common/byte-vector.h"
25 #include "common/filestuff.h"
26 #include "common/gdb_unlinker.h"
27 #include "complaints.h"
28 #include "dwarf-index-common.h"
29 #include "dwarf2.h"
30 #include "dwarf2read.h"
31 #include "gdb/gdb-index.h"
32 #include "gdbcmd.h"
33 #include "objfiles.h"
34 #include "psympriv.h"
35
36 #include <algorithm>
37 #include <cmath>
38 #include <set>
39 #include <unordered_map>
40 #include <unordered_set>
41
42 /* The suffix for an index file. */
43 #define INDEX4_SUFFIX ".gdb-index"
44 #define INDEX5_SUFFIX ".debug_names"
45 #define DEBUG_STR_SUFFIX ".debug_str"
46
47 /* Ensure only legit values are used. */
48 #define DW2_GDB_INDEX_SYMBOL_STATIC_SET_VALUE(cu_index, value) \
49 do { \
50 gdb_assert ((unsigned int) (value) <= 1); \
51 GDB_INDEX_SYMBOL_STATIC_SET_VALUE((cu_index), (value)); \
52 } while (0)
53
54 /* Ensure only legit values are used. */
55 #define DW2_GDB_INDEX_SYMBOL_KIND_SET_VALUE(cu_index, value) \
56 do { \
57 gdb_assert ((value) >= GDB_INDEX_SYMBOL_KIND_TYPE \
58 && (value) <= GDB_INDEX_SYMBOL_KIND_OTHER); \
59 GDB_INDEX_SYMBOL_KIND_SET_VALUE((cu_index), (value)); \
60 } while (0)
61
62 /* Ensure we don't use more than the alloted nuber of bits for the CU. */
63 #define DW2_GDB_INDEX_CU_SET_VALUE(cu_index, value) \
64 do { \
65 gdb_assert (((value) & ~GDB_INDEX_CU_MASK) == 0); \
66 GDB_INDEX_CU_SET_VALUE((cu_index), (value)); \
67 } while (0)
68
69 /* The "save gdb-index" command. */
70
71 /* Write SIZE bytes from the buffer pointed to by DATA to FILE, with
72 error checking. */
73
74 static void
75 file_write (FILE *file, const void *data, size_t size)
76 {
77 if (fwrite (data, 1, size, file) != size)
78 error (_("couldn't data write to file"));
79 }
80
81 /* Write the contents of VEC to FILE, with error checking. */
82
83 template<typename Elem, typename Alloc>
84 static void
85 file_write (FILE *file, const std::vector<Elem, Alloc> &vec)
86 {
87 file_write (file, vec.data (), vec.size () * sizeof (vec[0]));
88 }
89
90 /* In-memory buffer to prepare data to be written later to a file. */
91 class data_buf
92 {
93 public:
94 /* Copy DATA to the end of the buffer. */
95 template<typename T>
96 void append_data (const T &data)
97 {
98 std::copy (reinterpret_cast<const gdb_byte *> (&data),
99 reinterpret_cast<const gdb_byte *> (&data + 1),
100 grow (sizeof (data)));
101 }
102
103 /* Copy CSTR (a zero-terminated string) to the end of buffer. The
104 terminating zero is appended too. */
105 void append_cstr0 (const char *cstr)
106 {
107 const size_t size = strlen (cstr) + 1;
108 std::copy (cstr, cstr + size, grow (size));
109 }
110
111 /* Store INPUT as ULEB128 to the end of buffer. */
112 void append_unsigned_leb128 (ULONGEST input)
113 {
114 for (;;)
115 {
116 gdb_byte output = input & 0x7f;
117 input >>= 7;
118 if (input)
119 output |= 0x80;
120 append_data (output);
121 if (input == 0)
122 break;
123 }
124 }
125
126 /* Accept a host-format integer in VAL and append it to the buffer
127 as a target-format integer which is LEN bytes long. */
128 void append_uint (size_t len, bfd_endian byte_order, ULONGEST val)
129 {
130 ::store_unsigned_integer (grow (len), len, byte_order, val);
131 }
132
133 /* Return the size of the buffer. */
134 size_t size () const
135 {
136 return m_vec.size ();
137 }
138
139 /* Return true iff the buffer is empty. */
140 bool empty () const
141 {
142 return m_vec.empty ();
143 }
144
145 /* Write the buffer to FILE. */
146 void file_write (FILE *file) const
147 {
148 ::file_write (file, m_vec);
149 }
150
151 private:
152 /* Grow SIZE bytes at the end of the buffer. Returns a pointer to
153 the start of the new block. */
154 gdb_byte *grow (size_t size)
155 {
156 m_vec.resize (m_vec.size () + size);
157 return &*(m_vec.end () - size);
158 }
159
160 gdb::byte_vector m_vec;
161 };
162
163 /* An entry in the symbol table. */
164 struct symtab_index_entry
165 {
166 /* The name of the symbol. */
167 const char *name;
168 /* The offset of the name in the constant pool. */
169 offset_type index_offset;
170 /* A sorted vector of the indices of all the CUs that hold an object
171 of this name. */
172 std::vector<offset_type> cu_indices;
173 };
174
175 /* The symbol table. This is a power-of-2-sized hash table. */
176 struct mapped_symtab
177 {
178 mapped_symtab ()
179 {
180 data.resize (1024);
181 }
182
183 offset_type n_elements = 0;
184 std::vector<symtab_index_entry> data;
185 };
186
187 /* Find a slot in SYMTAB for the symbol NAME. Returns a reference to
188 the slot.
189
190 Function is used only during write_hash_table so no index format backward
191 compatibility is needed. */
192
193 static symtab_index_entry &
194 find_slot (struct mapped_symtab *symtab, const char *name)
195 {
196 offset_type index, step, hash = mapped_index_string_hash (INT_MAX, name);
197
198 index = hash & (symtab->data.size () - 1);
199 step = ((hash * 17) & (symtab->data.size () - 1)) | 1;
200
201 for (;;)
202 {
203 if (symtab->data[index].name == NULL
204 || strcmp (name, symtab->data[index].name) == 0)
205 return symtab->data[index];
206 index = (index + step) & (symtab->data.size () - 1);
207 }
208 }
209
210 /* Expand SYMTAB's hash table. */
211
212 static void
213 hash_expand (struct mapped_symtab *symtab)
214 {
215 auto old_entries = std::move (symtab->data);
216
217 symtab->data.clear ();
218 symtab->data.resize (old_entries.size () * 2);
219
220 for (auto &it : old_entries)
221 if (it.name != NULL)
222 {
223 auto &ref = find_slot (symtab, it.name);
224 ref = std::move (it);
225 }
226 }
227
228 /* Add an entry to SYMTAB. NAME is the name of the symbol.
229 CU_INDEX is the index of the CU in which the symbol appears.
230 IS_STATIC is one if the symbol is static, otherwise zero (global). */
231
232 static void
233 add_index_entry (struct mapped_symtab *symtab, const char *name,
234 int is_static, gdb_index_symbol_kind kind,
235 offset_type cu_index)
236 {
237 offset_type cu_index_and_attrs;
238
239 ++symtab->n_elements;
240 if (4 * symtab->n_elements / 3 >= symtab->data.size ())
241 hash_expand (symtab);
242
243 symtab_index_entry &slot = find_slot (symtab, name);
244 if (slot.name == NULL)
245 {
246 slot.name = name;
247 /* index_offset is set later. */
248 }
249
250 cu_index_and_attrs = 0;
251 DW2_GDB_INDEX_CU_SET_VALUE (cu_index_and_attrs, cu_index);
252 DW2_GDB_INDEX_SYMBOL_STATIC_SET_VALUE (cu_index_and_attrs, is_static);
253 DW2_GDB_INDEX_SYMBOL_KIND_SET_VALUE (cu_index_and_attrs, kind);
254
255 /* We don't want to record an index value twice as we want to avoid the
256 duplication.
257 We process all global symbols and then all static symbols
258 (which would allow us to avoid the duplication by only having to check
259 the last entry pushed), but a symbol could have multiple kinds in one CU.
260 To keep things simple we don't worry about the duplication here and
261 sort and uniqufy the list after we've processed all symbols. */
262 slot.cu_indices.push_back (cu_index_and_attrs);
263 }
264
265 /* Sort and remove duplicates of all symbols' cu_indices lists. */
266
267 static void
268 uniquify_cu_indices (struct mapped_symtab *symtab)
269 {
270 for (auto &entry : symtab->data)
271 {
272 if (entry.name != NULL && !entry.cu_indices.empty ())
273 {
274 auto &cu_indices = entry.cu_indices;
275 std::sort (cu_indices.begin (), cu_indices.end ());
276 auto from = std::unique (cu_indices.begin (), cu_indices.end ());
277 cu_indices.erase (from, cu_indices.end ());
278 }
279 }
280 }
281
282 /* A form of 'const char *' suitable for container keys. Only the
283 pointer is stored. The strings themselves are compared, not the
284 pointers. */
285 class c_str_view
286 {
287 public:
288 c_str_view (const char *cstr)
289 : m_cstr (cstr)
290 {}
291
292 bool operator== (const c_str_view &other) const
293 {
294 return strcmp (m_cstr, other.m_cstr) == 0;
295 }
296
297 /* Return the underlying C string. Note, the returned string is
298 only a reference with lifetime of this object. */
299 const char *c_str () const
300 {
301 return m_cstr;
302 }
303
304 private:
305 friend class c_str_view_hasher;
306 const char *const m_cstr;
307 };
308
309 /* A std::unordered_map::hasher for c_str_view that uses the right
310 hash function for strings in a mapped index. */
311 class c_str_view_hasher
312 {
313 public:
314 size_t operator () (const c_str_view &x) const
315 {
316 return mapped_index_string_hash (INT_MAX, x.m_cstr);
317 }
318 };
319
320 /* A std::unordered_map::hasher for std::vector<>. */
321 template<typename T>
322 class vector_hasher
323 {
324 public:
325 size_t operator () (const std::vector<T> &key) const
326 {
327 return iterative_hash (key.data (),
328 sizeof (key.front ()) * key.size (), 0);
329 }
330 };
331
332 /* Write the mapped hash table SYMTAB to the data buffer OUTPUT, with
333 constant pool entries going into the data buffer CPOOL. */
334
335 static void
336 write_hash_table (mapped_symtab *symtab, data_buf &output, data_buf &cpool)
337 {
338 {
339 /* Elements are sorted vectors of the indices of all the CUs that
340 hold an object of this name. */
341 std::unordered_map<std::vector<offset_type>, offset_type,
342 vector_hasher<offset_type>>
343 symbol_hash_table;
344
345 /* We add all the index vectors to the constant pool first, to
346 ensure alignment is ok. */
347 for (symtab_index_entry &entry : symtab->data)
348 {
349 if (entry.name == NULL)
350 continue;
351 gdb_assert (entry.index_offset == 0);
352
353 /* Finding before inserting is faster than always trying to
354 insert, because inserting always allocates a node, does the
355 lookup, and then destroys the new node if another node
356 already had the same key. C++17 try_emplace will avoid
357 this. */
358 const auto found
359 = symbol_hash_table.find (entry.cu_indices);
360 if (found != symbol_hash_table.end ())
361 {
362 entry.index_offset = found->second;
363 continue;
364 }
365
366 symbol_hash_table.emplace (entry.cu_indices, cpool.size ());
367 entry.index_offset = cpool.size ();
368 cpool.append_data (MAYBE_SWAP (entry.cu_indices.size ()));
369 for (const auto index : entry.cu_indices)
370 cpool.append_data (MAYBE_SWAP (index));
371 }
372 }
373
374 /* Now write out the hash table. */
375 std::unordered_map<c_str_view, offset_type, c_str_view_hasher> str_table;
376 for (const auto &entry : symtab->data)
377 {
378 offset_type str_off, vec_off;
379
380 if (entry.name != NULL)
381 {
382 const auto insertpair = str_table.emplace (entry.name, cpool.size ());
383 if (insertpair.second)
384 cpool.append_cstr0 (entry.name);
385 str_off = insertpair.first->second;
386 vec_off = entry.index_offset;
387 }
388 else
389 {
390 /* While 0 is a valid constant pool index, it is not valid
391 to have 0 for both offsets. */
392 str_off = 0;
393 vec_off = 0;
394 }
395
396 output.append_data (MAYBE_SWAP (str_off));
397 output.append_data (MAYBE_SWAP (vec_off));
398 }
399 }
400
401 typedef std::unordered_map<partial_symtab *, unsigned int> psym_index_map;
402
403 /* Helper struct for building the address table. */
404 struct addrmap_index_data
405 {
406 addrmap_index_data (data_buf &addr_vec_, psym_index_map &cu_index_htab_)
407 : addr_vec (addr_vec_), cu_index_htab (cu_index_htab_)
408 {}
409
410 struct objfile *objfile;
411 data_buf &addr_vec;
412 psym_index_map &cu_index_htab;
413
414 /* Non-zero if the previous_* fields are valid.
415 We can't write an entry until we see the next entry (since it is only then
416 that we know the end of the entry). */
417 int previous_valid;
418 /* Index of the CU in the table of all CUs in the index file. */
419 unsigned int previous_cu_index;
420 /* Start address of the CU. */
421 CORE_ADDR previous_cu_start;
422 };
423
424 /* Write an address entry to ADDR_VEC. */
425
426 static void
427 add_address_entry (struct objfile *objfile, data_buf &addr_vec,
428 CORE_ADDR start, CORE_ADDR end, unsigned int cu_index)
429 {
430 CORE_ADDR baseaddr;
431
432 baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
433
434 addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, start - baseaddr);
435 addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, end - baseaddr);
436 addr_vec.append_data (MAYBE_SWAP (cu_index));
437 }
438
439 /* Worker function for traversing an addrmap to build the address table. */
440
441 static int
442 add_address_entry_worker (void *datap, CORE_ADDR start_addr, void *obj)
443 {
444 struct addrmap_index_data *data = (struct addrmap_index_data *) datap;
445 struct partial_symtab *pst = (struct partial_symtab *) obj;
446
447 if (data->previous_valid)
448 add_address_entry (data->objfile, data->addr_vec,
449 data->previous_cu_start, start_addr,
450 data->previous_cu_index);
451
452 data->previous_cu_start = start_addr;
453 if (pst != NULL)
454 {
455 const auto it = data->cu_index_htab.find (pst);
456 gdb_assert (it != data->cu_index_htab.cend ());
457 data->previous_cu_index = it->second;
458 data->previous_valid = 1;
459 }
460 else
461 data->previous_valid = 0;
462
463 return 0;
464 }
465
466 /* Write OBJFILE's address map to ADDR_VEC.
467 CU_INDEX_HTAB is used to map addrmap entries to their CU indices
468 in the index file. */
469
470 static void
471 write_address_map (struct objfile *objfile, data_buf &addr_vec,
472 psym_index_map &cu_index_htab)
473 {
474 struct addrmap_index_data addrmap_index_data (addr_vec, cu_index_htab);
475
476 /* When writing the address table, we have to cope with the fact that
477 the addrmap iterator only provides the start of a region; we have to
478 wait until the next invocation to get the start of the next region. */
479
480 addrmap_index_data.objfile = objfile;
481 addrmap_index_data.previous_valid = 0;
482
483 addrmap_foreach (objfile->psymtabs_addrmap, add_address_entry_worker,
484 &addrmap_index_data);
485
486 /* It's highly unlikely the last entry (end address = 0xff...ff)
487 is valid, but we should still handle it.
488 The end address is recorded as the start of the next region, but that
489 doesn't work here. To cope we pass 0xff...ff, this is a rare situation
490 anyway. */
491 if (addrmap_index_data.previous_valid)
492 add_address_entry (objfile, addr_vec,
493 addrmap_index_data.previous_cu_start, (CORE_ADDR) -1,
494 addrmap_index_data.previous_cu_index);
495 }
496
497 /* Return the symbol kind of PSYM. */
498
499 static gdb_index_symbol_kind
500 symbol_kind (struct partial_symbol *psym)
501 {
502 domain_enum domain = PSYMBOL_DOMAIN (psym);
503 enum address_class aclass = PSYMBOL_CLASS (psym);
504
505 switch (domain)
506 {
507 case VAR_DOMAIN:
508 switch (aclass)
509 {
510 case LOC_BLOCK:
511 return GDB_INDEX_SYMBOL_KIND_FUNCTION;
512 case LOC_TYPEDEF:
513 return GDB_INDEX_SYMBOL_KIND_TYPE;
514 case LOC_COMPUTED:
515 case LOC_CONST_BYTES:
516 case LOC_OPTIMIZED_OUT:
517 case LOC_STATIC:
518 return GDB_INDEX_SYMBOL_KIND_VARIABLE;
519 case LOC_CONST:
520 /* Note: It's currently impossible to recognize psyms as enum values
521 short of reading the type info. For now punt. */
522 return GDB_INDEX_SYMBOL_KIND_VARIABLE;
523 default:
524 /* There are other LOC_FOO values that one might want to classify
525 as variables, but dwarf2read.c doesn't currently use them. */
526 return GDB_INDEX_SYMBOL_KIND_OTHER;
527 }
528 case STRUCT_DOMAIN:
529 return GDB_INDEX_SYMBOL_KIND_TYPE;
530 default:
531 return GDB_INDEX_SYMBOL_KIND_OTHER;
532 }
533 }
534
535 /* Add a list of partial symbols to SYMTAB. */
536
537 static void
538 write_psymbols (struct mapped_symtab *symtab,
539 std::unordered_set<partial_symbol *> &psyms_seen,
540 struct partial_symbol **psymp,
541 int count,
542 offset_type cu_index,
543 int is_static)
544 {
545 for (; count-- > 0; ++psymp)
546 {
547 struct partial_symbol *psym = *psymp;
548
549 if (SYMBOL_LANGUAGE (psym) == language_ada)
550 error (_("Ada is not currently supported by the index"));
551
552 /* Only add a given psymbol once. */
553 if (psyms_seen.insert (psym).second)
554 {
555 gdb_index_symbol_kind kind = symbol_kind (psym);
556
557 add_index_entry (symtab, SYMBOL_SEARCH_NAME (psym),
558 is_static, kind, cu_index);
559 }
560 }
561 }
562
563 /* A helper struct used when iterating over debug_types. */
564 struct signatured_type_index_data
565 {
566 signatured_type_index_data (data_buf &types_list_,
567 std::unordered_set<partial_symbol *> &psyms_seen_)
568 : types_list (types_list_), psyms_seen (psyms_seen_)
569 {}
570
571 struct objfile *objfile;
572 struct mapped_symtab *symtab;
573 data_buf &types_list;
574 std::unordered_set<partial_symbol *> &psyms_seen;
575 int cu_index;
576 };
577
578 /* A helper function that writes a single signatured_type to an
579 obstack. */
580
581 static int
582 write_one_signatured_type (void **slot, void *d)
583 {
584 struct signatured_type_index_data *info
585 = (struct signatured_type_index_data *) d;
586 struct signatured_type *entry = (struct signatured_type *) *slot;
587 struct partial_symtab *psymtab = entry->per_cu.v.psymtab;
588
589 write_psymbols (info->symtab,
590 info->psyms_seen,
591 (info->objfile->global_psymbols.data ()
592 + psymtab->globals_offset),
593 psymtab->n_global_syms, info->cu_index,
594 0);
595 write_psymbols (info->symtab,
596 info->psyms_seen,
597 (info->objfile->static_psymbols.data ()
598 + psymtab->statics_offset),
599 psymtab->n_static_syms, info->cu_index,
600 1);
601
602 info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
603 to_underlying (entry->per_cu.sect_off));
604 info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
605 to_underlying (entry->type_offset_in_tu));
606 info->types_list.append_uint (8, BFD_ENDIAN_LITTLE, entry->signature);
607
608 ++info->cu_index;
609
610 return 1;
611 }
612
613 /* Recurse into all "included" dependencies and count their symbols as
614 if they appeared in this psymtab. */
615
616 static void
617 recursively_count_psymbols (struct partial_symtab *psymtab,
618 size_t &psyms_seen)
619 {
620 for (int i = 0; i < psymtab->number_of_dependencies; ++i)
621 if (psymtab->dependencies[i]->user != NULL)
622 recursively_count_psymbols (psymtab->dependencies[i],
623 psyms_seen);
624
625 psyms_seen += psymtab->n_global_syms;
626 psyms_seen += psymtab->n_static_syms;
627 }
628
629 /* Recurse into all "included" dependencies and write their symbols as
630 if they appeared in this psymtab. */
631
632 static void
633 recursively_write_psymbols (struct objfile *objfile,
634 struct partial_symtab *psymtab,
635 struct mapped_symtab *symtab,
636 std::unordered_set<partial_symbol *> &psyms_seen,
637 offset_type cu_index)
638 {
639 int i;
640
641 for (i = 0; i < psymtab->number_of_dependencies; ++i)
642 if (psymtab->dependencies[i]->user != NULL)
643 recursively_write_psymbols (objfile, psymtab->dependencies[i],
644 symtab, psyms_seen, cu_index);
645
646 write_psymbols (symtab,
647 psyms_seen,
648 objfile->global_psymbols.data () + psymtab->globals_offset,
649 psymtab->n_global_syms, cu_index,
650 0);
651 write_psymbols (symtab,
652 psyms_seen,
653 objfile->static_psymbols.data () + psymtab->statics_offset,
654 psymtab->n_static_syms, cu_index,
655 1);
656 }
657
658 /* DWARF-5 .debug_names builder. */
659 class debug_names
660 {
661 public:
662 debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile, bool is_dwarf64,
663 bfd_endian dwarf5_byte_order)
664 : m_dwarf5_byte_order (dwarf5_byte_order),
665 m_dwarf32 (dwarf5_byte_order),
666 m_dwarf64 (dwarf5_byte_order),
667 m_dwarf (is_dwarf64
668 ? static_cast<dwarf &> (m_dwarf64)
669 : static_cast<dwarf &> (m_dwarf32)),
670 m_name_table_string_offs (m_dwarf.name_table_string_offs),
671 m_name_table_entry_offs (m_dwarf.name_table_entry_offs),
672 m_debugstrlookup (dwarf2_per_objfile)
673 {}
674
675 int dwarf5_offset_size () const
676 {
677 const bool dwarf5_is_dwarf64 = &m_dwarf == &m_dwarf64;
678 return dwarf5_is_dwarf64 ? 8 : 4;
679 }
680
681 /* Is this symbol from DW_TAG_compile_unit or DW_TAG_type_unit? */
682 enum class unit_kind { cu, tu };
683
684 /* Insert one symbol. */
685 void insert (const partial_symbol *psym, int cu_index, bool is_static,
686 unit_kind kind)
687 {
688 const int dwarf_tag = psymbol_tag (psym);
689 if (dwarf_tag == 0)
690 return;
691 const char *const name = SYMBOL_SEARCH_NAME (psym);
692 const auto insertpair
693 = m_name_to_value_set.emplace (c_str_view (name),
694 std::set<symbol_value> ());
695 std::set<symbol_value> &value_set = insertpair.first->second;
696 value_set.emplace (symbol_value (dwarf_tag, cu_index, is_static, kind));
697 }
698
699 /* Build all the tables. All symbols must be already inserted.
700 This function does not call file_write, caller has to do it
701 afterwards. */
702 void build ()
703 {
704 /* Verify the build method has not be called twice. */
705 gdb_assert (m_abbrev_table.empty ());
706 const size_t name_count = m_name_to_value_set.size ();
707 m_bucket_table.resize
708 (std::pow (2, std::ceil (std::log2 (name_count * 4 / 3))));
709 m_hash_table.reserve (name_count);
710 m_name_table_string_offs.reserve (name_count);
711 m_name_table_entry_offs.reserve (name_count);
712
713 /* Map each hash of symbol to its name and value. */
714 struct hash_it_pair
715 {
716 uint32_t hash;
717 decltype (m_name_to_value_set)::const_iterator it;
718 };
719 std::vector<std::forward_list<hash_it_pair>> bucket_hash;
720 bucket_hash.resize (m_bucket_table.size ());
721 for (decltype (m_name_to_value_set)::const_iterator it
722 = m_name_to_value_set.cbegin ();
723 it != m_name_to_value_set.cend ();
724 ++it)
725 {
726 const char *const name = it->first.c_str ();
727 const uint32_t hash = dwarf5_djb_hash (name);
728 hash_it_pair hashitpair;
729 hashitpair.hash = hash;
730 hashitpair.it = it;
731 auto &slot = bucket_hash[hash % bucket_hash.size()];
732 slot.push_front (std::move (hashitpair));
733 }
734 for (size_t bucket_ix = 0; bucket_ix < bucket_hash.size (); ++bucket_ix)
735 {
736 const std::forward_list<hash_it_pair> &hashitlist
737 = bucket_hash[bucket_ix];
738 if (hashitlist.empty ())
739 continue;
740 uint32_t &bucket_slot = m_bucket_table[bucket_ix];
741 /* The hashes array is indexed starting at 1. */
742 store_unsigned_integer (reinterpret_cast<gdb_byte *> (&bucket_slot),
743 sizeof (bucket_slot), m_dwarf5_byte_order,
744 m_hash_table.size () + 1);
745 for (const hash_it_pair &hashitpair : hashitlist)
746 {
747 m_hash_table.push_back (0);
748 store_unsigned_integer (reinterpret_cast<gdb_byte *>
749 (&m_hash_table.back ()),
750 sizeof (m_hash_table.back ()),
751 m_dwarf5_byte_order, hashitpair.hash);
752 const c_str_view &name = hashitpair.it->first;
753 const std::set<symbol_value> &value_set = hashitpair.it->second;
754 m_name_table_string_offs.push_back_reorder
755 (m_debugstrlookup.lookup (name.c_str ()));
756 m_name_table_entry_offs.push_back_reorder (m_entry_pool.size ());
757 gdb_assert (!value_set.empty ());
758 for (const symbol_value &value : value_set)
759 {
760 int &idx = m_indexkey_to_idx[index_key (value.dwarf_tag,
761 value.is_static,
762 value.kind)];
763 if (idx == 0)
764 {
765 idx = m_idx_next++;
766 m_abbrev_table.append_unsigned_leb128 (idx);
767 m_abbrev_table.append_unsigned_leb128 (value.dwarf_tag);
768 m_abbrev_table.append_unsigned_leb128
769 (value.kind == unit_kind::cu ? DW_IDX_compile_unit
770 : DW_IDX_type_unit);
771 m_abbrev_table.append_unsigned_leb128 (DW_FORM_udata);
772 m_abbrev_table.append_unsigned_leb128 (value.is_static
773 ? DW_IDX_GNU_internal
774 : DW_IDX_GNU_external);
775 m_abbrev_table.append_unsigned_leb128 (DW_FORM_flag_present);
776
777 /* Terminate attributes list. */
778 m_abbrev_table.append_unsigned_leb128 (0);
779 m_abbrev_table.append_unsigned_leb128 (0);
780 }
781
782 m_entry_pool.append_unsigned_leb128 (idx);
783 m_entry_pool.append_unsigned_leb128 (value.cu_index);
784 }
785
786 /* Terminate the list of CUs. */
787 m_entry_pool.append_unsigned_leb128 (0);
788 }
789 }
790 gdb_assert (m_hash_table.size () == name_count);
791
792 /* Terminate tags list. */
793 m_abbrev_table.append_unsigned_leb128 (0);
794 }
795
796 /* Return .debug_names bucket count. This must be called only after
797 calling the build method. */
798 uint32_t bucket_count () const
799 {
800 /* Verify the build method has been already called. */
801 gdb_assert (!m_abbrev_table.empty ());
802 const uint32_t retval = m_bucket_table.size ();
803
804 /* Check for overflow. */
805 gdb_assert (retval == m_bucket_table.size ());
806 return retval;
807 }
808
809 /* Return .debug_names names count. This must be called only after
810 calling the build method. */
811 uint32_t name_count () const
812 {
813 /* Verify the build method has been already called. */
814 gdb_assert (!m_abbrev_table.empty ());
815 const uint32_t retval = m_hash_table.size ();
816
817 /* Check for overflow. */
818 gdb_assert (retval == m_hash_table.size ());
819 return retval;
820 }
821
822 /* Return number of bytes of .debug_names abbreviation table. This
823 must be called only after calling the build method. */
824 uint32_t abbrev_table_bytes () const
825 {
826 gdb_assert (!m_abbrev_table.empty ());
827 return m_abbrev_table.size ();
828 }
829
830 /* Recurse into all "included" dependencies and store their symbols
831 as if they appeared in this psymtab. */
832 void recursively_write_psymbols
833 (struct objfile *objfile,
834 struct partial_symtab *psymtab,
835 std::unordered_set<partial_symbol *> &psyms_seen,
836 int cu_index)
837 {
838 for (int i = 0; i < psymtab->number_of_dependencies; ++i)
839 if (psymtab->dependencies[i]->user != NULL)
840 recursively_write_psymbols (objfile, psymtab->dependencies[i],
841 psyms_seen, cu_index);
842
843 write_psymbols (psyms_seen,
844 objfile->global_psymbols.data () + psymtab->globals_offset,
845 psymtab->n_global_syms, cu_index, false, unit_kind::cu);
846 write_psymbols (psyms_seen,
847 objfile->static_psymbols.data () + psymtab->statics_offset,
848 psymtab->n_static_syms, cu_index, true, unit_kind::cu);
849 }
850
851 /* Return number of bytes the .debug_names section will have. This
852 must be called only after calling the build method. */
853 size_t bytes () const
854 {
855 /* Verify the build method has been already called. */
856 gdb_assert (!m_abbrev_table.empty ());
857 size_t expected_bytes = 0;
858 expected_bytes += m_bucket_table.size () * sizeof (m_bucket_table[0]);
859 expected_bytes += m_hash_table.size () * sizeof (m_hash_table[0]);
860 expected_bytes += m_name_table_string_offs.bytes ();
861 expected_bytes += m_name_table_entry_offs.bytes ();
862 expected_bytes += m_abbrev_table.size ();
863 expected_bytes += m_entry_pool.size ();
864 return expected_bytes;
865 }
866
867 /* Write .debug_names to FILE_NAMES and .debug_str addition to
868 FILE_STR. This must be called only after calling the build
869 method. */
870 void file_write (FILE *file_names, FILE *file_str) const
871 {
872 /* Verify the build method has been already called. */
873 gdb_assert (!m_abbrev_table.empty ());
874 ::file_write (file_names, m_bucket_table);
875 ::file_write (file_names, m_hash_table);
876 m_name_table_string_offs.file_write (file_names);
877 m_name_table_entry_offs.file_write (file_names);
878 m_abbrev_table.file_write (file_names);
879 m_entry_pool.file_write (file_names);
880 m_debugstrlookup.file_write (file_str);
881 }
882
883 /* A helper user data for write_one_signatured_type. */
884 class write_one_signatured_type_data
885 {
886 public:
887 write_one_signatured_type_data (debug_names &nametable_,
888 signatured_type_index_data &&info_)
889 : nametable (nametable_), info (std::move (info_))
890 {}
891 debug_names &nametable;
892 struct signatured_type_index_data info;
893 };
894
895 /* A helper function to pass write_one_signatured_type to
896 htab_traverse_noresize. */
897 static int
898 write_one_signatured_type (void **slot, void *d)
899 {
900 write_one_signatured_type_data *data = (write_one_signatured_type_data *) d;
901 struct signatured_type_index_data *info = &data->info;
902 struct signatured_type *entry = (struct signatured_type *) *slot;
903
904 data->nametable.write_one_signatured_type (entry, info);
905
906 return 1;
907 }
908
909 private:
910
911 /* Storage for symbol names mapping them to their .debug_str section
912 offsets. */
913 class debug_str_lookup
914 {
915 public:
916
917 /* Object costructor to be called for current DWARF2_PER_OBJFILE.
918 All .debug_str section strings are automatically stored. */
919 debug_str_lookup (struct dwarf2_per_objfile *dwarf2_per_objfile)
920 : m_abfd (dwarf2_per_objfile->objfile->obfd),
921 m_dwarf2_per_objfile (dwarf2_per_objfile)
922 {
923 dwarf2_read_section (dwarf2_per_objfile->objfile,
924 &dwarf2_per_objfile->str);
925 if (dwarf2_per_objfile->str.buffer == NULL)
926 return;
927 for (const gdb_byte *data = dwarf2_per_objfile->str.buffer;
928 data < (dwarf2_per_objfile->str.buffer
929 + dwarf2_per_objfile->str.size);)
930 {
931 const char *const s = reinterpret_cast<const char *> (data);
932 const auto insertpair
933 = m_str_table.emplace (c_str_view (s),
934 data - dwarf2_per_objfile->str.buffer);
935 if (!insertpair.second)
936 complaint (&symfile_complaints,
937 _("Duplicate string \"%s\" in "
938 ".debug_str section [in module %s]"),
939 s, bfd_get_filename (m_abfd));
940 data += strlen (s) + 1;
941 }
942 }
943
944 /* Return offset of symbol name S in the .debug_str section. Add
945 such symbol to the section's end if it does not exist there
946 yet. */
947 size_t lookup (const char *s)
948 {
949 const auto it = m_str_table.find (c_str_view (s));
950 if (it != m_str_table.end ())
951 return it->second;
952 const size_t offset = (m_dwarf2_per_objfile->str.size
953 + m_str_add_buf.size ());
954 m_str_table.emplace (c_str_view (s), offset);
955 m_str_add_buf.append_cstr0 (s);
956 return offset;
957 }
958
959 /* Append the end of the .debug_str section to FILE. */
960 void file_write (FILE *file) const
961 {
962 m_str_add_buf.file_write (file);
963 }
964
965 private:
966 std::unordered_map<c_str_view, size_t, c_str_view_hasher> m_str_table;
967 bfd *const m_abfd;
968 struct dwarf2_per_objfile *m_dwarf2_per_objfile;
969
970 /* Data to add at the end of .debug_str for new needed symbol names. */
971 data_buf m_str_add_buf;
972 };
973
974 /* Container to map used DWARF tags to their .debug_names abbreviation
975 tags. */
976 class index_key
977 {
978 public:
979 index_key (int dwarf_tag_, bool is_static_, unit_kind kind_)
980 : dwarf_tag (dwarf_tag_), is_static (is_static_), kind (kind_)
981 {
982 }
983
984 bool
985 operator== (const index_key &other) const
986 {
987 return (dwarf_tag == other.dwarf_tag && is_static == other.is_static
988 && kind == other.kind);
989 }
990
991 const int dwarf_tag;
992 const bool is_static;
993 const unit_kind kind;
994 };
995
996 /* Provide std::unordered_map::hasher for index_key. */
997 class index_key_hasher
998 {
999 public:
1000 size_t
1001 operator () (const index_key &key) const
1002 {
1003 return (std::hash<int>() (key.dwarf_tag) << 1) | key.is_static;
1004 }
1005 };
1006
1007 /* Parameters of one symbol entry. */
1008 class symbol_value
1009 {
1010 public:
1011 const int dwarf_tag, cu_index;
1012 const bool is_static;
1013 const unit_kind kind;
1014
1015 symbol_value (int dwarf_tag_, int cu_index_, bool is_static_,
1016 unit_kind kind_)
1017 : dwarf_tag (dwarf_tag_), cu_index (cu_index_), is_static (is_static_),
1018 kind (kind_)
1019 {}
1020
1021 bool
1022 operator< (const symbol_value &other) const
1023 {
1024 #define X(n) \
1025 do \
1026 { \
1027 if (n < other.n) \
1028 return true; \
1029 if (n > other.n) \
1030 return false; \
1031 } \
1032 while (0)
1033 X (dwarf_tag);
1034 X (is_static);
1035 X (kind);
1036 X (cu_index);
1037 #undef X
1038 return false;
1039 }
1040 };
1041
1042 /* Abstract base class to unify DWARF-32 and DWARF-64 name table
1043 output. */
1044 class offset_vec
1045 {
1046 protected:
1047 const bfd_endian dwarf5_byte_order;
1048 public:
1049 explicit offset_vec (bfd_endian dwarf5_byte_order_)
1050 : dwarf5_byte_order (dwarf5_byte_order_)
1051 {}
1052
1053 /* Call std::vector::reserve for NELEM elements. */
1054 virtual void reserve (size_t nelem) = 0;
1055
1056 /* Call std::vector::push_back with store_unsigned_integer byte
1057 reordering for ELEM. */
1058 virtual void push_back_reorder (size_t elem) = 0;
1059
1060 /* Return expected output size in bytes. */
1061 virtual size_t bytes () const = 0;
1062
1063 /* Write name table to FILE. */
1064 virtual void file_write (FILE *file) const = 0;
1065 };
1066
1067 /* Template to unify DWARF-32 and DWARF-64 output. */
1068 template<typename OffsetSize>
1069 class offset_vec_tmpl : public offset_vec
1070 {
1071 public:
1072 explicit offset_vec_tmpl (bfd_endian dwarf5_byte_order_)
1073 : offset_vec (dwarf5_byte_order_)
1074 {}
1075
1076 /* Implement offset_vec::reserve. */
1077 void reserve (size_t nelem) override
1078 {
1079 m_vec.reserve (nelem);
1080 }
1081
1082 /* Implement offset_vec::push_back_reorder. */
1083 void push_back_reorder (size_t elem) override
1084 {
1085 m_vec.push_back (elem);
1086 /* Check for overflow. */
1087 gdb_assert (m_vec.back () == elem);
1088 store_unsigned_integer (reinterpret_cast<gdb_byte *> (&m_vec.back ()),
1089 sizeof (m_vec.back ()), dwarf5_byte_order, elem);
1090 }
1091
1092 /* Implement offset_vec::bytes. */
1093 size_t bytes () const override
1094 {
1095 return m_vec.size () * sizeof (m_vec[0]);
1096 }
1097
1098 /* Implement offset_vec::file_write. */
1099 void file_write (FILE *file) const override
1100 {
1101 ::file_write (file, m_vec);
1102 }
1103
1104 private:
1105 std::vector<OffsetSize> m_vec;
1106 };
1107
1108 /* Base class to unify DWARF-32 and DWARF-64 .debug_names output
1109 respecting name table width. */
1110 class dwarf
1111 {
1112 public:
1113 offset_vec &name_table_string_offs, &name_table_entry_offs;
1114
1115 dwarf (offset_vec &name_table_string_offs_,
1116 offset_vec &name_table_entry_offs_)
1117 : name_table_string_offs (name_table_string_offs_),
1118 name_table_entry_offs (name_table_entry_offs_)
1119 {
1120 }
1121 };
1122
1123 /* Template to unify DWARF-32 and DWARF-64 .debug_names output
1124 respecting name table width. */
1125 template<typename OffsetSize>
1126 class dwarf_tmpl : public dwarf
1127 {
1128 public:
1129 explicit dwarf_tmpl (bfd_endian dwarf5_byte_order_)
1130 : dwarf (m_name_table_string_offs, m_name_table_entry_offs),
1131 m_name_table_string_offs (dwarf5_byte_order_),
1132 m_name_table_entry_offs (dwarf5_byte_order_)
1133 {}
1134
1135 private:
1136 offset_vec_tmpl<OffsetSize> m_name_table_string_offs;
1137 offset_vec_tmpl<OffsetSize> m_name_table_entry_offs;
1138 };
1139
1140 /* Try to reconstruct original DWARF tag for given partial_symbol.
1141 This function is not DWARF-5 compliant but it is sufficient for
1142 GDB as a DWARF-5 index consumer. */
1143 static int psymbol_tag (const struct partial_symbol *psym)
1144 {
1145 domain_enum domain = PSYMBOL_DOMAIN (psym);
1146 enum address_class aclass = PSYMBOL_CLASS (psym);
1147
1148 switch (domain)
1149 {
1150 case VAR_DOMAIN:
1151 switch (aclass)
1152 {
1153 case LOC_BLOCK:
1154 return DW_TAG_subprogram;
1155 case LOC_TYPEDEF:
1156 return DW_TAG_typedef;
1157 case LOC_COMPUTED:
1158 case LOC_CONST_BYTES:
1159 case LOC_OPTIMIZED_OUT:
1160 case LOC_STATIC:
1161 return DW_TAG_variable;
1162 case LOC_CONST:
1163 /* Note: It's currently impossible to recognize psyms as enum values
1164 short of reading the type info. For now punt. */
1165 return DW_TAG_variable;
1166 default:
1167 /* There are other LOC_FOO values that one might want to classify
1168 as variables, but dwarf2read.c doesn't currently use them. */
1169 return DW_TAG_variable;
1170 }
1171 case STRUCT_DOMAIN:
1172 return DW_TAG_structure_type;
1173 default:
1174 return 0;
1175 }
1176 }
1177
1178 /* Call insert for all partial symbols and mark them in PSYMS_SEEN. */
1179 void write_psymbols (std::unordered_set<partial_symbol *> &psyms_seen,
1180 struct partial_symbol **psymp, int count, int cu_index,
1181 bool is_static, unit_kind kind)
1182 {
1183 for (; count-- > 0; ++psymp)
1184 {
1185 struct partial_symbol *psym = *psymp;
1186
1187 if (SYMBOL_LANGUAGE (psym) == language_ada)
1188 error (_("Ada is not currently supported by the index"));
1189
1190 /* Only add a given psymbol once. */
1191 if (psyms_seen.insert (psym).second)
1192 insert (psym, cu_index, is_static, kind);
1193 }
1194 }
1195
1196 /* A helper function that writes a single signatured_type
1197 to a debug_names. */
1198 void
1199 write_one_signatured_type (struct signatured_type *entry,
1200 struct signatured_type_index_data *info)
1201 {
1202 struct partial_symtab *psymtab = entry->per_cu.v.psymtab;
1203
1204 write_psymbols (info->psyms_seen,
1205 (info->objfile->global_psymbols.data ()
1206 + psymtab->globals_offset),
1207 psymtab->n_global_syms, info->cu_index, false,
1208 unit_kind::tu);
1209 write_psymbols (info->psyms_seen,
1210 (info->objfile->static_psymbols.data ()
1211 + psymtab->statics_offset),
1212 psymtab->n_static_syms, info->cu_index, true,
1213 unit_kind::tu);
1214
1215 info->types_list.append_uint (dwarf5_offset_size (), m_dwarf5_byte_order,
1216 to_underlying (entry->per_cu.sect_off));
1217
1218 ++info->cu_index;
1219 }
1220
1221 /* Store value of each symbol. */
1222 std::unordered_map<c_str_view, std::set<symbol_value>, c_str_view_hasher>
1223 m_name_to_value_set;
1224
1225 /* Tables of DWARF-5 .debug_names. They are in object file byte
1226 order. */
1227 std::vector<uint32_t> m_bucket_table;
1228 std::vector<uint32_t> m_hash_table;
1229
1230 const bfd_endian m_dwarf5_byte_order;
1231 dwarf_tmpl<uint32_t> m_dwarf32;
1232 dwarf_tmpl<uint64_t> m_dwarf64;
1233 dwarf &m_dwarf;
1234 offset_vec &m_name_table_string_offs, &m_name_table_entry_offs;
1235 debug_str_lookup m_debugstrlookup;
1236
1237 /* Map each used .debug_names abbreviation tag parameter to its
1238 index value. */
1239 std::unordered_map<index_key, int, index_key_hasher> m_indexkey_to_idx;
1240
1241 /* Next unused .debug_names abbreviation tag for
1242 m_indexkey_to_idx. */
1243 int m_idx_next = 1;
1244
1245 /* .debug_names abbreviation table. */
1246 data_buf m_abbrev_table;
1247
1248 /* .debug_names entry pool. */
1249 data_buf m_entry_pool;
1250 };
1251
1252 /* Return iff any of the needed offsets does not fit into 32-bit
1253 .debug_names section. */
1254
1255 static bool
1256 check_dwarf64_offsets (struct dwarf2_per_objfile *dwarf2_per_objfile)
1257 {
1258 for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
1259 {
1260 if (to_underlying (per_cu->sect_off) >= (static_cast<uint64_t> (1) << 32))
1261 return true;
1262 }
1263 for (const signatured_type *sigtype : dwarf2_per_objfile->all_type_units)
1264 {
1265 const dwarf2_per_cu_data &per_cu = sigtype->per_cu;
1266
1267 if (to_underlying (per_cu.sect_off) >= (static_cast<uint64_t> (1) << 32))
1268 return true;
1269 }
1270 return false;
1271 }
1272
1273 /* The psyms_seen set is potentially going to be largish (~40k
1274 elements when indexing a -g3 build of GDB itself). Estimate the
1275 number of elements in order to avoid too many rehashes, which
1276 require rebuilding buckets and thus many trips to
1277 malloc/free. */
1278
1279 static size_t
1280 psyms_seen_size (struct dwarf2_per_objfile *dwarf2_per_objfile)
1281 {
1282 size_t psyms_count = 0;
1283 for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
1284 {
1285 struct partial_symtab *psymtab = per_cu->v.psymtab;
1286
1287 if (psymtab != NULL && psymtab->user == NULL)
1288 recursively_count_psymbols (psymtab, psyms_count);
1289 }
1290 /* Generating an index for gdb itself shows a ratio of
1291 TOTAL_SEEN_SYMS/UNIQUE_SYMS or ~5. 4 seems like a good bet. */
1292 return psyms_count / 4;
1293 }
1294
1295 /* Write new .gdb_index section for OBJFILE into OUT_FILE.
1296 Return how many bytes were expected to be written into OUT_FILE. */
1297
1298 static size_t
1299 write_gdbindex (struct dwarf2_per_objfile *dwarf2_per_objfile, FILE *out_file)
1300 {
1301 struct objfile *objfile = dwarf2_per_objfile->objfile;
1302 mapped_symtab symtab;
1303 data_buf cu_list;
1304
1305 /* While we're scanning CU's create a table that maps a psymtab pointer
1306 (which is what addrmap records) to its index (which is what is recorded
1307 in the index file). This will later be needed to write the address
1308 table. */
1309 psym_index_map cu_index_htab;
1310 cu_index_htab.reserve (dwarf2_per_objfile->all_comp_units.size ());
1311
1312 /* The CU list is already sorted, so we don't need to do additional
1313 work here. Also, the debug_types entries do not appear in
1314 all_comp_units, but only in their own hash table. */
1315
1316 std::unordered_set<partial_symbol *> psyms_seen
1317 (psyms_seen_size (dwarf2_per_objfile));
1318 for (int i = 0; i < dwarf2_per_objfile->all_comp_units.size (); ++i)
1319 {
1320 struct dwarf2_per_cu_data *per_cu
1321 = dwarf2_per_objfile->all_comp_units[i];
1322 struct partial_symtab *psymtab = per_cu->v.psymtab;
1323
1324 /* CU of a shared file from 'dwz -m' may be unused by this main file.
1325 It may be referenced from a local scope but in such case it does not
1326 need to be present in .gdb_index. */
1327 if (psymtab == NULL)
1328 continue;
1329
1330 if (psymtab->user == NULL)
1331 recursively_write_psymbols (objfile, psymtab, &symtab,
1332 psyms_seen, i);
1333
1334 const auto insertpair = cu_index_htab.emplace (psymtab, i);
1335 gdb_assert (insertpair.second);
1336
1337 cu_list.append_uint (8, BFD_ENDIAN_LITTLE,
1338 to_underlying (per_cu->sect_off));
1339 cu_list.append_uint (8, BFD_ENDIAN_LITTLE, per_cu->length);
1340 }
1341
1342 /* Dump the address map. */
1343 data_buf addr_vec;
1344 write_address_map (objfile, addr_vec, cu_index_htab);
1345
1346 /* Write out the .debug_type entries, if any. */
1347 data_buf types_cu_list;
1348 if (dwarf2_per_objfile->signatured_types)
1349 {
1350 signatured_type_index_data sig_data (types_cu_list,
1351 psyms_seen);
1352
1353 sig_data.objfile = objfile;
1354 sig_data.symtab = &symtab;
1355 sig_data.cu_index = dwarf2_per_objfile->all_comp_units.size ();
1356 htab_traverse_noresize (dwarf2_per_objfile->signatured_types,
1357 write_one_signatured_type, &sig_data);
1358 }
1359
1360 /* Now that we've processed all symbols we can shrink their cu_indices
1361 lists. */
1362 uniquify_cu_indices (&symtab);
1363
1364 data_buf symtab_vec, constant_pool;
1365 write_hash_table (&symtab, symtab_vec, constant_pool);
1366
1367 data_buf contents;
1368 const offset_type size_of_contents = 6 * sizeof (offset_type);
1369 offset_type total_len = size_of_contents;
1370
1371 /* The version number. */
1372 contents.append_data (MAYBE_SWAP (8));
1373
1374 /* The offset of the CU list from the start of the file. */
1375 contents.append_data (MAYBE_SWAP (total_len));
1376 total_len += cu_list.size ();
1377
1378 /* The offset of the types CU list from the start of the file. */
1379 contents.append_data (MAYBE_SWAP (total_len));
1380 total_len += types_cu_list.size ();
1381
1382 /* The offset of the address table from the start of the file. */
1383 contents.append_data (MAYBE_SWAP (total_len));
1384 total_len += addr_vec.size ();
1385
1386 /* The offset of the symbol table from the start of the file. */
1387 contents.append_data (MAYBE_SWAP (total_len));
1388 total_len += symtab_vec.size ();
1389
1390 /* The offset of the constant pool from the start of the file. */
1391 contents.append_data (MAYBE_SWAP (total_len));
1392 total_len += constant_pool.size ();
1393
1394 gdb_assert (contents.size () == size_of_contents);
1395
1396 contents.file_write (out_file);
1397 cu_list.file_write (out_file);
1398 types_cu_list.file_write (out_file);
1399 addr_vec.file_write (out_file);
1400 symtab_vec.file_write (out_file);
1401 constant_pool.file_write (out_file);
1402
1403 return total_len;
1404 }
1405
1406 /* DWARF-5 augmentation string for GDB's DW_IDX_GNU_* extension. */
1407 static const gdb_byte dwarf5_gdb_augmentation[] = { 'G', 'D', 'B', 0 };
1408
1409 /* Write a new .debug_names section for OBJFILE into OUT_FILE, write
1410 needed addition to .debug_str section to OUT_FILE_STR. Return how
1411 many bytes were expected to be written into OUT_FILE. */
1412
1413 static size_t
1414 write_debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile,
1415 FILE *out_file, FILE *out_file_str)
1416 {
1417 const bool dwarf5_is_dwarf64 = check_dwarf64_offsets (dwarf2_per_objfile);
1418 struct objfile *objfile = dwarf2_per_objfile->objfile;
1419 const enum bfd_endian dwarf5_byte_order
1420 = gdbarch_byte_order (get_objfile_arch (objfile));
1421
1422 /* The CU list is already sorted, so we don't need to do additional
1423 work here. Also, the debug_types entries do not appear in
1424 all_comp_units, but only in their own hash table. */
1425 data_buf cu_list;
1426 debug_names nametable (dwarf2_per_objfile, dwarf5_is_dwarf64,
1427 dwarf5_byte_order);
1428 std::unordered_set<partial_symbol *>
1429 psyms_seen (psyms_seen_size (dwarf2_per_objfile));
1430 for (int i = 0; i < dwarf2_per_objfile->all_comp_units.size (); ++i)
1431 {
1432 const dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->all_comp_units[i];
1433 partial_symtab *psymtab = per_cu->v.psymtab;
1434
1435 /* CU of a shared file from 'dwz -m' may be unused by this main
1436 file. It may be referenced from a local scope but in such
1437 case it does not need to be present in .debug_names. */
1438 if (psymtab == NULL)
1439 continue;
1440
1441 if (psymtab->user == NULL)
1442 nametable.recursively_write_psymbols (objfile, psymtab, psyms_seen, i);
1443
1444 cu_list.append_uint (nametable.dwarf5_offset_size (), dwarf5_byte_order,
1445 to_underlying (per_cu->sect_off));
1446 }
1447
1448 /* Write out the .debug_type entries, if any. */
1449 data_buf types_cu_list;
1450 if (dwarf2_per_objfile->signatured_types)
1451 {
1452 debug_names::write_one_signatured_type_data sig_data (nametable,
1453 signatured_type_index_data (types_cu_list, psyms_seen));
1454
1455 sig_data.info.objfile = objfile;
1456 /* It is used only for gdb_index. */
1457 sig_data.info.symtab = nullptr;
1458 sig_data.info.cu_index = 0;
1459 htab_traverse_noresize (dwarf2_per_objfile->signatured_types,
1460 debug_names::write_one_signatured_type,
1461 &sig_data);
1462 }
1463
1464 nametable.build ();
1465
1466 /* No addr_vec - DWARF-5 uses .debug_aranges generated by GCC. */
1467
1468 const offset_type bytes_of_header
1469 = ((dwarf5_is_dwarf64 ? 12 : 4)
1470 + 2 + 2 + 7 * 4
1471 + sizeof (dwarf5_gdb_augmentation));
1472 size_t expected_bytes = 0;
1473 expected_bytes += bytes_of_header;
1474 expected_bytes += cu_list.size ();
1475 expected_bytes += types_cu_list.size ();
1476 expected_bytes += nametable.bytes ();
1477 data_buf header;
1478
1479 if (!dwarf5_is_dwarf64)
1480 {
1481 const uint64_t size64 = expected_bytes - 4;
1482 gdb_assert (size64 < 0xfffffff0);
1483 header.append_uint (4, dwarf5_byte_order, size64);
1484 }
1485 else
1486 {
1487 header.append_uint (4, dwarf5_byte_order, 0xffffffff);
1488 header.append_uint (8, dwarf5_byte_order, expected_bytes - 12);
1489 }
1490
1491 /* The version number. */
1492 header.append_uint (2, dwarf5_byte_order, 5);
1493
1494 /* Padding. */
1495 header.append_uint (2, dwarf5_byte_order, 0);
1496
1497 /* comp_unit_count - The number of CUs in the CU list. */
1498 header.append_uint (4, dwarf5_byte_order,
1499 dwarf2_per_objfile->all_comp_units.size ());
1500
1501 /* local_type_unit_count - The number of TUs in the local TU
1502 list. */
1503 header.append_uint (4, dwarf5_byte_order,
1504 dwarf2_per_objfile->all_type_units.size ());
1505
1506 /* foreign_type_unit_count - The number of TUs in the foreign TU
1507 list. */
1508 header.append_uint (4, dwarf5_byte_order, 0);
1509
1510 /* bucket_count - The number of hash buckets in the hash lookup
1511 table. */
1512 header.append_uint (4, dwarf5_byte_order, nametable.bucket_count ());
1513
1514 /* name_count - The number of unique names in the index. */
1515 header.append_uint (4, dwarf5_byte_order, nametable.name_count ());
1516
1517 /* abbrev_table_size - The size in bytes of the abbreviations
1518 table. */
1519 header.append_uint (4, dwarf5_byte_order, nametable.abbrev_table_bytes ());
1520
1521 /* augmentation_string_size - The size in bytes of the augmentation
1522 string. This value is rounded up to a multiple of 4. */
1523 static_assert (sizeof (dwarf5_gdb_augmentation) % 4 == 0, "");
1524 header.append_uint (4, dwarf5_byte_order, sizeof (dwarf5_gdb_augmentation));
1525 header.append_data (dwarf5_gdb_augmentation);
1526
1527 gdb_assert (header.size () == bytes_of_header);
1528
1529 header.file_write (out_file);
1530 cu_list.file_write (out_file);
1531 types_cu_list.file_write (out_file);
1532 nametable.file_write (out_file, out_file_str);
1533
1534 return expected_bytes;
1535 }
1536
1537 /* Assert that FILE's size is EXPECTED_SIZE. Assumes file's seek
1538 position is at the end of the file. */
1539
1540 static void
1541 assert_file_size (FILE *file, const char *filename, size_t expected_size)
1542 {
1543 const auto file_size = ftell (file);
1544 if (file_size == -1)
1545 error (_("Can't get `%s' size"), filename);
1546 gdb_assert (file_size == expected_size);
1547 }
1548
1549 /* Create an index file for OBJFILE in the directory DIR. */
1550
1551 static void
1552 write_psymtabs_to_index (struct dwarf2_per_objfile *dwarf2_per_objfile,
1553 const char *dir,
1554 dw_index_kind index_kind)
1555 {
1556 struct objfile *objfile = dwarf2_per_objfile->objfile;
1557
1558 if (dwarf2_per_objfile->using_index)
1559 error (_("Cannot use an index to create the index"));
1560
1561 if (VEC_length (dwarf2_section_info_def, dwarf2_per_objfile->types) > 1)
1562 error (_("Cannot make an index when the file has multiple .debug_types sections"));
1563
1564 if (!objfile->psymtabs || !objfile->psymtabs_addrmap)
1565 return;
1566
1567 struct stat st;
1568 if (stat (objfile_name (objfile), &st) < 0)
1569 perror_with_name (objfile_name (objfile));
1570
1571 std::string filename (std::string (dir) + SLASH_STRING
1572 + lbasename (objfile_name (objfile))
1573 + (index_kind == dw_index_kind::DEBUG_NAMES
1574 ? INDEX5_SUFFIX : INDEX4_SUFFIX));
1575
1576 FILE *out_file = gdb_fopen_cloexec (filename.c_str (), "wb").release ();
1577 if (!out_file)
1578 error (_("Can't open `%s' for writing"), filename.c_str ());
1579
1580 /* Order matters here; we want FILE to be closed before FILENAME is
1581 unlinked, because on MS-Windows one cannot delete a file that is
1582 still open. (Don't call anything here that might throw until
1583 file_closer is created.) */
1584 gdb::unlinker unlink_file (filename.c_str ());
1585 gdb_file_up close_out_file (out_file);
1586
1587 if (index_kind == dw_index_kind::DEBUG_NAMES)
1588 {
1589 std::string filename_str (std::string (dir) + SLASH_STRING
1590 + lbasename (objfile_name (objfile))
1591 + DEBUG_STR_SUFFIX);
1592 FILE *out_file_str
1593 = gdb_fopen_cloexec (filename_str.c_str (), "wb").release ();
1594 if (!out_file_str)
1595 error (_("Can't open `%s' for writing"), filename_str.c_str ());
1596 gdb::unlinker unlink_file_str (filename_str.c_str ());
1597 gdb_file_up close_out_file_str (out_file_str);
1598
1599 const size_t total_len
1600 = write_debug_names (dwarf2_per_objfile, out_file, out_file_str);
1601 assert_file_size (out_file, filename.c_str (), total_len);
1602
1603 /* We want to keep the file .debug_str file too. */
1604 unlink_file_str.keep ();
1605 }
1606 else
1607 {
1608 const size_t total_len
1609 = write_gdbindex (dwarf2_per_objfile, out_file);
1610 assert_file_size (out_file, filename.c_str (), total_len);
1611 }
1612
1613 /* We want to keep the file. */
1614 unlink_file.keep ();
1615 }
1616
1617 /* Implementation of the `save gdb-index' command.
1618
1619 Note that the .gdb_index file format used by this command is
1620 documented in the GDB manual. Any changes here must be documented
1621 there. */
1622
1623 static void
1624 save_gdb_index_command (const char *arg, int from_tty)
1625 {
1626 struct objfile *objfile;
1627 const char dwarf5space[] = "-dwarf-5 ";
1628 dw_index_kind index_kind = dw_index_kind::GDB_INDEX;
1629
1630 if (!arg)
1631 arg = "";
1632
1633 arg = skip_spaces (arg);
1634 if (strncmp (arg, dwarf5space, strlen (dwarf5space)) == 0)
1635 {
1636 index_kind = dw_index_kind::DEBUG_NAMES;
1637 arg += strlen (dwarf5space);
1638 arg = skip_spaces (arg);
1639 }
1640
1641 if (!*arg)
1642 error (_("usage: save gdb-index [-dwarf-5] DIRECTORY"));
1643
1644 ALL_OBJFILES (objfile)
1645 {
1646 struct stat st;
1647
1648 /* If the objfile does not correspond to an actual file, skip it. */
1649 if (stat (objfile_name (objfile), &st) < 0)
1650 continue;
1651
1652 struct dwarf2_per_objfile *dwarf2_per_objfile
1653 = get_dwarf2_per_objfile (objfile);
1654
1655 if (dwarf2_per_objfile != NULL)
1656 {
1657 TRY
1658 {
1659 write_psymtabs_to_index (dwarf2_per_objfile, arg, index_kind);
1660 }
1661 CATCH (except, RETURN_MASK_ERROR)
1662 {
1663 exception_fprintf (gdb_stderr, except,
1664 _("Error while writing index for `%s': "),
1665 objfile_name (objfile));
1666 }
1667 END_CATCH
1668 }
1669
1670 }
1671 }
1672
1673 void
1674 _initialize_dwarf_index_write ()
1675 {
1676 cmd_list_element *c = add_cmd ("gdb-index", class_files,
1677 save_gdb_index_command, _("\
1678 Save a gdb-index file.\n\
1679 Usage: save gdb-index [-dwarf-5] DIRECTORY\n\
1680 \n\
1681 No options create one file with .gdb-index extension for pre-DWARF-5\n\
1682 compatible .gdb_index section. With -dwarf-5 creates two files with\n\
1683 extension .debug_names and .debug_str for DWARF-5 .debug_names section."),
1684 &save_cmdlist);
1685 set_cmd_completer (c, filename_completer);
1686 }
This page took 0.064064 seconds and 4 git commands to generate.