diff options
author | Tom Tromey <tom@tromey.com> | 2020-02-08 13:40:54 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2020-02-08 13:40:54 -0700 |
commit | 2c86cff96f47cdc7fe16e231f29566b3da2f756b (patch) | |
tree | 80e4735af6f2854022c346154fff18a13f5d01be /gdb/dwarf2/section.c | |
parent | f4382c45a4de31b654c063d1ae70d932bde1c2f2 (diff) | |
download | gdb-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.c | 179 |
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)); + } +} |