aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2/section.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2020-02-08 13:40:54 -0700
committerTom Tromey <tom@tromey.com>2020-02-08 13:40:54 -0700
commit2c86cff96f47cdc7fe16e231f29566b3da2f756b (patch)
tree80e4735af6f2854022c346154fff18a13f5d01be /gdb/dwarf2/section.c
parentf4382c45a4de31b654c063d1ae70d932bde1c2f2 (diff)
downloadgdb-2c86cff96f47cdc7fe16e231f29566b3da2f756b.zip
gdb-2c86cff96f47cdc7fe16e231f29566b3da2f756b.tar.gz
gdb-2c86cff96f47cdc7fe16e231f29566b3da2f756b.tar.bz2
Create dwarf2/section.[ch]
This moves some section-handling code from dwarf2read.c into new files, dwarf2/section.[ch]. gdb/ChangeLog 2020-02-08 Tom Tromey <tom@tromey.com> * dwarf2read.h (struct dwarf2_section_info, dwarf2_read_section): Move to dwarf2/section.h. * dwarf2read.c (get_containing_section, get_section_bfd_owner) (get_section_bfd_section, get_section_name) (get_section_file_name, get_section_id, get_section_flags) (dwarf2_section_empty_p, dwarf2_read_section): Moe to dwarf2/section.c. * dwarf2/section.h: New file. * dwarf2/section.c: New file, from dwarf2read.c. * Makefile.in (COMMON_SFILES): Add dwarf2/section.c. Change-Id: I9f8498094cf99d9521e9481622ce8adbd453daf4
Diffstat (limited to 'gdb/dwarf2/section.c')
-rw-r--r--gdb/dwarf2/section.c179
1 files changed, 179 insertions, 0 deletions
diff --git a/gdb/dwarf2/section.c b/gdb/dwarf2/section.c
new file mode 100644
index 0000000..618ab9a
--- /dev/null
+++ b/gdb/dwarf2/section.c
@@ -0,0 +1,179 @@
+/* DWARF 2 low-level section code
+
+ Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+ Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology,
+ Inc. with support from Florida State University (under contract
+ with the Ada Joint Program Office), and Silicon Graphics, Inc.
+ Initial contribution by Brent Benson, Harris Computer Systems, Inc.,
+ based on Fred Fish's (Cygnus Support) implementation of DWARF 1
+ support.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "defs.h"
+#include "dwarf2/section.h"
+#include "gdb_bfd.h"
+#include "objfiles.h"
+
+struct dwarf2_section_info *
+get_containing_section (const struct dwarf2_section_info *section)
+{
+ gdb_assert (section->is_virtual);
+ return section->s.containing_section;
+}
+
+struct bfd *
+get_section_bfd_owner (const struct dwarf2_section_info *section)
+{
+ if (section->is_virtual)
+ {
+ section = get_containing_section (section);
+ gdb_assert (!section->is_virtual);
+ }
+ return section->s.section->owner;
+}
+
+asection *
+get_section_bfd_section (const struct dwarf2_section_info *section)
+{
+ if (section->is_virtual)
+ {
+ section = get_containing_section (section);
+ gdb_assert (!section->is_virtual);
+ }
+ return section->s.section;
+}
+
+const char *
+get_section_name (const struct dwarf2_section_info *section)
+{
+ asection *sectp = get_section_bfd_section (section);
+
+ gdb_assert (sectp != NULL);
+ return bfd_section_name (sectp);
+}
+
+const char *
+get_section_file_name (const struct dwarf2_section_info *section)
+{
+ bfd *abfd = get_section_bfd_owner (section);
+
+ return bfd_get_filename (abfd);
+}
+
+int
+get_section_id (const struct dwarf2_section_info *section)
+{
+ asection *sectp = get_section_bfd_section (section);
+
+ if (sectp == NULL)
+ return 0;
+ return sectp->id;
+}
+
+int
+get_section_flags (const struct dwarf2_section_info *section)
+{
+ asection *sectp = get_section_bfd_section (section);
+
+ gdb_assert (sectp != NULL);
+ return bfd_section_flags (sectp);
+}
+
+int
+dwarf2_section_empty_p (const struct dwarf2_section_info *section)
+{
+ if (section->is_virtual)
+ return section->size == 0;
+ return section->s.section == NULL || section->size == 0;
+}
+
+void
+dwarf2_read_section (struct objfile *objfile, dwarf2_section_info *info)
+{
+ asection *sectp;
+ bfd *abfd;
+ gdb_byte *buf, *retbuf;
+
+ if (info->readin)
+ return;
+ info->buffer = NULL;
+ info->readin = true;
+
+ if (dwarf2_section_empty_p (info))
+ return;
+
+ sectp = get_section_bfd_section (info);
+
+ /* If this is a virtual section we need to read in the real one first. */
+ if (info->is_virtual)
+ {
+ struct dwarf2_section_info *containing_section =
+ get_containing_section (info);
+
+ gdb_assert (sectp != NULL);
+ if ((sectp->flags & SEC_RELOC) != 0)
+ {
+ error (_("Dwarf Error: DWP format V2 with relocations is not"
+ " supported in section %s [in module %s]"),
+ get_section_name (info), get_section_file_name (info));
+ }
+ dwarf2_read_section (objfile, containing_section);
+ /* Other code should have already caught virtual sections that don't
+ fit. */
+ gdb_assert (info->virtual_offset + info->size
+ <= containing_section->size);
+ /* If the real section is empty or there was a problem reading the
+ section we shouldn't get here. */
+ gdb_assert (containing_section->buffer != NULL);
+ info->buffer = containing_section->buffer + info->virtual_offset;
+ return;
+ }
+
+ /* If the section has relocations, we must read it ourselves.
+ Otherwise we attach it to the BFD. */
+ if ((sectp->flags & SEC_RELOC) == 0)
+ {
+ info->buffer = gdb_bfd_map_section (sectp, &info->size);
+ return;
+ }
+
+ buf = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack, info->size);
+ info->buffer = buf;
+
+ /* When debugging .o files, we may need to apply relocations; see
+ http://sourceware.org/ml/gdb-patches/2002-04/msg00136.html .
+ We never compress sections in .o files, so we only need to
+ try this when the section is not compressed. */
+ retbuf = symfile_relocate_debug_section (objfile, sectp, buf);
+ if (retbuf != NULL)
+ {
+ info->buffer = retbuf;
+ return;
+ }
+
+ abfd = get_section_bfd_owner (info);
+ gdb_assert (abfd != NULL);
+
+ if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0
+ || bfd_bread (buf, info->size, abfd) != info->size)
+ {
+ error (_("Dwarf Error: Can't read DWARF data"
+ " in section %s [in module %s]"),
+ bfd_section_name (sectp), bfd_get_filename (abfd));
+ }
+}