From patchwork Thu Jan 23 00:57:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 37510 Received: (qmail 83436 invoked by alias); 23 Jan 2020 00:57:58 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 81641 invoked by uid 89); 23 Jan 2020 00:57:45 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy= X-HELO: gateway21.websitewelcome.com Received: from gateway21.websitewelcome.com (HELO gateway21.websitewelcome.com) (192.185.45.210) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 23 Jan 2020 00:57:29 +0000 Received: from cm10.websitewelcome.com (cm10.websitewelcome.com [100.42.49.4]) by gateway21.websitewelcome.com (Postfix) with ESMTP id 0D7D4400C2F14 for ; Wed, 22 Jan 2020 18:57:28 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id uQoKityOxkeyDuQoKiwlV3; Wed, 22 Jan 2020 18:57:28 -0600 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=qvbtoiAnYS2X2dVTivLmJwgDPXxwNcHA6DdTUncwtPk=; b=viCoo+27szUglS2K9mdW0Cv9si Q0LYyfT7J/R1DFCbR3dbbZtdhbqFt4BBBGFzdyzXjU98dBFKHpLX8hcZciLEeJtdNrXrZE8yCW8sQ KuC6+wWKcQQg7c0Rgl2w/l/Pg; Received: from 75-166-123-50.hlrn.qwest.net ([75.166.123.50]:40832 helo=bapiya.Home) by box5379.bluehost.com with esmtpa (Exim 4.92) (envelope-from ) id 1iuQoJ-004KqG-Qh; Wed, 22 Jan 2020 17:57:27 -0700 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 33/38] Create dwarf2/comp-unit.[ch] Date: Wed, 22 Jan 2020 17:57:05 -0700 Message-Id: <20200123005710.7978-34-tom@tromey.com> In-Reply-To: <20200123005710.7978-1-tom@tromey.com> References: <20200123005710.7978-1-tom@tromey.com> This creates the new files dwarf2/comp-unit.[ch], moving comp_unit_head and helpers to those files. A couple of functions are turned into methods, because it was convenient to do so now. 2020-01-22 Tom Tromey * Makefile.in (COMMON_SFILES): Add dwarf2/comp-unit.c. * dwarf2/read.c (struct comp_unit_head): Move to dwarf2/comp-unit.h. (enum class rcuh_kind): Move to comp-unit.h. (get_cu_length, offset_in_cu_p): Now methods on comp_unit_head. (read_comp_unit_head, error_check_comp_unit_head) (read_and_check_comp_unit_head): Move to comp-unit.c. (read_offset, dwarf_unit_type_name): Likewise. (create_debug_type_hash_table, read_cutu_die_from_dwo) (cutu_reader::cutu_reader, read_call_site_scope) (find_partial_die, follow_die_offset): Update. * dwarf2/comp-unit.h: New file, from dwarf2read.c. Change-Id: Id961b9674c0081ed061083c8152c38b27b27388a --- gdb/ChangeLog | 15 ++ gdb/Makefile.in | 1 + gdb/dwarf2/comp-unit.c | 237 ++++++++++++++++++++++++++++++++ gdb/dwarf2/comp-unit.h | 114 ++++++++++++++++ gdb/dwarf2/read.c | 304 ++--------------------------------------- 5 files changed, 378 insertions(+), 293 deletions(-) create mode 100644 gdb/dwarf2/comp-unit.c create mode 100644 gdb/dwarf2/comp-unit.h diff --git a/gdb/Makefile.in b/gdb/Makefile.in index e4c2ebf968d..adb14fc1ce9 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -996,6 +996,7 @@ COMMON_SFILES = \ dummy-frame.c \ dwarf2/abbrev.c \ dwarf2/attribute.c \ + dwarf2/comp-unit.c \ dwarf2/expr.c \ dwarf2/frame-tailcall.c \ dwarf2/frame.c \ diff --git a/gdb/dwarf2/comp-unit.c b/gdb/dwarf2/comp-unit.c new file mode 100644 index 00000000000..03e804b7086 --- /dev/null +++ b/gdb/dwarf2/comp-unit.c @@ -0,0 +1,237 @@ +/* DWARF 2 debugging format support for GDB. + + 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 . */ + +#include "defs.h" +#include "dwarf2/comp-unit.h" +#include "dwarf2/leb.h" +#include "dwarf2/read.h" +#include "dwarf2/section.h" + +/* Convert a unit type to corresponding DW_UT name. */ + +static const char * +dwarf_unit_type_name (int unit_type) +{ + switch (unit_type) + { + case 0x01: + return "DW_UT_compile (0x01)"; + case 0x02: + return "DW_UT_type (0x02)"; + case 0x03: + return "DW_UT_partial (0x03)"; + case 0x04: + return "DW_UT_skeleton (0x04)"; + case 0x05: + return "DW_UT_split_compile (0x05)"; + case 0x06: + return "DW_UT_split_type (0x06)"; + case 0x80: + return "DW_UT_lo_user (0x80)"; + case 0xff: + return "DW_UT_hi_user (0xff)"; + default: + return nullptr; + } +} + +/* See comp-unit.h. */ + +const gdb_byte * +read_comp_unit_head (struct comp_unit_head *cu_header, + const gdb_byte *info_ptr, + struct dwarf2_section_info *section, + rcuh_kind section_kind) +{ + int signed_addr; + unsigned int bytes_read; + const char *filename = section->get_file_name (); + bfd *abfd = section->get_bfd_owner (); + + cu_header->length = read_initial_length (abfd, info_ptr, &bytes_read); + cu_header->initial_length_size = bytes_read; + cu_header->offset_size = (bytes_read == 4) ? 4 : 8; + info_ptr += bytes_read; + cu_header->version = read_2_bytes (abfd, info_ptr); + if (cu_header->version < 2 || cu_header->version > 5) + error (_("Dwarf Error: wrong version in compilation unit header " + "(is %d, should be 2, 3, 4 or 5) [in module %s]"), + cu_header->version, filename); + info_ptr += 2; + if (cu_header->version < 5) + switch (section_kind) + { + case rcuh_kind::COMPILE: + cu_header->unit_type = DW_UT_compile; + break; + case rcuh_kind::TYPE: + cu_header->unit_type = DW_UT_type; + break; + default: + internal_error (__FILE__, __LINE__, + _("read_comp_unit_head: invalid section_kind")); + } + else + { + cu_header->unit_type = static_cast + (read_1_byte (abfd, info_ptr)); + info_ptr += 1; + switch (cu_header->unit_type) + { + case DW_UT_compile: + case DW_UT_partial: + case DW_UT_skeleton: + case DW_UT_split_compile: + if (section_kind != rcuh_kind::COMPILE) + error (_("Dwarf Error: wrong unit_type in compilation unit header " + "(is %s, should be %s) [in module %s]"), + dwarf_unit_type_name (cu_header->unit_type), + dwarf_unit_type_name (DW_UT_type), filename); + break; + case DW_UT_type: + case DW_UT_split_type: + section_kind = rcuh_kind::TYPE; + break; + default: + error (_("Dwarf Error: wrong unit_type in compilation unit header " + "(is %#04x, should be one of: %s, %s, %s, %s or %s) " + "[in module %s]"), cu_header->unit_type, + dwarf_unit_type_name (DW_UT_compile), + dwarf_unit_type_name (DW_UT_skeleton), + dwarf_unit_type_name (DW_UT_split_compile), + dwarf_unit_type_name (DW_UT_type), + dwarf_unit_type_name (DW_UT_split_type), filename); + } + + cu_header->addr_size = read_1_byte (abfd, info_ptr); + info_ptr += 1; + } + cu_header->abbrev_sect_off = (sect_offset) read_offset (abfd, info_ptr, + cu_header, + &bytes_read); + info_ptr += bytes_read; + if (cu_header->version < 5) + { + cu_header->addr_size = read_1_byte (abfd, info_ptr); + info_ptr += 1; + } + signed_addr = bfd_get_sign_extend_vma (abfd); + if (signed_addr < 0) + internal_error (__FILE__, __LINE__, + _("read_comp_unit_head: dwarf from non elf file")); + cu_header->signed_addr_p = signed_addr; + + bool header_has_signature = section_kind == rcuh_kind::TYPE + || cu_header->unit_type == DW_UT_skeleton + || cu_header->unit_type == DW_UT_split_compile; + + if (header_has_signature) + { + cu_header->signature = read_8_bytes (abfd, info_ptr); + info_ptr += 8; + } + + if (section_kind == rcuh_kind::TYPE) + { + LONGEST type_offset; + type_offset = read_offset (abfd, info_ptr, cu_header, &bytes_read); + info_ptr += bytes_read; + cu_header->type_cu_offset_in_tu = (cu_offset) type_offset; + if (to_underlying (cu_header->type_cu_offset_in_tu) != type_offset) + error (_("Dwarf Error: Too big type_offset in compilation unit " + "header (is %s) [in module %s]"), plongest (type_offset), + filename); + } + + return info_ptr; +} + +/* Subroutine of read_and_check_comp_unit_head and + read_and_check_type_unit_head to simplify them. + Perform various error checking on the header. */ + +static void +error_check_comp_unit_head (struct dwarf2_per_objfile *dwarf2_per_objfile, + struct comp_unit_head *header, + struct dwarf2_section_info *section, + struct dwarf2_section_info *abbrev_section) +{ + const char *filename = section->get_file_name (); + + if (to_underlying (header->abbrev_sect_off) + >= abbrev_section->get_size (dwarf2_per_objfile->objfile)) + error (_("Dwarf Error: bad offset (%s) in compilation unit header " + "(offset %s + 6) [in module %s]"), + sect_offset_str (header->abbrev_sect_off), + sect_offset_str (header->sect_off), + filename); + + /* Cast to ULONGEST to use 64-bit arithmetic when possible to + avoid potential 32-bit overflow. */ + if (((ULONGEST) header->sect_off + header->get_length ()) + > section->size) + error (_("Dwarf Error: bad length (0x%x) in compilation unit header " + "(offset %s + 0) [in module %s]"), + header->length, sect_offset_str (header->sect_off), + filename); +} + +/* See comp-unit.h. */ + +const gdb_byte * +read_and_check_comp_unit_head (struct dwarf2_per_objfile *dwarf2_per_objfile, + struct comp_unit_head *header, + struct dwarf2_section_info *section, + struct dwarf2_section_info *abbrev_section, + const gdb_byte *info_ptr, + rcuh_kind section_kind) +{ + const gdb_byte *beg_of_comp_unit = info_ptr; + + header->sect_off = (sect_offset) (beg_of_comp_unit - section->buffer); + + info_ptr = read_comp_unit_head (header, info_ptr, section, section_kind); + + header->first_die_cu_offset = (cu_offset) (info_ptr - beg_of_comp_unit); + + error_check_comp_unit_head (dwarf2_per_objfile, header, section, + abbrev_section); + + return info_ptr; +} + +/* See comp-unit.h. */ + +LONGEST +read_offset (bfd *abfd, const gdb_byte *buf, + const struct comp_unit_head *cu_header, + unsigned int *bytes_read) +{ + LONGEST offset = read_offset (abfd, buf, cu_header->offset_size); + + *bytes_read = cu_header->offset_size; + return offset; +} diff --git a/gdb/dwarf2/comp-unit.h b/gdb/dwarf2/comp-unit.h new file mode 100644 index 00000000000..b4483ac1f7a --- /dev/null +++ b/gdb/dwarf2/comp-unit.h @@ -0,0 +1,114 @@ +/* Low-level DWARF 2 reading 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 . */ + +#ifndef GDB_DWARF2_COMP_UNIT_H +#define GDB_DWARF2_COMP_UNIT_H + +#include "gdbtypes.h" + +/* The data in a compilation unit header, after target2host + translation, looks like this. */ +struct comp_unit_head +{ + unsigned int length; + short version; + unsigned char addr_size; + unsigned char signed_addr_p; + sect_offset abbrev_sect_off; + + /* Size of file offsets; either 4 or 8. */ + unsigned int offset_size; + + /* Size of the length field; either 4 or 12. */ + unsigned int initial_length_size; + + enum dwarf_unit_type unit_type; + + /* Offset to the first byte of this compilation unit header in the + .debug_info section, for resolving relative reference dies. */ + sect_offset sect_off; + + /* Offset to first die in this cu from the start of the cu. + This will be the first byte following the compilation unit header. */ + cu_offset first_die_cu_offset; + + + /* 64-bit signature of this unit. For type units, it denotes the signature of + the type (DW_UT_type in DWARF 4, additionally DW_UT_split_type in DWARF 5). + Also used in DWARF 5, to denote the dwo id when the unit type is + DW_UT_skeleton or DW_UT_split_compile. */ + ULONGEST signature; + + /* For types, offset in the type's DIE of the type defined by this TU. */ + cu_offset type_cu_offset_in_tu; + + /* Return the total length of the CU described by this header. */ + unsigned int get_length () const + { + return initial_length_size + length; + } + + /* Return TRUE if OFF is within this CU. */ + bool offset_in_cu_p (sect_offset off) const + { + sect_offset bottom = sect_off; + sect_offset top = sect_off + get_length (); + return off >= bottom && off < top; + } +}; + +/* Expected enum dwarf_unit_type for read_comp_unit_head. */ +enum class rcuh_kind { COMPILE, TYPE }; + +/* Read in the comp unit header information from the debug_info at info_ptr. + Use rcuh_kind::COMPILE as the default type if not known by the caller. + NOTE: This leaves members offset, first_die_offset to be filled in + by the caller. */ +extern const gdb_byte *read_comp_unit_head + (struct comp_unit_head *cu_header, + const gdb_byte *info_ptr, + struct dwarf2_section_info *section, + rcuh_kind section_kind); + +/* Read in a CU/TU header and perform some basic error checking. + The contents of the header are stored in HEADER. + The result is a pointer to the start of the first DIE. */ +extern const gdb_byte *read_and_check_comp_unit_head + (struct dwarf2_per_objfile *dwarf2_per_objfile, + struct comp_unit_head *header, + struct dwarf2_section_info *section, + struct dwarf2_section_info *abbrev_section, + const gdb_byte *info_ptr, + rcuh_kind section_kind); + +/* Read an offset from the data stream. The size of the offset is + given by cu_header->offset_size. */ + +extern LONGEST read_offset (bfd *abfd, const gdb_byte *buf, + const struct comp_unit_head *cu_header, + unsigned int *bytes_read); + +#endif /* GDB_DWARF2_COMP_UNIT_H */ diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 9ab3dc24938..b7401d408ce 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -32,6 +32,7 @@ #include "dwarf2/read.h" #include "dwarf2/abbrev.h" #include "dwarf2/attribute.h" +#include "dwarf2/comp-unit.h" #include "dwarf2/index-cache.h" #include "dwarf2/index-common.h" #include "dwarf2/leb.h" @@ -340,43 +341,6 @@ dwop_section_names = /* local data types */ -/* The data in a compilation unit header, after target2host - translation, looks like this. */ -struct comp_unit_head -{ - unsigned int length; - short version; - unsigned char addr_size; - unsigned char signed_addr_p; - sect_offset abbrev_sect_off; - - /* Size of file offsets; either 4 or 8. */ - unsigned int offset_size; - - /* Size of the length field; either 4 or 12. */ - unsigned int initial_length_size; - - enum dwarf_unit_type unit_type; - - /* Offset to the first byte of this compilation unit header in the - .debug_info section, for resolving relative reference dies. */ - sect_offset sect_off; - - /* Offset to first die in this cu from the start of the cu. - This will be the first byte following the compilation unit header. */ - cu_offset first_die_cu_offset; - - - /* 64-bit signature of this unit. For type units, it denotes the signature of - the type (DW_UT_type in DWARF 4, additionally DW_UT_split_type in DWARF 5). - Also used in DWARF 5, to denote the dwo id when the unit type is - DW_UT_skeleton or DW_UT_split_compile. */ - ULONGEST signature; - - /* For types, offset in the type's DIE of the type defined by this TU. */ - cu_offset type_cu_offset_in_tu; -}; - /* Type used for delaying computation of method physnames. See comments for compute_delayed_physnames. */ struct delayed_method_info @@ -1286,10 +1250,6 @@ static LONGEST read_checked_initial_length_and_offset (bfd *, const gdb_byte *, const struct comp_unit_head *, unsigned int *, unsigned int *); -static LONGEST read_offset (bfd *, const gdb_byte *, - const struct comp_unit_head *, - unsigned int *); - static sect_offset read_abbrev_offset (struct dwarf2_per_objfile *dwarf2_per_objfile, struct dwarf2_section_info *, sect_offset); @@ -1517,8 +1477,6 @@ static const char *dwarf_tag_name (unsigned int); static const char *dwarf_attr_name (unsigned int); -static const char *dwarf_unit_type_name (int unit_type); - static const char *dwarf_form_name (unsigned int); static const char *dwarf_bool_name (unsigned int); @@ -1702,16 +1660,6 @@ struct file_and_directory static file_and_directory find_file_and_directory (struct die_info *die, struct dwarf2_cu *cu); -/* Expected enum dwarf_unit_type for read_comp_unit_head. */ -enum class rcuh_kind { COMPILE, TYPE }; - -static const gdb_byte *read_and_check_comp_unit_head - (struct dwarf2_per_objfile* dwarf2_per_objfile, - struct comp_unit_head *header, - struct dwarf2_section_info *section, - struct dwarf2_section_info *abbrev_section, const gdb_byte *info_ptr, - rcuh_kind section_kind); - static htab_up allocate_signatured_type_table (struct objfile *objfile); static htab_up allocate_dwo_unit_table (struct objfile *objfile); @@ -5885,25 +5833,6 @@ dwarf2_build_psymtabs (struct objfile *objfile) } } -/* Return the total length of the CU described by HEADER. */ - -static unsigned int -get_cu_length (const struct comp_unit_head *header) -{ - return header->initial_length_size + header->length; -} - -/* Return TRUE if SECT_OFF is within CU_HEADER. */ - -static inline bool -offset_in_cu_p (const comp_unit_head *cu_header, sect_offset sect_off) -{ - sect_offset bottom = cu_header->sect_off; - sect_offset top = cu_header->sect_off + get_cu_length (cu_header); - - return sect_off >= bottom && sect_off < top; -} - /* Find the base address of the compilation unit for range lists and location lists. It will normally be specified by DW_AT_low_pc. In DWARF-3 draft 4, the base address could be overridden by @@ -5935,120 +5864,6 @@ dwarf2_find_base_address (struct die_info *die, struct dwarf2_cu *cu) } } -/* Read in the comp unit header information from the debug_info at info_ptr. - Use rcuh_kind::COMPILE as the default type if not known by the caller. - NOTE: This leaves members offset, first_die_offset to be filled in - by the caller. */ - -static const gdb_byte * -read_comp_unit_head (struct comp_unit_head *cu_header, - const gdb_byte *info_ptr, - struct dwarf2_section_info *section, - rcuh_kind section_kind) -{ - int signed_addr; - unsigned int bytes_read; - const char *filename = section->get_file_name (); - bfd *abfd = section->get_bfd_owner (); - - cu_header->length = read_initial_length (abfd, info_ptr, &bytes_read); - cu_header->initial_length_size = bytes_read; - cu_header->offset_size = (bytes_read == 4) ? 4 : 8; - info_ptr += bytes_read; - cu_header->version = read_2_bytes (abfd, info_ptr); - if (cu_header->version < 2 || cu_header->version > 5) - error (_("Dwarf Error: wrong version in compilation unit header " - "(is %d, should be 2, 3, 4 or 5) [in module %s]"), - cu_header->version, filename); - info_ptr += 2; - if (cu_header->version < 5) - switch (section_kind) - { - case rcuh_kind::COMPILE: - cu_header->unit_type = DW_UT_compile; - break; - case rcuh_kind::TYPE: - cu_header->unit_type = DW_UT_type; - break; - default: - internal_error (__FILE__, __LINE__, - _("read_comp_unit_head: invalid section_kind")); - } - else - { - cu_header->unit_type = static_cast - (read_1_byte (abfd, info_ptr)); - info_ptr += 1; - switch (cu_header->unit_type) - { - case DW_UT_compile: - case DW_UT_partial: - case DW_UT_skeleton: - case DW_UT_split_compile: - if (section_kind != rcuh_kind::COMPILE) - error (_("Dwarf Error: wrong unit_type in compilation unit header " - "(is %s, should be %s) [in module %s]"), - dwarf_unit_type_name (cu_header->unit_type), - dwarf_unit_type_name (DW_UT_type), filename); - break; - case DW_UT_type: - case DW_UT_split_type: - section_kind = rcuh_kind::TYPE; - break; - default: - error (_("Dwarf Error: wrong unit_type in compilation unit header " - "(is %#04x, should be one of: %s, %s, %s, %s or %s) " - "[in module %s]"), cu_header->unit_type, - dwarf_unit_type_name (DW_UT_compile), - dwarf_unit_type_name (DW_UT_skeleton), - dwarf_unit_type_name (DW_UT_split_compile), - dwarf_unit_type_name (DW_UT_type), - dwarf_unit_type_name (DW_UT_split_type), filename); - } - - cu_header->addr_size = read_1_byte (abfd, info_ptr); - info_ptr += 1; - } - cu_header->abbrev_sect_off = (sect_offset) read_offset (abfd, info_ptr, - cu_header, - &bytes_read); - info_ptr += bytes_read; - if (cu_header->version < 5) - { - cu_header->addr_size = read_1_byte (abfd, info_ptr); - info_ptr += 1; - } - signed_addr = bfd_get_sign_extend_vma (abfd); - if (signed_addr < 0) - internal_error (__FILE__, __LINE__, - _("read_comp_unit_head: dwarf from non elf file")); - cu_header->signed_addr_p = signed_addr; - - bool header_has_signature = section_kind == rcuh_kind::TYPE - || cu_header->unit_type == DW_UT_skeleton - || cu_header->unit_type == DW_UT_split_compile; - - if (header_has_signature) - { - cu_header->signature = read_8_bytes (abfd, info_ptr); - info_ptr += 8; - } - - if (section_kind == rcuh_kind::TYPE) - { - LONGEST type_offset; - type_offset = read_offset (abfd, info_ptr, cu_header, &bytes_read); - info_ptr += bytes_read; - cu_header->type_cu_offset_in_tu = (cu_offset) type_offset; - if (to_underlying (cu_header->type_cu_offset_in_tu) != type_offset) - error (_("Dwarf Error: Too big type_offset in compilation unit " - "header (is %s) [in module %s]"), plongest (type_offset), - filename); - } - - return info_ptr; -} - /* Helper function that returns the proper abbrev section for THIS_CU. */ @@ -6066,62 +5881,6 @@ get_abbrev_section_for_cu (struct dwarf2_per_cu_data *this_cu) return abbrev; } -/* Subroutine of read_and_check_comp_unit_head and - read_and_check_type_unit_head to simplify them. - Perform various error checking on the header. */ - -static void -error_check_comp_unit_head (struct dwarf2_per_objfile *dwarf2_per_objfile, - struct comp_unit_head *header, - struct dwarf2_section_info *section, - struct dwarf2_section_info *abbrev_section) -{ - const char *filename = section->get_file_name (); - - if (to_underlying (header->abbrev_sect_off) - >= abbrev_section->get_size (dwarf2_per_objfile->objfile)) - error (_("Dwarf Error: bad offset (%s) in compilation unit header " - "(offset %s + 6) [in module %s]"), - sect_offset_str (header->abbrev_sect_off), - sect_offset_str (header->sect_off), - filename); - - /* Cast to ULONGEST to use 64-bit arithmetic when possible to - avoid potential 32-bit overflow. */ - if (((ULONGEST) header->sect_off + get_cu_length (header)) - > section->size) - error (_("Dwarf Error: bad length (0x%x) in compilation unit header " - "(offset %s + 0) [in module %s]"), - header->length, sect_offset_str (header->sect_off), - filename); -} - -/* Read in a CU/TU header and perform some basic error checking. - The contents of the header are stored in HEADER. - The result is a pointer to the start of the first DIE. */ - -static const gdb_byte * -read_and_check_comp_unit_head (struct dwarf2_per_objfile *dwarf2_per_objfile, - struct comp_unit_head *header, - struct dwarf2_section_info *section, - struct dwarf2_section_info *abbrev_section, - const gdb_byte *info_ptr, - rcuh_kind section_kind) -{ - const gdb_byte *beg_of_comp_unit = info_ptr; - - header->sect_off = (sect_offset) (beg_of_comp_unit - section->buffer); - - info_ptr = read_comp_unit_head (header, info_ptr, section, section_kind); - - header->first_die_cu_offset = (cu_offset) (info_ptr - beg_of_comp_unit); - - error_check_comp_unit_head (dwarf2_per_objfile, header, section, - abbrev_section); - - return info_ptr; -} - /* Fetch the abbreviation table offset from a comp or type unit header. */ static sect_offset @@ -6307,7 +6066,7 @@ create_debug_type_hash_table (struct dwarf2_per_objfile *dwarf2_per_objfile, ptr = read_and_check_comp_unit_head (dwarf2_per_objfile, &header, section, abbrev_section, ptr, section_kind); - length = get_cu_length (&header); + length = header.get_length (); /* Skip dummy type units. */ if (ptr >= info_ptr + length @@ -6843,7 +6602,7 @@ read_cutu_die_from_dwo (struct dwarf2_per_cu_data *this_cu, gdb_assert (dwo_unit->sect_off == cu->header.sect_off); /* For DWOs coming from DWP files, we don't know the CU length nor the type's offset in the TU until now. */ - dwo_unit->length = get_cu_length (&cu->header); + dwo_unit->length = cu->header.get_length (); dwo_unit->type_offset_in_tu = cu->header.type_cu_offset_in_tu; /* Establish the type offset that can be used to lookup the type. @@ -6860,7 +6619,7 @@ read_cutu_die_from_dwo (struct dwarf2_per_cu_data *this_cu, gdb_assert (dwo_unit->sect_off == cu->header.sect_off); /* For DWOs coming from DWP files, we don't know the CU length until now. */ - dwo_unit->length = get_cu_length (&cu->header); + dwo_unit->length = cu->header.get_length (); } *result_dwo_abbrev_table @@ -7124,7 +6883,7 @@ cutu_reader::cutu_reader (struct dwarf2_per_cu_data *this_cu, /* LENGTH has not been set yet for type units if we're using .gdb_index. */ - this_cu->length = get_cu_length (&cu->header); + this_cu->length = cu->header.get_length (); /* Establish the type offset that can be used to lookup the type. */ sig_type->type_offset_in_section = @@ -7141,7 +6900,7 @@ cutu_reader::cutu_reader (struct dwarf2_per_cu_data *this_cu, rcuh_kind::COMPILE); gdb_assert (this_cu->sect_off == cu->header.sect_off); - gdb_assert (this_cu->length == get_cu_length (&cu->header)); + gdb_assert (this_cu->length == cu->header.get_length ()); this_cu->dwarf_version = cu->header.version; } } @@ -7297,7 +7056,7 @@ cutu_reader::cutu_reader (struct dwarf2_per_cu_data *this_cu, m_new_cu->str_offsets_base = parent_cu->str_offsets_base; m_new_cu->addr_base = parent_cu->addr_base; } - this_cu->length = get_cu_length (&m_new_cu->header); + this_cu->length = m_new_cu->header.get_length (); /* Skip dummy compilation units. */ if (info_ptr >= begin_info_ptr + this_cu->length @@ -13593,7 +13352,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) sect_offset sect_off = (sect_offset) dwarf2_get_ref_die_offset (origin); - if (!offset_in_cu_p (&cu->header, sect_off)) + if (!cu->header.offset_in_cu_p (sect_off)) { /* As DW_OP_GNU_parameter_ref uses CU-relative offset this binding can be done only inside one CU. Such referenced DIE @@ -18479,7 +18238,7 @@ find_partial_die (sect_offset sect_off, int offset_in_dwz, struct dwarf2_cu *cu) struct partial_die_info *pd = NULL; if (offset_in_dwz == cu->per_cu->is_dwz - && offset_in_cu_p (&cu->header, sect_off)) + && cu->header.offset_in_cu_p (sect_off)) { pd = cu->find_partial_die (sect_off); if (pd != NULL) @@ -19068,20 +18827,6 @@ read_checked_initial_length_and_offset (bfd *abfd, const gdb_byte *buf, return length; } -/* Read an offset from the data stream. The size of the offset is - given by cu_header->offset_size. */ - -static LONGEST -read_offset (bfd *abfd, const gdb_byte *buf, - const struct comp_unit_head *cu_header, - unsigned int *bytes_read) -{ - LONGEST offset = read_offset (abfd, buf, cu_header->offset_size); - - *bytes_read = cu_header->offset_size; - return offset; -} - static const gdb_byte * read_n_bytes (bfd *abfd, const gdb_byte *buf, unsigned int size) { @@ -22244,33 +21989,6 @@ dwarf_attr_name (unsigned attr) return name; } -/* Convert a unit type to corresponding DW_UT name. */ - -static const char * -dwarf_unit_type_name (int unit_type) { - switch (unit_type) - { - case 0x01: - return "DW_UT_compile (0x01)"; - case 0x02: - return "DW_UT_type (0x02)"; - case 0x03: - return "DW_UT_partial (0x03)"; - case 0x04: - return "DW_UT_skeleton (0x04)"; - case 0x05: - return "DW_UT_split_compile (0x05)"; - case 0x06: - return "DW_UT_split_type (0x06)"; - case 0x80: - return "DW_UT_lo_user (0x80)"; - case 0xff: - return "DW_UT_hi_user (0xff)"; - default: - return nullptr; - } -} - /* Convert a DWARF value form code into its string name. */ static const char * @@ -22576,11 +22294,11 @@ follow_die_offset (sect_offset sect_off, int offset_in_dwz, /* .debug_types CUs cannot reference anything outside their CU. If they need to, they have to reference a signatured type via DW_FORM_ref_sig8. */ - if (!offset_in_cu_p (&cu->header, sect_off)) + if (!cu->header.offset_in_cu_p (sect_off)) return NULL; } else if (offset_in_dwz != cu->per_cu->is_dwz - || !offset_in_cu_p (&cu->header, sect_off)) + || !cu->header.offset_in_cu_p (sect_off)) { struct dwarf2_per_cu_data *per_cu;