gdb: rename dwarf2_per_objfile variables/fields to per_objfile
[deliverable/binutils-gdb.git] / gdb / dwarf2 / section.c
CommitLineData
2c86cff9
TT
1/* DWARF 2 low-level section code
2
3 Copyright (C) 1994-2020 Free Software Foundation, Inc.
4
5 Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology,
6 Inc. with support from Florida State University (under contract
7 with the Ada Joint Program Office), and Silicon Graphics, Inc.
8 Initial contribution by Brent Benson, Harris Computer Systems, Inc.,
9 based on Fred Fish's (Cygnus Support) implementation of DWARF 1
10 support.
11
12 This file is part of GDB.
13
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 3 of the License, or
17 (at your option) any later version.
18
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program. If not, see <http://www.gnu.org/licenses/>. */
26
27#include "defs.h"
28#include "dwarf2/section.h"
29#include "gdb_bfd.h"
30#include "objfiles.h"
3d27bbdb
TT
31#include "complaints.h"
32
33void
a0194fa8 34dwarf2_section_info::overflow_complaint () const
3d27bbdb
TT
35{
36 complaint (_("debug info runs off end of %s section"
37 " [in module %s]"),
a0194fa8 38 get_name (), get_file_name ());
3d27bbdb 39}
2c86cff9
TT
40
41struct dwarf2_section_info *
96b79293 42dwarf2_section_info::get_containing_section () const
2c86cff9 43{
96b79293
TT
44 gdb_assert (is_virtual);
45 return s.containing_section;
2c86cff9
TT
46}
47
48struct bfd *
96b79293 49dwarf2_section_info::get_bfd_owner () const
2c86cff9 50{
96b79293
TT
51 const dwarf2_section_info *section = this;
52 if (is_virtual)
2c86cff9 53 {
96b79293 54 section = get_containing_section ();
2c86cff9
TT
55 gdb_assert (!section->is_virtual);
56 }
57 return section->s.section->owner;
58}
59
60asection *
96b79293 61dwarf2_section_info::get_bfd_section () const
2c86cff9 62{
96b79293 63 const dwarf2_section_info *section = this;
2c86cff9
TT
64 if (section->is_virtual)
65 {
96b79293 66 section = get_containing_section ();
2c86cff9
TT
67 gdb_assert (!section->is_virtual);
68 }
69 return section->s.section;
70}
71
72const char *
96b79293 73dwarf2_section_info::get_name () const
2c86cff9 74{
96b79293 75 asection *sectp = get_bfd_section ();
2c86cff9
TT
76
77 gdb_assert (sectp != NULL);
78 return bfd_section_name (sectp);
79}
80
81const char *
96b79293 82dwarf2_section_info::get_file_name () const
2c86cff9 83{
96b79293 84 bfd *abfd = get_bfd_owner ();
2c86cff9
TT
85
86 return bfd_get_filename (abfd);
87}
88
89int
96b79293 90dwarf2_section_info::get_id () const
2c86cff9 91{
96b79293 92 asection *sectp = get_bfd_section ();
2c86cff9
TT
93
94 if (sectp == NULL)
95 return 0;
96 return sectp->id;
97}
98
99int
96b79293 100dwarf2_section_info::get_flags () const
2c86cff9 101{
96b79293 102 asection *sectp = get_bfd_section ();
2c86cff9
TT
103
104 gdb_assert (sectp != NULL);
105 return bfd_section_flags (sectp);
106}
107
96b79293
TT
108bool
109dwarf2_section_info::empty () const
2c86cff9 110{
96b79293
TT
111 if (is_virtual)
112 return size == 0;
113 return s.section == NULL || size == 0;
2c86cff9
TT
114}
115
116void
96b79293 117dwarf2_section_info::read (struct objfile *objfile)
2c86cff9
TT
118{
119 asection *sectp;
120 bfd *abfd;
121 gdb_byte *buf, *retbuf;
122
96b79293 123 if (readin)
2c86cff9 124 return;
96b79293
TT
125 buffer = NULL;
126 readin = true;
2c86cff9 127
96b79293 128 if (empty ())
2c86cff9
TT
129 return;
130
96b79293 131 sectp = get_bfd_section ();
2c86cff9
TT
132
133 /* If this is a virtual section we need to read in the real one first. */
96b79293 134 if (is_virtual)
2c86cff9
TT
135 {
136 struct dwarf2_section_info *containing_section =
96b79293 137 get_containing_section ();
2c86cff9
TT
138
139 gdb_assert (sectp != NULL);
140 if ((sectp->flags & SEC_RELOC) != 0)
141 {
142 error (_("Dwarf Error: DWP format V2 with relocations is not"
143 " supported in section %s [in module %s]"),
96b79293 144 get_name (), get_file_name ());
2c86cff9 145 }
96b79293 146 containing_section->read (objfile);
2c86cff9
TT
147 /* Other code should have already caught virtual sections that don't
148 fit. */
96b79293 149 gdb_assert (virtual_offset + size <= containing_section->size);
2c86cff9
TT
150 /* If the real section is empty or there was a problem reading the
151 section we shouldn't get here. */
152 gdb_assert (containing_section->buffer != NULL);
96b79293 153 buffer = containing_section->buffer + virtual_offset;
2c86cff9
TT
154 return;
155 }
156
157 /* If the section has relocations, we must read it ourselves.
158 Otherwise we attach it to the BFD. */
159 if ((sectp->flags & SEC_RELOC) == 0)
160 {
96b79293 161 buffer = gdb_bfd_map_section (sectp, &size);
2c86cff9
TT
162 return;
163 }
164
96b79293
TT
165 buf = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack, size);
166 buffer = buf;
2c86cff9
TT
167
168 /* When debugging .o files, we may need to apply relocations; see
169 http://sourceware.org/ml/gdb-patches/2002-04/msg00136.html .
170 We never compress sections in .o files, so we only need to
171 try this when the section is not compressed. */
172 retbuf = symfile_relocate_debug_section (objfile, sectp, buf);
173 if (retbuf != NULL)
174 {
96b79293 175 buffer = retbuf;
2c86cff9
TT
176 return;
177 }
178
96b79293 179 abfd = get_bfd_owner ();
2c86cff9
TT
180 gdb_assert (abfd != NULL);
181
182 if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0
96b79293 183 || bfd_bread (buf, size, abfd) != size)
2c86cff9
TT
184 {
185 error (_("Dwarf Error: Can't read DWARF data"
186 " in section %s [in module %s]"),
187 bfd_section_name (sectp), bfd_get_filename (abfd));
188 }
189}
4f44ae6c
TT
190
191const char *
192dwarf2_section_info::read_string (struct objfile *objfile, LONGEST str_offset,
193 const char *form_name)
194{
195 read (objfile);
196 if (buffer == NULL)
197 error (_("%s used without %s section [in module %s]"),
198 form_name, get_name (), get_file_name ());
199 if (str_offset >= size)
200 error (_("%s pointing outside of %s section [in module %s]"),
201 form_name, get_name (), get_file_name ());
202 gdb_assert (HOST_CHAR_BIT == 8);
203 if (buffer[str_offset] == '\0')
204 return NULL;
205 return (const char *) (buffer + str_offset);
206}
This page took 0.065086 seconds and 4 git commands to generate.