]> Git Repo - binutils.git/blob - gdb/dwarf2/section.c
Remove DW_ADDR
[binutils.git] / gdb / dwarf2 / section.c
1 /* DWARF 2 low-level section code
2
3    Copyright (C) 1994-2020 Free Software Foundation, Inc.
4
5    Adapted by Gary Funck ([email protected]), 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"
31 #include "complaints.h"
32
33 void
34 dwarf2_section_info::overflow_complaint () const
35 {
36   complaint (_("debug info runs off end of %s section"
37                " [in module %s]"),
38              get_name (), get_file_name ());
39 }
40
41 struct dwarf2_section_info *
42 dwarf2_section_info::get_containing_section () const
43 {
44   gdb_assert (is_virtual);
45   return s.containing_section;
46 }
47
48 struct bfd *
49 dwarf2_section_info::get_bfd_owner () const
50 {
51   const dwarf2_section_info *section = this;
52   if (is_virtual)
53     {
54       section = get_containing_section ();
55       gdb_assert (!section->is_virtual);
56     }
57   return section->s.section->owner;
58 }
59
60 asection *
61 dwarf2_section_info::get_bfd_section () const
62 {
63   const dwarf2_section_info *section = this;
64   if (section->is_virtual)
65     {
66       section = get_containing_section ();
67       gdb_assert (!section->is_virtual);
68     }
69   return section->s.section;
70 }
71
72 const char *
73 dwarf2_section_info::get_name () const
74 {
75   asection *sectp = get_bfd_section ();
76
77   gdb_assert (sectp != NULL);
78   return bfd_section_name (sectp);
79 }
80
81 const char *
82 dwarf2_section_info::get_file_name () const
83 {
84   bfd *abfd = get_bfd_owner ();
85
86   return bfd_get_filename (abfd);
87 }
88
89 int
90 dwarf2_section_info::get_id () const
91 {
92   asection *sectp = get_bfd_section ();
93
94   if (sectp == NULL)
95     return 0;
96   return sectp->id;
97 }
98
99 int
100 dwarf2_section_info::get_flags () const
101 {
102   asection *sectp = get_bfd_section ();
103
104   gdb_assert (sectp != NULL);
105   return bfd_section_flags (sectp);
106 }
107
108 bool
109 dwarf2_section_info::empty () const
110 {
111   if (is_virtual)
112     return size == 0;
113   return s.section == NULL || size == 0;
114 }
115
116 void
117 dwarf2_section_info::read (struct objfile *objfile)
118 {
119   asection *sectp;
120   bfd *abfd;
121   gdb_byte *buf, *retbuf;
122
123   if (readin)
124     return;
125   buffer = NULL;
126   readin = true;
127
128   if (empty ())
129     return;
130
131   sectp = get_bfd_section ();
132
133   /* If this is a virtual section we need to read in the real one first.  */
134   if (is_virtual)
135     {
136       struct dwarf2_section_info *containing_section =
137         get_containing_section ();
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]"),
144                  get_name (), get_file_name ());
145         }
146       containing_section->read (objfile);
147       /* Other code should have already caught virtual sections that don't
148          fit.  */
149       gdb_assert (virtual_offset + size <= containing_section->size);
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);
153       buffer = containing_section->buffer + virtual_offset;
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     {
161       buffer = gdb_bfd_map_section (sectp, &size);
162       return;
163     }
164
165   buf = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack, size);
166   buffer = buf;
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     {
175       buffer = retbuf;
176       return;
177     }
178
179   abfd = get_bfd_owner ();
180   gdb_assert (abfd != NULL);
181
182   if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0
183       || bfd_bread (buf, size, abfd) != size)
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 }
190
191 const char *
192 dwarf2_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.036598 seconds and 4 git commands to generate.