Make dwarf2_per_objfile::all_comp_units an std::vector
[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[psymtab->globals_offset],
592 psymtab->n_global_syms, info->cu_index,
593 0);
594 write_psymbols (info->symtab,
595 info->psyms_seen,
596 &info->objfile->static_psymbols[psymtab->statics_offset],
597 psymtab->n_static_syms, info->cu_index,
598 1);
599
600 info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
601 to_underlying (entry->per_cu.sect_off));
602 info->types_list.append_uint (8, BFD_ENDIAN_LITTLE,
603 to_underlying (entry->type_offset_in_tu));
604 info->types_list.append_uint (8, BFD_ENDIAN_LITTLE, entry->signature);
605
606 ++info->cu_index;
607
608 return 1;
609 }
610
611 /* Recurse into all "included" dependencies and count their symbols as
612 if they appeared in this psymtab. */
613
614 static void
615 recursively_count_psymbols (struct partial_symtab *psymtab,
616 size_t &psyms_seen)
617 {
618 for (int i = 0; i < psymtab->number_of_dependencies; ++i)
619 if (psymtab->dependencies[i]->user != NULL)
620 recursively_count_psymbols (psymtab->dependencies[i],
621 psyms_seen);
622
623 psyms_seen += psymtab->n_global_syms;
624 psyms_seen += psymtab->n_static_syms;
625 }
626
627 /* Recurse into all "included" dependencies and write their symbols as
628 if they appeared in this psymtab. */
629
630 static void
631 recursively_write_psymbols (struct objfile *objfile,
632 struct partial_symtab *psymtab,
633 struct mapped_symtab *symtab,
634 std::unordered_set<partial_symbol *> &psyms_seen,
635 offset_type cu_index)
636 {
637 int i;
638
639 for (i = 0; i < psymtab->number_of_dependencies; ++i)
640 if (psymtab->dependencies[i]->user != NULL)
641 recursively_write_psymbols (objfile, psymtab->dependencies[i],
642 symtab, psyms_seen, cu_index);
643
644 write_psymbols (symtab,
645 psyms_seen,
646 &objfile->global_psymbols[psymtab->globals_offset],
647 psymtab->n_global_syms, cu_index,
648 0);
649 write_psymbols (symtab,
650 psyms_seen,
651 &objfile->static_psymbols[psymtab->statics_offset],
652 psymtab->n_static_syms, cu_index,
653 1);
654 }
655
656 /* DWARF-5 .debug_names builder. */
657 class debug_names
658 {
659 public:
660 debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile, bool is_dwarf64,
661 bfd_endian dwarf5_byte_order)
662 : m_dwarf5_byte_order (dwarf5_byte_order),
663 m_dwarf32 (dwarf5_byte_order),
664 m_dwarf64 (dwarf5_byte_order),
665 m_dwarf (is_dwarf64
666 ? static_cast<dwarf &> (m_dwarf64)
667 : static_cast<dwarf &> (m_dwarf32)),
668 m_name_table_string_offs (m_dwarf.name_table_string_offs),
669 m_name_table_entry_offs (m_dwarf.name_table_entry_offs),
670 m_debugstrlookup (dwarf2_per_objfile)
671 {}
672
673 int dwarf5_offset_size () const
674 {
675 const bool dwarf5_is_dwarf64 = &m_dwarf == &m_dwarf64;
676 return dwarf5_is_dwarf64 ? 8 : 4;
677 }
678
679 /* Is this symbol from DW_TAG_compile_unit or DW_TAG_type_unit? */
680 enum class unit_kind { cu, tu };
681
682 /* Insert one symbol. */
683 void insert (const partial_symbol *psym, int cu_index, bool is_static,
684 unit_kind kind)
685 {
686 const int dwarf_tag = psymbol_tag (psym);
687 if (dwarf_tag == 0)
688 return;
689 const char *const name = SYMBOL_SEARCH_NAME (psym);
690 const auto insertpair
691 = m_name_to_value_set.emplace (c_str_view (name),
692 std::set<symbol_value> ());
693 std::set<symbol_value> &value_set = insertpair.first->second;
694 value_set.emplace (symbol_value (dwarf_tag, cu_index, is_static, kind));
695 }
696
697 /* Build all the tables. All symbols must be already inserted.
698 This function does not call file_write, caller has to do it
699 afterwards. */
700 void build ()
701 {
702 /* Verify the build method has not be called twice. */
703 gdb_assert (m_abbrev_table.empty ());
704 const size_t name_count = m_name_to_value_set.size ();
705 m_bucket_table.resize
706 (std::pow (2, std::ceil (std::log2 (name_count * 4 / 3))));
707 m_hash_table.reserve (name_count);
708 m_name_table_string_offs.reserve (name_count);
709 m_name_table_entry_offs.reserve (name_count);
710
711 /* Map each hash of symbol to its name and value. */
712 struct hash_it_pair
713 {
714 uint32_t hash;
715 decltype (m_name_to_value_set)::const_iterator it;
716 };
717 std::vector<std::forward_list<hash_it_pair>> bucket_hash;
718 bucket_hash.resize (m_bucket_table.size ());
719 for (decltype (m_name_to_value_set)::const_iterator it
720 = m_name_to_value_set.cbegin ();
721 it != m_name_to_value_set.cend ();
722 ++it)
723 {
724 const char *const name = it->first.c_str ();
725 const uint32_t hash = dwarf5_djb_hash (name);
726 hash_it_pair hashitpair;
727 hashitpair.hash = hash;
728 hashitpair.it = it;
729 auto &slot = bucket_hash[hash % bucket_hash.size()];
730 slot.push_front (std::move (hashitpair));
731 }
732 for (size_t bucket_ix = 0; bucket_ix < bucket_hash.size (); ++bucket_ix)
733 {
734 const std::forward_list<hash_it_pair> &hashitlist
735 = bucket_hash[bucket_ix];
736 if (hashitlist.empty ())
737 continue;
738 uint32_t &bucket_slot = m_bucket_table[bucket_ix];
739 /* The hashes array is indexed starting at 1. */
740 store_unsigned_integer (reinterpret_cast<gdb_byte *> (&bucket_slot),
741 sizeof (bucket_slot), m_dwarf5_byte_order,
742 m_hash_table.size () + 1);
743 for (const hash_it_pair &hashitpair : hashitlist)
744 {
745 m_hash_table.push_back (0);
746 store_unsigned_integer (reinterpret_cast<gdb_byte *>
747 (&m_hash_table.back ()),
748 sizeof (m_hash_table.back ()),
749 m_dwarf5_byte_order, hashitpair.hash);
750 const c_str_view &name = hashitpair.it->first;
751 const std::set<symbol_value> &value_set = hashitpair.it->second;
752 m_name_table_string_offs.push_back_reorder
753 (m_debugstrlookup.lookup (name.c_str ()));
754 m_name_table_entry_offs.push_back_reorder (m_entry_pool.size ());
755 gdb_assert (!value_set.empty ());
756 for (const symbol_value &value : value_set)
757 {
758 int &idx = m_indexkey_to_idx[index_key (value.dwarf_tag,
759 value.is_static,
760 value.kind)];
761 if (idx == 0)
762 {
763 idx = m_idx_next++;
764 m_abbrev_table.append_unsigned_leb128 (idx);
765 m_abbrev_table.append_unsigned_leb128 (value.dwarf_tag);
766 m_abbrev_table.append_unsigned_leb128
767 (value.kind == unit_kind::cu ? DW_IDX_compile_unit
768 : DW_IDX_type_unit);
769 m_abbrev_table.append_unsigned_leb128 (DW_FORM_udata);
770 m_abbrev_table.append_unsigned_leb128 (value.is_static
771 ? DW_IDX_GNU_internal
772 : DW_IDX_GNU_external);
773 m_abbrev_table.append_unsigned_leb128 (DW_FORM_flag_present);
774
775 /* Terminate attributes list. */
776 m_abbrev_table.append_unsigned_leb128 (0);
777 m_abbrev_table.append_unsigned_leb128 (0);
778 }
779
780 m_entry_pool.append_unsigned_leb128 (idx);
781 m_entry_pool.append_unsigned_leb128 (value.cu_index);
782 }
783
784 /* Terminate the list of CUs. */
785 m_entry_pool.append_unsigned_leb128 (0);
786 }
787 }
788 gdb_assert (m_hash_table.size () == name_count);
789
790 /* Terminate tags list. */
791 m_abbrev_table.append_unsigned_leb128 (0);
792 }
793
794 /* Return .debug_names bucket count. This must be called only after
795 calling the build method. */
796 uint32_t bucket_count () const
797 {
798 /* Verify the build method has been already called. */
799 gdb_assert (!m_abbrev_table.empty ());
800 const uint32_t retval = m_bucket_table.size ();
801
802 /* Check for overflow. */
803 gdb_assert (retval == m_bucket_table.size ());
804 return retval;
805 }
806
807 /* Return .debug_names names count. This must be called only after
808 calling the build method. */
809 uint32_t name_count () const
810 {
811 /* Verify the build method has been already called. */
812 gdb_assert (!m_abbrev_table.empty ());
813 const uint32_t retval = m_hash_table.size ();
814
815 /* Check for overflow. */
816 gdb_assert (retval == m_hash_table.size ());
817 return retval;
818 }
819
820 /* Return number of bytes of .debug_names abbreviation table. This
821 must be called only after calling the build method. */
822 uint32_t abbrev_table_bytes () const
823 {
824 gdb_assert (!m_abbrev_table.empty ());
825 return m_abbrev_table.size ();
826 }
827
828 /* Recurse into all "included" dependencies and store their symbols
829 as if they appeared in this psymtab. */
830 void recursively_write_psymbols
831 (struct objfile *objfile,
832 struct partial_symtab *psymtab,
833 std::unordered_set<partial_symbol *> &psyms_seen,
834 int cu_index)
835 {
836 for (int i = 0; i < psymtab->number_of_dependencies; ++i)
837 if (psymtab->dependencies[i]->user != NULL)
838 recursively_write_psymbols (objfile, psymtab->dependencies[i],
839 psyms_seen, cu_index);
840
841 write_psymbols (psyms_seen,
842 &objfile->global_psymbols[psymtab->globals_offset],
843 psymtab->n_global_syms, cu_index, false, unit_kind::cu);
844 write_psymbols (psyms_seen,
845 &objfile->static_psymbols[psymtab->statics_offset],
846 psymtab->n_static_syms, cu_index, true, unit_kind::cu);
847 }
848
849 /* Return number of bytes the .debug_names section will have. This
850 must be called only after calling the build method. */
851 size_t bytes () const
852 {
853 /* Verify the build method has been already called. */
854 gdb_assert (!m_abbrev_table.empty ());
855 size_t expected_bytes = 0;
856 expected_bytes += m_bucket_table.size () * sizeof (m_bucket_table[0]);
857 expected_bytes += m_hash_table.size () * sizeof (m_hash_table[0]);
858 expected_bytes += m_name_table_string_offs.bytes ();
859 expected_bytes += m_name_table_entry_offs.bytes ();
860 expected_bytes += m_abbrev_table.size ();
861 expected_bytes += m_entry_pool.size ();
862 return expected_bytes;
863 }
864
865 /* Write .debug_names to FILE_NAMES and .debug_str addition to
866 FILE_STR. This must be called only after calling the build
867 method. */
868 void file_write (FILE *file_names, FILE *file_str) const
869 {
870 /* Verify the build method has been already called. */
871 gdb_assert (!m_abbrev_table.empty ());
872 ::file_write (file_names, m_bucket_table);
873 ::file_write (file_names, m_hash_table);
874 m_name_table_string_offs.file_write (file_names);
875 m_name_table_entry_offs.file_write (file_names);
876 m_abbrev_table.file_write (file_names);
877 m_entry_pool.file_write (file_names);
878 m_debugstrlookup.file_write (file_str);
879 }
880
881 /* A helper user data for write_one_signatured_type. */
882 class write_one_signatured_type_data
883 {
884 public:
885 write_one_signatured_type_data (debug_names &nametable_,
886 signatured_type_index_data &&info_)
887 : nametable (nametable_), info (std::move (info_))
888 {}
889 debug_names &nametable;
890 struct signatured_type_index_data info;
891 };
892
893 /* A helper function to pass write_one_signatured_type to
894 htab_traverse_noresize. */
895 static int
896 write_one_signatured_type (void **slot, void *d)
897 {
898 write_one_signatured_type_data *data = (write_one_signatured_type_data *) d;
899 struct signatured_type_index_data *info = &data->info;
900 struct signatured_type *entry = (struct signatured_type *) *slot;
901
902 data->nametable.write_one_signatured_type (entry, info);
903
904 return 1;
905 }
906
907 private:
908
909 /* Storage for symbol names mapping them to their .debug_str section
910 offsets. */
911 class debug_str_lookup
912 {
913 public:
914
915 /* Object costructor to be called for current DWARF2_PER_OBJFILE.
916 All .debug_str section strings are automatically stored. */
917 debug_str_lookup (struct dwarf2_per_objfile *dwarf2_per_objfile)
918 : m_abfd (dwarf2_per_objfile->objfile->obfd),
919 m_dwarf2_per_objfile (dwarf2_per_objfile)
920 {
921 dwarf2_read_section (dwarf2_per_objfile->objfile,
922 &dwarf2_per_objfile->str);
923 if (dwarf2_per_objfile->str.buffer == NULL)
924 return;
925 for (const gdb_byte *data = dwarf2_per_objfile->str.buffer;
926 data < (dwarf2_per_objfile->str.buffer
927 + dwarf2_per_objfile->str.size);)
928 {
929 const char *const s = reinterpret_cast<const char *> (data);
930 const auto insertpair
931 = m_str_table.emplace (c_str_view (s),
932 data - dwarf2_per_objfile->str.buffer);
933 if (!insertpair.second)
934 complaint (&symfile_complaints,
935 _("Duplicate string \"%s\" in "
936 ".debug_str section [in module %s]"),
937 s, bfd_get_filename (m_abfd));
938 data += strlen (s) + 1;
939 }
940 }
941
942 /* Return offset of symbol name S in the .debug_str section. Add
943 such symbol to the section's end if it does not exist there
944 yet. */
945 size_t lookup (const char *s)
946 {
947 const auto it = m_str_table.find (c_str_view (s));
948 if (it != m_str_table.end ())
949 return it->second;
950 const size_t offset = (m_dwarf2_per_objfile->str.size
951 + m_str_add_buf.size ());
952 m_str_table.emplace (c_str_view (s), offset);
953 m_str_add_buf.append_cstr0 (s);
954 return offset;
955 }
956
957 /* Append the end of the .debug_str section to FILE. */
958 void file_write (FILE *file) const
959 {
960 m_str_add_buf.file_write (file);
961 }
962
963 private:
964 std::unordered_map<c_str_view, size_t, c_str_view_hasher> m_str_table;
965 bfd *const m_abfd;
966 struct dwarf2_per_objfile *m_dwarf2_per_objfile;
967
968 /* Data to add at the end of .debug_str for new needed symbol names. */
969 data_buf m_str_add_buf;
970 };
971
972 /* Container to map used DWARF tags to their .debug_names abbreviation
973 tags. */
974 class index_key
975 {
976 public:
977 index_key (int dwarf_tag_, bool is_static_, unit_kind kind_)
978 : dwarf_tag (dwarf_tag_), is_static (is_static_), kind (kind_)
979 {
980 }
981
982 bool
983 operator== (const index_key &other) const
984 {
985 return (dwarf_tag == other.dwarf_tag && is_static == other.is_static
986 && kind == other.kind);
987 }
988
989 const int dwarf_tag;
990 const bool is_static;
991 const unit_kind kind;
992 };
993
994 /* Provide std::unordered_map::hasher for index_key. */
995 class index_key_hasher
996 {
997 public:
998 size_t
999 operator () (const index_key &key) const
1000 {
1001 return (std::hash<int>() (key.dwarf_tag) << 1) | key.is_static;
1002 }
1003 };
1004
1005 /* Parameters of one symbol entry. */
1006 class symbol_value
1007 {
1008 public:
1009 const int dwarf_tag, cu_index;
1010 const bool is_static;
1011 const unit_kind kind;
1012
1013 symbol_value (int dwarf_tag_, int cu_index_, bool is_static_,
1014 unit_kind kind_)
1015 : dwarf_tag (dwarf_tag_), cu_index (cu_index_), is_static (is_static_),
1016 kind (kind_)
1017 {}
1018
1019 bool
1020 operator< (const symbol_value &other) const
1021 {
1022 #define X(n) \
1023 do \
1024 { \
1025 if (n < other.n) \
1026 return true; \
1027 if (n > other.n) \
1028 return false; \
1029 } \
1030 while (0)
1031 X (dwarf_tag);
1032 X (is_static);
1033 X (kind);
1034 X (cu_index);
1035 #undef X
1036 return false;
1037 }
1038 };
1039
1040 /* Abstract base class to unify DWARF-32 and DWARF-64 name table
1041 output. */
1042 class offset_vec
1043 {
1044 protected:
1045 const bfd_endian dwarf5_byte_order;
1046 public:
1047 explicit offset_vec (bfd_endian dwarf5_byte_order_)
1048 : dwarf5_byte_order (dwarf5_byte_order_)
1049 {}
1050
1051 /* Call std::vector::reserve for NELEM elements. */
1052 virtual void reserve (size_t nelem) = 0;
1053
1054 /* Call std::vector::push_back with store_unsigned_integer byte
1055 reordering for ELEM. */
1056 virtual void push_back_reorder (size_t elem) = 0;
1057
1058 /* Return expected output size in bytes. */
1059 virtual size_t bytes () const = 0;
1060
1061 /* Write name table to FILE. */
1062 virtual void file_write (FILE *file) const = 0;
1063 };
1064
1065 /* Template to unify DWARF-32 and DWARF-64 output. */
1066 template<typename OffsetSize>
1067 class offset_vec_tmpl : public offset_vec
1068 {
1069 public:
1070 explicit offset_vec_tmpl (bfd_endian dwarf5_byte_order_)
1071 : offset_vec (dwarf5_byte_order_)
1072 {}
1073
1074 /* Implement offset_vec::reserve. */
1075 void reserve (size_t nelem) override
1076 {
1077 m_vec.reserve (nelem);
1078 }
1079
1080 /* Implement offset_vec::push_back_reorder. */
1081 void push_back_reorder (size_t elem) override
1082 {
1083 m_vec.push_back (elem);
1084 /* Check for overflow. */
1085 gdb_assert (m_vec.back () == elem);
1086 store_unsigned_integer (reinterpret_cast<gdb_byte *> (&m_vec.back ()),
1087 sizeof (m_vec.back ()), dwarf5_byte_order, elem);
1088 }
1089
1090 /* Implement offset_vec::bytes. */
1091 size_t bytes () const override
1092 {
1093 return m_vec.size () * sizeof (m_vec[0]);
1094 }
1095
1096 /* Implement offset_vec::file_write. */
1097 void file_write (FILE *file) const override
1098 {
1099 ::file_write (file, m_vec);
1100 }
1101
1102 private:
1103 std::vector<OffsetSize> m_vec;
1104 };
1105
1106 /* Base class to unify DWARF-32 and DWARF-64 .debug_names output
1107 respecting name table width. */
1108 class dwarf
1109 {
1110 public:
1111 offset_vec &name_table_string_offs, &name_table_entry_offs;
1112
1113 dwarf (offset_vec &name_table_string_offs_,
1114 offset_vec &name_table_entry_offs_)
1115 : name_table_string_offs (name_table_string_offs_),
1116 name_table_entry_offs (name_table_entry_offs_)
1117 {
1118 }
1119 };
1120
1121 /* Template to unify DWARF-32 and DWARF-64 .debug_names output
1122 respecting name table width. */
1123 template<typename OffsetSize>
1124 class dwarf_tmpl : public dwarf
1125 {
1126 public:
1127 explicit dwarf_tmpl (bfd_endian dwarf5_byte_order_)
1128 : dwarf (m_name_table_string_offs, m_name_table_entry_offs),
1129 m_name_table_string_offs (dwarf5_byte_order_),
1130 m_name_table_entry_offs (dwarf5_byte_order_)
1131 {}
1132
1133 private:
1134 offset_vec_tmpl<OffsetSize> m_name_table_string_offs;
1135 offset_vec_tmpl<OffsetSize> m_name_table_entry_offs;
1136 };
1137
1138 /* Try to reconstruct original DWARF tag for given partial_symbol.
1139 This function is not DWARF-5 compliant but it is sufficient for
1140 GDB as a DWARF-5 index consumer. */
1141 static int psymbol_tag (const struct partial_symbol *psym)
1142 {
1143 domain_enum domain = PSYMBOL_DOMAIN (psym);
1144 enum address_class aclass = PSYMBOL_CLASS (psym);
1145
1146 switch (domain)
1147 {
1148 case VAR_DOMAIN:
1149 switch (aclass)
1150 {
1151 case LOC_BLOCK:
1152 return DW_TAG_subprogram;
1153 case LOC_TYPEDEF:
1154 return DW_TAG_typedef;
1155 case LOC_COMPUTED:
1156 case LOC_CONST_BYTES:
1157 case LOC_OPTIMIZED_OUT:
1158 case LOC_STATIC:
1159 return DW_TAG_variable;
1160 case LOC_CONST:
1161 /* Note: It's currently impossible to recognize psyms as enum values
1162 short of reading the type info. For now punt. */
1163 return DW_TAG_variable;
1164 default:
1165 /* There are other LOC_FOO values that one might want to classify
1166 as variables, but dwarf2read.c doesn't currently use them. */
1167 return DW_TAG_variable;
1168 }
1169 case STRUCT_DOMAIN:
1170 return DW_TAG_structure_type;
1171 default:
1172 return 0;
1173 }
1174 }
1175
1176 /* Call insert for all partial symbols and mark them in PSYMS_SEEN. */
1177 void write_psymbols (std::unordered_set<partial_symbol *> &psyms_seen,
1178 struct partial_symbol **psymp, int count, int cu_index,
1179 bool is_static, unit_kind kind)
1180 {
1181 for (; count-- > 0; ++psymp)
1182 {
1183 struct partial_symbol *psym = *psymp;
1184
1185 if (SYMBOL_LANGUAGE (psym) == language_ada)
1186 error (_("Ada is not currently supported by the index"));
1187
1188 /* Only add a given psymbol once. */
1189 if (psyms_seen.insert (psym).second)
1190 insert (psym, cu_index, is_static, kind);
1191 }
1192 }
1193
1194 /* A helper function that writes a single signatured_type
1195 to a debug_names. */
1196 void
1197 write_one_signatured_type (struct signatured_type *entry,
1198 struct signatured_type_index_data *info)
1199 {
1200 struct partial_symtab *psymtab = entry->per_cu.v.psymtab;
1201
1202 write_psymbols (info->psyms_seen,
1203 &info->objfile->global_psymbols[psymtab->globals_offset],
1204 psymtab->n_global_syms, info->cu_index, false,
1205 unit_kind::tu);
1206 write_psymbols (info->psyms_seen,
1207 &info->objfile->static_psymbols[psymtab->statics_offset],
1208 psymtab->n_static_syms, info->cu_index, true,
1209 unit_kind::tu);
1210
1211 info->types_list.append_uint (dwarf5_offset_size (), m_dwarf5_byte_order,
1212 to_underlying (entry->per_cu.sect_off));
1213
1214 ++info->cu_index;
1215 }
1216
1217 /* Store value of each symbol. */
1218 std::unordered_map<c_str_view, std::set<symbol_value>, c_str_view_hasher>
1219 m_name_to_value_set;
1220
1221 /* Tables of DWARF-5 .debug_names. They are in object file byte
1222 order. */
1223 std::vector<uint32_t> m_bucket_table;
1224 std::vector<uint32_t> m_hash_table;
1225
1226 const bfd_endian m_dwarf5_byte_order;
1227 dwarf_tmpl<uint32_t> m_dwarf32;
1228 dwarf_tmpl<uint64_t> m_dwarf64;
1229 dwarf &m_dwarf;
1230 offset_vec &m_name_table_string_offs, &m_name_table_entry_offs;
1231 debug_str_lookup m_debugstrlookup;
1232
1233 /* Map each used .debug_names abbreviation tag parameter to its
1234 index value. */
1235 std::unordered_map<index_key, int, index_key_hasher> m_indexkey_to_idx;
1236
1237 /* Next unused .debug_names abbreviation tag for
1238 m_indexkey_to_idx. */
1239 int m_idx_next = 1;
1240
1241 /* .debug_names abbreviation table. */
1242 data_buf m_abbrev_table;
1243
1244 /* .debug_names entry pool. */
1245 data_buf m_entry_pool;
1246 };
1247
1248 /* Return iff any of the needed offsets does not fit into 32-bit
1249 .debug_names section. */
1250
1251 static bool
1252 check_dwarf64_offsets (struct dwarf2_per_objfile *dwarf2_per_objfile)
1253 {
1254 for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
1255 {
1256 if (to_underlying (per_cu->sect_off) >= (static_cast<uint64_t> (1) << 32))
1257 return true;
1258 }
1259 for (int i = 0; i < dwarf2_per_objfile->n_type_units; ++i)
1260 {
1261 const signatured_type &sigtype = *dwarf2_per_objfile->all_type_units[i];
1262 const dwarf2_per_cu_data &per_cu = sigtype.per_cu;
1263
1264 if (to_underlying (per_cu.sect_off) >= (static_cast<uint64_t> (1) << 32))
1265 return true;
1266 }
1267 return false;
1268 }
1269
1270 /* The psyms_seen set is potentially going to be largish (~40k
1271 elements when indexing a -g3 build of GDB itself). Estimate the
1272 number of elements in order to avoid too many rehashes, which
1273 require rebuilding buckets and thus many trips to
1274 malloc/free. */
1275
1276 static size_t
1277 psyms_seen_size (struct dwarf2_per_objfile *dwarf2_per_objfile)
1278 {
1279 size_t psyms_count = 0;
1280 for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units)
1281 {
1282 struct partial_symtab *psymtab = per_cu->v.psymtab;
1283
1284 if (psymtab != NULL && psymtab->user == NULL)
1285 recursively_count_psymbols (psymtab, psyms_count);
1286 }
1287 /* Generating an index for gdb itself shows a ratio of
1288 TOTAL_SEEN_SYMS/UNIQUE_SYMS or ~5. 4 seems like a good bet. */
1289 return psyms_count / 4;
1290 }
1291
1292 /* Write new .gdb_index section for OBJFILE into OUT_FILE.
1293 Return how many bytes were expected to be written into OUT_FILE. */
1294
1295 static size_t
1296 write_gdbindex (struct dwarf2_per_objfile *dwarf2_per_objfile, FILE *out_file)
1297 {
1298 struct objfile *objfile = dwarf2_per_objfile->objfile;
1299 mapped_symtab symtab;
1300 data_buf cu_list;
1301
1302 /* While we're scanning CU's create a table that maps a psymtab pointer
1303 (which is what addrmap records) to its index (which is what is recorded
1304 in the index file). This will later be needed to write the address
1305 table. */
1306 psym_index_map cu_index_htab;
1307 cu_index_htab.reserve (dwarf2_per_objfile->all_comp_units.size ());
1308
1309 /* The CU list is already sorted, so we don't need to do additional
1310 work here. Also, the debug_types entries do not appear in
1311 all_comp_units, but only in their own hash table. */
1312
1313 std::unordered_set<partial_symbol *> psyms_seen
1314 (psyms_seen_size (dwarf2_per_objfile));
1315 for (int i = 0; i < dwarf2_per_objfile->all_comp_units.size (); ++i)
1316 {
1317 struct dwarf2_per_cu_data *per_cu
1318 = dwarf2_per_objfile->all_comp_units[i];
1319 struct partial_symtab *psymtab = per_cu->v.psymtab;
1320
1321 /* CU of a shared file from 'dwz -m' may be unused by this main file.
1322 It may be referenced from a local scope but in such case it does not
1323 need to be present in .gdb_index. */
1324 if (psymtab == NULL)
1325 continue;
1326
1327 if (psymtab->user == NULL)
1328 recursively_write_psymbols (objfile, psymtab, &symtab,
1329 psyms_seen, i);
1330
1331 const auto insertpair = cu_index_htab.emplace (psymtab, i);
1332 gdb_assert (insertpair.second);
1333
1334 cu_list.append_uint (8, BFD_ENDIAN_LITTLE,
1335 to_underlying (per_cu->sect_off));
1336 cu_list.append_uint (8, BFD_ENDIAN_LITTLE, per_cu->length);
1337 }
1338
1339 /* Dump the address map. */
1340 data_buf addr_vec;
1341 write_address_map (objfile, addr_vec, cu_index_htab);
1342
1343 /* Write out the .debug_type entries, if any. */
1344 data_buf types_cu_list;
1345 if (dwarf2_per_objfile->signatured_types)
1346 {
1347 signatured_type_index_data sig_data (types_cu_list,
1348 psyms_seen);
1349
1350 sig_data.objfile = objfile;
1351 sig_data.symtab = &symtab;
1352 sig_data.cu_index = dwarf2_per_objfile->all_comp_units.size ();
1353 htab_traverse_noresize (dwarf2_per_objfile->signatured_types,
1354 write_one_signatured_type, &sig_data);
1355 }
1356
1357 /* Now that we've processed all symbols we can shrink their cu_indices
1358 lists. */
1359 uniquify_cu_indices (&symtab);
1360
1361 data_buf symtab_vec, constant_pool;
1362 write_hash_table (&symtab, symtab_vec, constant_pool);
1363
1364 data_buf contents;
1365 const offset_type size_of_contents = 6 * sizeof (offset_type);
1366 offset_type total_len = size_of_contents;
1367
1368 /* The version number. */
1369 contents.append_data (MAYBE_SWAP (8));
1370
1371 /* The offset of the CU list from the start of the file. */
1372 contents.append_data (MAYBE_SWAP (total_len));
1373 total_len += cu_list.size ();
1374
1375 /* The offset of the types CU list from the start of the file. */
1376 contents.append_data (MAYBE_SWAP (total_len));
1377 total_len += types_cu_list.size ();
1378
1379 /* The offset of the address table from the start of the file. */
1380 contents.append_data (MAYBE_SWAP (total_len));
1381 total_len += addr_vec.size ();
1382
1383 /* The offset of the symbol table from the start of the file. */
1384 contents.append_data (MAYBE_SWAP (total_len));
1385 total_len += symtab_vec.size ();
1386
1387 /* The offset of the constant pool from the start of the file. */
1388 contents.append_data (MAYBE_SWAP (total_len));
1389 total_len += constant_pool.size ();
1390
1391 gdb_assert (contents.size () == size_of_contents);
1392
1393 contents.file_write (out_file);
1394 cu_list.file_write (out_file);
1395 types_cu_list.file_write (out_file);
1396 addr_vec.file_write (out_file);
1397 symtab_vec.file_write (out_file);
1398 constant_pool.file_write (out_file);
1399
1400 return total_len;
1401 }
1402
1403 /* DWARF-5 augmentation string for GDB's DW_IDX_GNU_* extension. */
1404 static const gdb_byte dwarf5_gdb_augmentation[] = { 'G', 'D', 'B', 0 };
1405
1406 /* Write a new .debug_names section for OBJFILE into OUT_FILE, write
1407 needed addition to .debug_str section to OUT_FILE_STR. Return how
1408 many bytes were expected to be written into OUT_FILE. */
1409
1410 static size_t
1411 write_debug_names (struct dwarf2_per_objfile *dwarf2_per_objfile,
1412 FILE *out_file, FILE *out_file_str)
1413 {
1414 const bool dwarf5_is_dwarf64 = check_dwarf64_offsets (dwarf2_per_objfile);
1415 struct objfile *objfile = dwarf2_per_objfile->objfile;
1416 const enum bfd_endian dwarf5_byte_order
1417 = gdbarch_byte_order (get_objfile_arch (objfile));
1418
1419 /* The CU list is already sorted, so we don't need to do additional
1420 work here. Also, the debug_types entries do not appear in
1421 all_comp_units, but only in their own hash table. */
1422 data_buf cu_list;
1423 debug_names nametable (dwarf2_per_objfile, dwarf5_is_dwarf64,
1424 dwarf5_byte_order);
1425 std::unordered_set<partial_symbol *>
1426 psyms_seen (psyms_seen_size (dwarf2_per_objfile));
1427 for (int i = 0; i < dwarf2_per_objfile->all_comp_units.size (); ++i)
1428 {
1429 const dwarf2_per_cu_data *per_cu = dwarf2_per_objfile->all_comp_units[i];
1430 partial_symtab *psymtab = per_cu->v.psymtab;
1431
1432 /* CU of a shared file from 'dwz -m' may be unused by this main
1433 file. It may be referenced from a local scope but in such
1434 case it does not need to be present in .debug_names. */
1435 if (psymtab == NULL)
1436 continue;
1437
1438 if (psymtab->user == NULL)
1439 nametable.recursively_write_psymbols (objfile, psymtab, psyms_seen, i);
1440
1441 cu_list.append_uint (nametable.dwarf5_offset_size (), dwarf5_byte_order,
1442 to_underlying (per_cu->sect_off));
1443 }
1444
1445 /* Write out the .debug_type entries, if any. */
1446 data_buf types_cu_list;
1447 if (dwarf2_per_objfile->signatured_types)
1448 {
1449 debug_names::write_one_signatured_type_data sig_data (nametable,
1450 signatured_type_index_data (types_cu_list, psyms_seen));
1451
1452 sig_data.info.objfile = objfile;
1453 /* It is used only for gdb_index. */
1454 sig_data.info.symtab = nullptr;
1455 sig_data.info.cu_index = 0;
1456 htab_traverse_noresize (dwarf2_per_objfile->signatured_types,
1457 debug_names::write_one_signatured_type,
1458 &sig_data);
1459 }
1460
1461 nametable.build ();
1462
1463 /* No addr_vec - DWARF-5 uses .debug_aranges generated by GCC. */
1464
1465 const offset_type bytes_of_header
1466 = ((dwarf5_is_dwarf64 ? 12 : 4)
1467 + 2 + 2 + 7 * 4
1468 + sizeof (dwarf5_gdb_augmentation));
1469 size_t expected_bytes = 0;
1470 expected_bytes += bytes_of_header;
1471 expected_bytes += cu_list.size ();
1472 expected_bytes += types_cu_list.size ();
1473 expected_bytes += nametable.bytes ();
1474 data_buf header;
1475
1476 if (!dwarf5_is_dwarf64)
1477 {
1478 const uint64_t size64 = expected_bytes - 4;
1479 gdb_assert (size64 < 0xfffffff0);
1480 header.append_uint (4, dwarf5_byte_order, size64);
1481 }
1482 else
1483 {
1484 header.append_uint (4, dwarf5_byte_order, 0xffffffff);
1485 header.append_uint (8, dwarf5_byte_order, expected_bytes - 12);
1486 }
1487
1488 /* The version number. */
1489 header.append_uint (2, dwarf5_byte_order, 5);
1490
1491 /* Padding. */
1492 header.append_uint (2, dwarf5_byte_order, 0);
1493
1494 /* comp_unit_count - The number of CUs in the CU list. */
1495 header.append_uint (4, dwarf5_byte_order,
1496 dwarf2_per_objfile->all_comp_units.size ());
1497
1498 /* local_type_unit_count - The number of TUs in the local TU
1499 list. */
1500 header.append_uint (4, dwarf5_byte_order, dwarf2_per_objfile->n_type_units);
1501
1502 /* foreign_type_unit_count - The number of TUs in the foreign TU
1503 list. */
1504 header.append_uint (4, dwarf5_byte_order, 0);
1505
1506 /* bucket_count - The number of hash buckets in the hash lookup
1507 table. */
1508 header.append_uint (4, dwarf5_byte_order, nametable.bucket_count ());
1509
1510 /* name_count - The number of unique names in the index. */
1511 header.append_uint (4, dwarf5_byte_order, nametable.name_count ());
1512
1513 /* abbrev_table_size - The size in bytes of the abbreviations
1514 table. */
1515 header.append_uint (4, dwarf5_byte_order, nametable.abbrev_table_bytes ());
1516
1517 /* augmentation_string_size - The size in bytes of the augmentation
1518 string. This value is rounded up to a multiple of 4. */
1519 static_assert (sizeof (dwarf5_gdb_augmentation) % 4 == 0, "");
1520 header.append_uint (4, dwarf5_byte_order, sizeof (dwarf5_gdb_augmentation));
1521 header.append_data (dwarf5_gdb_augmentation);
1522
1523 gdb_assert (header.size () == bytes_of_header);
1524
1525 header.file_write (out_file);
1526 cu_list.file_write (out_file);
1527 types_cu_list.file_write (out_file);
1528 nametable.file_write (out_file, out_file_str);
1529
1530 return expected_bytes;
1531 }
1532
1533 /* Assert that FILE's size is EXPECTED_SIZE. Assumes file's seek
1534 position is at the end of the file. */
1535
1536 static void
1537 assert_file_size (FILE *file, const char *filename, size_t expected_size)
1538 {
1539 const auto file_size = ftell (file);
1540 if (file_size == -1)
1541 error (_("Can't get `%s' size"), filename);
1542 gdb_assert (file_size == expected_size);
1543 }
1544
1545 /* Create an index file for OBJFILE in the directory DIR. */
1546
1547 static void
1548 write_psymtabs_to_index (struct dwarf2_per_objfile *dwarf2_per_objfile,
1549 const char *dir,
1550 dw_index_kind index_kind)
1551 {
1552 struct objfile *objfile = dwarf2_per_objfile->objfile;
1553
1554 if (dwarf2_per_objfile->using_index)
1555 error (_("Cannot use an index to create the index"));
1556
1557 if (VEC_length (dwarf2_section_info_def, dwarf2_per_objfile->types) > 1)
1558 error (_("Cannot make an index when the file has multiple .debug_types sections"));
1559
1560 if (!objfile->psymtabs || !objfile->psymtabs_addrmap)
1561 return;
1562
1563 struct stat st;
1564 if (stat (objfile_name (objfile), &st) < 0)
1565 perror_with_name (objfile_name (objfile));
1566
1567 std::string filename (std::string (dir) + SLASH_STRING
1568 + lbasename (objfile_name (objfile))
1569 + (index_kind == dw_index_kind::DEBUG_NAMES
1570 ? INDEX5_SUFFIX : INDEX4_SUFFIX));
1571
1572 FILE *out_file = gdb_fopen_cloexec (filename.c_str (), "wb").release ();
1573 if (!out_file)
1574 error (_("Can't open `%s' for writing"), filename.c_str ());
1575
1576 /* Order matters here; we want FILE to be closed before FILENAME is
1577 unlinked, because on MS-Windows one cannot delete a file that is
1578 still open. (Don't call anything here that might throw until
1579 file_closer is created.) */
1580 gdb::unlinker unlink_file (filename.c_str ());
1581 gdb_file_up close_out_file (out_file);
1582
1583 if (index_kind == dw_index_kind::DEBUG_NAMES)
1584 {
1585 std::string filename_str (std::string (dir) + SLASH_STRING
1586 + lbasename (objfile_name (objfile))
1587 + DEBUG_STR_SUFFIX);
1588 FILE *out_file_str
1589 = gdb_fopen_cloexec (filename_str.c_str (), "wb").release ();
1590 if (!out_file_str)
1591 error (_("Can't open `%s' for writing"), filename_str.c_str ());
1592 gdb::unlinker unlink_file_str (filename_str.c_str ());
1593 gdb_file_up close_out_file_str (out_file_str);
1594
1595 const size_t total_len
1596 = write_debug_names (dwarf2_per_objfile, out_file, out_file_str);
1597 assert_file_size (out_file, filename.c_str (), total_len);
1598
1599 /* We want to keep the file .debug_str file too. */
1600 unlink_file_str.keep ();
1601 }
1602 else
1603 {
1604 const size_t total_len
1605 = write_gdbindex (dwarf2_per_objfile, out_file);
1606 assert_file_size (out_file, filename.c_str (), total_len);
1607 }
1608
1609 /* We want to keep the file. */
1610 unlink_file.keep ();
1611 }
1612
1613 /* Implementation of the `save gdb-index' command.
1614
1615 Note that the .gdb_index file format used by this command is
1616 documented in the GDB manual. Any changes here must be documented
1617 there. */
1618
1619 static void
1620 save_gdb_index_command (const char *arg, int from_tty)
1621 {
1622 struct objfile *objfile;
1623 const char dwarf5space[] = "-dwarf-5 ";
1624 dw_index_kind index_kind = dw_index_kind::GDB_INDEX;
1625
1626 if (!arg)
1627 arg = "";
1628
1629 arg = skip_spaces (arg);
1630 if (strncmp (arg, dwarf5space, strlen (dwarf5space)) == 0)
1631 {
1632 index_kind = dw_index_kind::DEBUG_NAMES;
1633 arg += strlen (dwarf5space);
1634 arg = skip_spaces (arg);
1635 }
1636
1637 if (!*arg)
1638 error (_("usage: save gdb-index [-dwarf-5] DIRECTORY"));
1639
1640 ALL_OBJFILES (objfile)
1641 {
1642 struct stat st;
1643
1644 /* If the objfile does not correspond to an actual file, skip it. */
1645 if (stat (objfile_name (objfile), &st) < 0)
1646 continue;
1647
1648 struct dwarf2_per_objfile *dwarf2_per_objfile
1649 = get_dwarf2_per_objfile (objfile);
1650
1651 if (dwarf2_per_objfile != NULL)
1652 {
1653 TRY
1654 {
1655 write_psymtabs_to_index (dwarf2_per_objfile, arg, index_kind);
1656 }
1657 CATCH (except, RETURN_MASK_ERROR)
1658 {
1659 exception_fprintf (gdb_stderr, except,
1660 _("Error while writing index for `%s': "),
1661 objfile_name (objfile));
1662 }
1663 END_CATCH
1664 }
1665
1666 }
1667 }
1668
1669 void
1670 _initialize_dwarf_index_write ()
1671 {
1672 cmd_list_element *c = add_cmd ("gdb-index", class_files,
1673 save_gdb_index_command, _("\
1674 Save a gdb-index file.\n\
1675 Usage: save gdb-index [-dwarf-5] DIRECTORY\n\
1676 \n\
1677 No options create one file with .gdb-index extension for pre-DWARF-5\n\
1678 compatible .gdb_index section. With -dwarf-5 creates two files with\n\
1679 extension .debug_names and .debug_str for DWARF-5 .debug_names section."),
1680 &save_cmdlist);
1681 set_cmd_completer (c, filename_completer);
1682 }
This page took 0.144744 seconds and 4 git commands to generate.