1/* DWARF CU data structure 2 3 Copyright (C) 2021-2023 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#include "dwarf2/cu.h" 22#include "dwarf2/read.h" 23#include "objfiles.h" 24#include "filenames.h" 25#include "gdbsupport/pathstuff.h" 26 27/* Initialize dwarf2_cu to read PER_CU, in the context of PER_OBJFILE. */ 28 29dwarf2_cu::dwarf2_cu (dwarf2_per_cu_data *per_cu, 30 dwarf2_per_objfile *per_objfile) 31 : per_cu (per_cu), 32 per_objfile (per_objfile), 33 m_mark (false), 34 has_loclist (false), 35 checked_producer (false), 36 producer_is_gxx_lt_4_6 (false), 37 producer_is_gcc_lt_4_3 (false), 38 producer_is_gcc_11 (false), 39 producer_is_icc (false), 40 producer_is_icc_lt_14 (false), 41 producer_is_codewarrior (false), 42 producer_is_clang (false), 43 processing_has_namespace_info (false), 44 load_all_dies (false) 45{ 46} 47 48/* See cu.h. */ 49 50struct type * 51dwarf2_cu::addr_sized_int_type (bool unsigned_p) const 52{ 53 int addr_size = this->per_cu->addr_size (); 54 return objfile_int_type (this->per_objfile->objfile, addr_size, unsigned_p); 55} 56 57/* Start a symtab for DWARF. NAME, COMP_DIR, LOW_PC are passed to the 58 buildsym_compunit constructor. */ 59 60struct compunit_symtab * 61dwarf2_cu::start_compunit_symtab (const char *name, const char *comp_dir, 62 CORE_ADDR low_pc) 63{ 64 gdb_assert (m_builder == nullptr); 65 66 std::string name_for_id_holder; 67 const char *name_for_id = name; 68 69 /* Prepend the compilation directory to the filename if needed (if not 70 absolute already) to get the "name for id" for our main symtab. The name 71 for the main file coming from the line table header will be generated using 72 the same logic, so will hopefully match what we pass here. */ 73 if (!IS_ABSOLUTE_PATH (name) && comp_dir != nullptr) 74 { 75 name_for_id_holder = path_join (comp_dir, name); 76 name_for_id = name_for_id_holder.c_str (); 77 } 78 79 m_builder.reset (new struct buildsym_compunit 80 (this->per_objfile->objfile, 81 name, comp_dir, name_for_id, lang (), low_pc)); 82 83 list_in_scope = get_builder ()->get_file_symbols (); 84 85 /* DWARF versions are restricted to [2, 5], thanks to the check in 86 read_comp_unit_head. */ 87 gdb_assert (this->header.version >= 2 && this->header.version <= 5); 88 static const char *debugformat_strings[] = { 89 "DWARF 2", 90 "DWARF 3", 91 "DWARF 4", 92 "DWARF 5", 93 }; 94 const char *debugformat = debugformat_strings[this->header.version - 2]; 95 96 get_builder ()->record_debugformat (debugformat); 97 get_builder ()->record_producer (producer); 98 99 processing_has_namespace_info = false; 100 101 return get_builder ()->get_compunit_symtab (); 102} 103 104/* See read.h. */ 105 106struct type * 107dwarf2_cu::addr_type () const 108{ 109 struct objfile *objfile = this->per_objfile->objfile; 110 struct type *void_type = objfile_type (objfile)->builtin_void; 111 struct type *addr_type = lookup_pointer_type (void_type); 112 int addr_size = this->per_cu->addr_size (); 113 114 if (addr_type->length () == addr_size) 115 return addr_type; 116 117 addr_type = addr_sized_int_type (addr_type->is_unsigned ()); 118 return addr_type; 119} 120 121/* A hashtab traversal function that marks the dependent CUs. */ 122 123static int 124dwarf2_mark_helper (void **slot, void *data) 125{ 126 dwarf2_per_cu_data *per_cu = (dwarf2_per_cu_data *) *slot; 127 dwarf2_per_objfile *per_objfile = (dwarf2_per_objfile *) data; 128 dwarf2_cu *cu = per_objfile->get_cu (per_cu); 129 130 /* cu->m_dependencies references may not yet have been ever read if 131 QUIT aborts reading of the chain. As such dependencies remain 132 valid it is not much useful to track and undo them during QUIT 133 cleanups. */ 134 if (cu != nullptr) 135 cu->mark (); 136 return 1; 137} 138 139/* See dwarf2/cu.h. */ 140 141void 142dwarf2_cu::mark () 143{ 144 if (!m_mark) 145 { 146 m_mark = true; 147 if (m_dependencies != nullptr) 148 htab_traverse (m_dependencies, dwarf2_mark_helper, per_objfile); 149 } 150} 151 152/* See dwarf2/cu.h. */ 153 154void 155dwarf2_cu::add_dependence (struct dwarf2_per_cu_data *ref_per_cu) 156{ 157 void **slot; 158 159 if (m_dependencies == nullptr) 160 m_dependencies 161 = htab_create_alloc_ex (5, htab_hash_pointer, htab_eq_pointer, 162 NULL, &comp_unit_obstack, 163 hashtab_obstack_allocate, 164 dummy_obstack_deallocate); 165 166 slot = htab_find_slot (m_dependencies, ref_per_cu, INSERT); 167 if (*slot == nullptr) 168 *slot = ref_per_cu; 169} 170 171/* See dwarf2/cu.h. */ 172 173buildsym_compunit * 174dwarf2_cu::get_builder () 175{ 176 /* If this CU has a builder associated with it, use that. */ 177 if (m_builder != nullptr) 178 return m_builder.get (); 179 180 if (per_objfile->sym_cu != nullptr) 181 return per_objfile->sym_cu->m_builder.get (); 182 183 gdb_assert_not_reached (""); 184} 185