]> Git Repo - binutils.git/blob - gdb/dwarf2/cu.c
Automatic date update in version.in
[binutils.git] / gdb / dwarf2 / cu.c
1 /* DWARF CU data structure
2
3    Copyright (C) 2021-2022 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
29 dwarf2_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
50 struct type *
51 dwarf2_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
60 struct compunit_symtab *
61 dwarf2_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
106 struct type *
107 dwarf2_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
123 static int
124 dwarf2_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
141 void
142 dwarf2_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
154 void
155 dwarf2_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
173 buildsym_compunit *
174 dwarf2_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 }
This page took 0.035326 seconds and 4 git commands to generate.