From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 84661 invoked by alias); 9 Sep 2019 18:58:11 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 84540 invoked by uid 89); 9 Sep 2019 18:58:11 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.1 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=greatly, accustomed, COMPILE, mistakes X-HELO: mail-ua1-f74.google.com Received: from mail-ua1-f74.google.com (HELO mail-ua1-f74.google.com) (209.85.222.74) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 09 Sep 2019 18:58:08 +0000 Received: by mail-ua1-f74.google.com with SMTP id 13so1979724uag.22 for ; Mon, 09 Sep 2019 11:58:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc:content-transfer-encoding; bh=KDX5EBnRUMPGl8+ZdvaI/PaC9V+vqBbXzs3YNXuEOC0=; b=YRbQlr+IrhO78QQ5QpminJuUNvHkSsi51TNDMJeEmgUIvNPM/oJ8HCQOOpqE5YEtYX mactHdJDrE+xzU6kIWTbsD+u8I3jRF6nSCJKBFjAZVeKFvI1KfMNGEMZyYE+2jjBNnak o1SlQuLMuN/P0vYk1aMy7GKv9P9IwGqHWpWMPc9wR0647a+MBX947auPDjXsgVQ63YV3 HIuW+jNKneA90Vfc1/VeUVWfS6VXf7TsdyWZl/dwxa2XJCdaG2CatzJFBPKwcVEJwUpC wkf4Bz8iCt0nqKQSGK5x+Pt6u5FxociwvGECxENLNWdabpp+7fwm3/+MHH/ufxxkh3rn T/pw== Date: Mon, 09 Sep 2019 18:58:00 -0000 In-Reply-To: <4caf107e-8766-8a6d-df57-b824c287fa70@simark.ca> Message-Id: <20190909185803.182231-1-tamur@google.com> Mime-Version: 1.0 References: <4caf107e-8766-8a6d-df57-b824c287fa70@simark.ca> Subject: [PATCH v2 1/4] DWARF 5 support: Handle dwo_id From: "Ali Tamur via gdb-patches" Reply-To: Ali Tamur To: gdb-patches@sourceware.org Cc: Ali Tamur Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes X-SW-Source: 2019-09/txt/msg00144.txt.bz2 > Since you're touching the split-DWARF code, it might be a good idea to ru= n the whole > testsuite with -gsplit-dwarf, with DWARF 4 (to verify there are no regres= sions) and > DWARF 5 (to check how things improve).=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20 Done. Both with and without -gsplit-dwarf the set of tests that fail is=20= =20=20=20=20=20=20=20=20=20 identical. This is expected as unless I introduced a bug, there should be n= o=20=20=20=20=20 behavioral change at all for DWARF 4. I also ran the testsuite with -gdwarf= -5=20=20=20=20 and the number of failures went down from 32687 to 1163, but until gdb can= =20=20=20=20=20=20=20 handle 'hello world' (hopefully at the end my patch series) I think that is= =20=20=20=20=20=20 not a very meaningful metric.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20 > And since DWARF 5 is relatively new stuff, results can vary greatly if us= ing different versions of the > same compiler to run the tests. =C2=A0So if you could mention in the comm= it message which gcc version the > tests were ran against, I think it would be useful.=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 Updated the commit message to include the gcc version (8.3.0).=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20 > I would say that the same change should be done in dwo_unit then. =C2=A0B= ut I totally > agree that we should not mix up cleanups with adding new features. =C2=A0= So here's=20=20 > what I suggest: revert the field in comp_unit_head to be just `signature`= for=20=20 > now, it will avoid having too many unrelated changes in this patch (updat= ed all > the users of that field). =C2=A0We'll make a following cleanup patch to e= ither rename > the field or introduce a union.=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20 Done.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20 > Space before parenthesis. =C2=A0Applies to the rest of the patch, for bot= h=20=20=20=20=20=20=20=20=20=20 > function signatures and calls.=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20 Done.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20 > Let's use %s and dwarf_unit_type_name to print DW_UT_type here, as you di= d below. Done.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20 > This comment needs to be updated (the last part).=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 Done.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20 > Ref: https://sourceware.org/gdb/wiki/Internals%20GDB-C-Coding-Standards#C= omparison_With_NULL_And_Zero Done.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20 > Is there a reason for this function to now take `reader` rather than `thi= s_cu`? =C2=A0At first > sight, I don't see why this change is needed or why it would help.=20=20= =20=20=20=20=20=20=20=20=20=20=20 Done.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20 > Format the switch-case like:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20 Done.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20 Sorry for the style mistakes; I am accustomed to a different style and also= =20=20=20=20=20=20 have become too dependent on clang-tidy. --- * DW_UT_skeleton and DW_UT_split_compile compilation units have dwo ids to match the compilation unit in the skeleton and .dwo files. The dwo_id is in the header. Tested with CC=3D/usr/bin/gcc (version 8.3.0) against master branch (also w= ith -gsplit-dwarf and -gdwarf-4 flags) and there was no increase in the set of tests that fails. This is part of an effort to support DWARF 5 in gdb. gdb/ChangeLog:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20 * gdb/dwarf2read.c (comp_unit_head): Update comment.=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 (dwarf2_dwo_name): New function declaration.=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 (dwarf_unit_type_name): New function declaration.=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 (read_comp_unit_head): Add support for new compilation units,=20=20= =20=20=20=20=20=20=20=20=20=20 DW_UT_partial, DW_UT_skeleton, DW_UT_split_compile, DW_UT_split_typ= e.=20=20=20=20 Particularly, DW_UT_skeleton and DW_UT_split_compile have dwo_id=20= =20=20=20=20=20=20=20=20 (currently named as "signature") in their header. Also clarify erro= r=20=20=20=20=20 messages.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 (lookup_dwo_id): New function. Returns the dwo id of the given=20= =20=20=20=20=20=20=20=20=20=20 compile unit.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 (lookup_dwo_unit): Use the new lookup_dwo_id function.=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 (init_cutu_and_read_dies): Use the new dwarf2_dwo_name and lookup_d= wo_id=20 functions.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 (create_dwo_cu_reader): Use the added lookup_dwo_id function.=20=20= =20=20=20=20=20=20=20=20=20=20 (dwarf2_dwo_name): Get the dwo name if present.=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 (dwarf_unit_type_name): Convert DW_UT_* types to string for diagnos= tic=20=20=20 purposes. --- gdb/dwarf2read.c | 119 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 94 insertions(+), 25 deletions(-) diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index fb888da7b8..fc30ddccd0 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -373,8 +373,11 @@ struct comp_unit_head This will be the first byte following the compilation unit header. */ cu_offset first_die_cu_offset; =20 - /* 64-bit signature of this type unit - it is valid only for - UNIT_TYPE DW_UT_type. */ + + /* 64-bit signature of this unit. For type units, it denotes the signatu= re of + the type (DW_UT_type in DWARF 4, additionally DW_UT_split_type in DWA= RF 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; =20 /* For types, offset in the type's DIE of the type defined by this TU. = */ @@ -1579,6 +1582,8 @@ static struct attribute *dwarf2_attr_no_follow (struc= t die_info *, static const char *dwarf2_string_attr (struct die_info *die, unsigned int = name, struct dwarf2_cu *cu); =20 +static const char *dwarf2_dwo_name (struct die_info *die, struct dwarf2_cu= *cu); + static int dwarf2_flag_true_p (struct die_info *die, unsigned name, struct dwarf2_cu *cu); =20 @@ -1761,6 +1766,8 @@ static const char *dwarf_tag_name (unsigned int); =20 static const char *dwarf_attr_name (unsigned int); =20 +static const char *dwarf_unit_type_name (int unit_type); + static const char *dwarf_form_name (unsigned int); =20 static const char *dwarf_bool_name (unsigned int); @@ -6390,18 +6397,28 @@ read_comp_unit_head (struct comp_unit_head *cu_head= er, 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 !=3D rcuh_kind::COMPILE) error (_("Dwarf Error: wrong unit_type in compilation unit header " - "(is DW_UT_compile, should be DW_UT_type) [in module %s]"), - filename); + "(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 =3D rcuh_kind::TYPE; break; default: error (_("Dwarf Error: wrong unit_type in compilation unit header " - "(is %d, should be %d or %d) [in module %s]"), - cu_header->unit_type, DW_UT_compile, DW_UT_type, filename); + "(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); } =20 cu_header->addr_size =3D read_1_byte (abfd, info_ptr); @@ -6422,13 +6439,19 @@ read_comp_unit_head (struct comp_unit_head *cu_head= er, _("read_comp_unit_head: dwarf from non elf file")); cu_header->signed_addr_p =3D signed_addr; =20 - if (section_kind =3D=3D rcuh_kind::TYPE) - { - LONGEST type_offset; + bool header_has_signature =3D section_kind =3D=3D rcuh_kind::TYPE + || cu_header->unit_type =3D=3D DW_UT_skeleton + || cu_header->unit_type =3D=3D DW_UT_split_compile; =20 + if (header_has_signature) + { cu_header->signature =3D read_8_bytes (abfd, info_ptr); info_ptr +=3D 8; + } =20 + if (section_kind =3D=3D rcuh_kind::TYPE) + { + LONGEST type_offset; type_offset =3D read_offset (abfd, info_ptr, cu_header, &bytes_read); info_ptr +=3D bytes_read; cu_header->type_cu_offset_in_tu =3D (cu_offset) type_offset; @@ -7297,6 +7320,21 @@ read_cutu_die_from_dwo (struct dwarf2_per_cu_data *t= his_cu, return 1; } =20 +/* Return the signature of the compile unit, if found. In DWARF 4 and befo= re, + the signature is in the DW_AT_GNU_dwo_id attribute. In DWARF 5 and late= r, the + signature is part of the header. */ +static gdb::optional +lookup_dwo_id (struct dwarf2_cu *cu, struct die_info* comp_unit_die) +{ + if (cu->header.version >=3D 5) + return cu->header.signature; + struct attribute *attr; + attr =3D dwarf2_attr (comp_unit_die, DW_AT_GNU_dwo_id, cu); + if (attr =3D=3D nullptr) + return gdb::optional (); + return DW_UNSND (attr); +} + /* Subroutine of init_cutu_and_read_dies to simplify it. Look up the DWO unit specified by COMP_UNIT_DIE of THIS_CU. Returns NULL if the specified DWO unit cannot be found. */ @@ -7306,14 +7344,13 @@ lookup_dwo_unit (struct dwarf2_per_cu_data *this_cu, struct die_info *comp_unit_die) { struct dwarf2_cu *cu =3D this_cu->cu; - ULONGEST signature; struct dwo_unit *dwo_unit; const char *comp_dir, *dwo_name; =20 gdb_assert (cu !=3D NULL); =20 /* Yeah, we look dwo_name up again, but it simplifies the code. */ - dwo_name =3D dwarf2_string_attr (comp_unit_die, DW_AT_GNU_dwo_name, cu); + dwo_name =3D dwarf2_dwo_name (comp_unit_die, cu); comp_dir =3D dwarf2_string_attr (comp_unit_die, DW_AT_comp_dir, cu); =20 if (this_cu->is_debug_types) @@ -7323,21 +7360,17 @@ lookup_dwo_unit (struct dwarf2_per_cu_data *this_cu, /* Since this_cu is the first member of struct signatured_type, we can go from a pointer to one to a pointer to the other. */ sig_type =3D (struct signatured_type *) this_cu; - signature =3D sig_type->signature; dwo_unit =3D lookup_dwo_type_unit (sig_type, dwo_name, comp_dir); } else { - struct attribute *attr; - - attr =3D dwarf2_attr (comp_unit_die, DW_AT_GNU_dwo_id, cu); - if (! attr) + gdb::optional signature =3D lookup_dwo_id (cu, comp_unit_d= ie); + if (!signature.has_value ()) error (_("Dwarf Error: missing dwo_id for dwo_name %s" " [in module %s]"), dwo_name, objfile_name (this_cu->dwarf2_per_objfile->objfile)); - signature =3D DW_UNSND (attr); dwo_unit =3D lookup_dwo_comp_unit (this_cu, dwo_name, comp_dir, - signature); + *signature); } =20 return dwo_unit; @@ -7449,7 +7482,6 @@ init_cutu_and_read_dies (struct dwarf2_per_cu_data *t= his_cu, struct die_reader_specs reader; struct die_info *comp_unit_die; int has_children; - struct attribute *attr; struct signatured_type *sig_type =3D NULL; struct dwarf2_section_info *abbrev_section; /* Non-zero if CU currently points to a DWO file and we need to @@ -7586,9 +7618,9 @@ init_cutu_and_read_dies (struct dwarf2_per_cu_data *t= his_cu, =20 Note that if USE_EXISTING_OK !=3D 0, and THIS_CU->cu already contains= a DWO CU, that this test will fail (the attribute will not be present).= */ - attr =3D dwarf2_attr (comp_unit_die, DW_AT_GNU_dwo_name, cu); + const char *dwo_name =3D dwarf2_dwo_name (comp_unit_die, cu); abbrev_table_up dwo_abbrev_table; - if (attr) + if (dwo_name !=3D nullptr) { struct dwo_unit *dwo_unit; struct die_info *dwo_comp_unit_die; @@ -11839,10 +11871,9 @@ create_dwo_cu_reader (const struct die_reader_spec= s *reader, struct create_dwo_cu_data *data =3D (struct create_dwo_cu_data *) datap; struct dwo_file *dwo_file =3D data->dwo_file; struct dwo_unit *dwo_unit =3D &data->dwo_unit; - struct attribute *attr; =20 - attr =3D dwarf2_attr (comp_unit_die, DW_AT_GNU_dwo_id, cu); - if (attr =3D=3D NULL) + gdb::optional signature =3D lookup_dwo_id (cu, comp_unit_die); + if (!signature.has_value ()) { complaint (_("Dwarf Error: debug entry at offset %s is missing" " its dwo_id [in module %s]"), @@ -11851,7 +11882,7 @@ create_dwo_cu_reader (const struct die_reader_specs= *reader, } =20 dwo_unit->dwo_file =3D dwo_file; - dwo_unit->signature =3D DW_UNSND (attr); + dwo_unit->signature =3D *signature; dwo_unit->section =3D section; dwo_unit->sect_off =3D sect_off; dwo_unit->length =3D cu->per_cu->length; @@ -20113,6 +20144,17 @@ dwarf2_string_attr (struct die_info *die, unsigned= int name, struct dwarf2_cu *c return str; } =20 +/* Return the dwo name or NULL if not present. If present, it is in either + DW_AT_GNU_dwo_name or DW_AT_dwo_name atrribute. */ +static const char * +dwarf2_dwo_name (struct die_info *die, struct dwarf2_cu *cu) +{ + const char *dwo_name =3D dwarf2_string_attr (die, DW_AT_GNU_dwo_name, cu= ); + if (dwo_name =3D=3D nullptr) + dwo_name =3D dwarf2_string_attr (die, DW_AT_dwo_name, cu); + return dwo_name; +} + /* Return non-zero iff the attribute NAME is defined for the given DIE, and holds a non-zero value. This function should only be used for DW_FORM_flag or DW_FORM_flag_present attributes. */ @@ -22812,6 +22854,33 @@ dwarf_attr_name (unsigned attr) return name; } =20 +/* 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. */ =20 static const char * --=20 2.23.0.187.g17f5b7556c-goog