From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd36.google.com (mail-io1-xd36.google.com [IPv6:2607:f8b0:4864:20::d36]) by sourceware.org (Postfix) with ESMTPS id 8CFD73858D32 for ; Mon, 17 Oct 2022 19:41:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8CFD73858D32 Received: by mail-io1-xd36.google.com with SMTP id d142so9985828iof.7 for ; Mon, 17 Oct 2022 12:41:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=7ovXRXmDO/kwYCVvhYfMA+HCMokazBIOS5vNjkhjfJs=; b=SUImV5O1wXjvJ57xSG59SHZSwJ8nV7p5E0qSKpLNQgiTDG8iKnYtHlU898WZXVOvBy 1GvO5D3nP+GxrLfeUhZAf5ARLEPIF8pS7vfTbC9bxWKlYLlYf7YGZbV/Y/qP/IOlafk9 uOvg2qfm+YNUhURFC4J8opzB/Dr1iLpL+c7KutbQfV3o9zrYeZb5D2ALyxpGwueZZlhv YEwIa0SvWaDc/9Esl9ogyoBwZlS9xr6jEvJhSIyNUc0z+ZTQv8Mr5kvEgRqPcNDk1JCr LlPGWldd36g+v0gyTIUfsnScn4fA/8EFaRXq4T3EOcpI2bcGVELCNqHUXo3/XtBtj3o8 3l+A== X-Gm-Message-State: ACrzQf0mfqFl2xNc4TzfuLLiUx6uw3DPA6Z8GwlBYACa+UrjcXQjxGgK 4C4gBfGSEQceqkLvJS1AwxQI5aMooV+hJw== X-Google-Smtp-Source: AMsMyM4rV9O8e7IaGcqUpwklynMmeMJY72WGDiOtgudtkxeo2Dzl7MUWxZs+HBuYRiIR809MUf3Z1g== X-Received: by 2002:a6b:5f17:0:b0:6bb:e3d9:8abd with SMTP id t23-20020a6b5f17000000b006bbe3d98abdmr5200648iob.51.1666035687783; Mon, 17 Oct 2022 12:41:27 -0700 (PDT) Received: from localhost.localdomain (71-211-181-169.hlrn.qwest.net. [71.211.181.169]) by smtp.gmail.com with ESMTPSA id h17-20020a056638063100b00363ad9656eesm234268jar.165.2022.10.17.12.41.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Oct 2022 12:41:27 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH] Fix incorrect .gdb_index with new DWARF scanner Date: Mon, 17 Oct 2022 13:41:18 -0600 Message-Id: <20221017194118.2129436-1-tromey@adacore.com> X-Mailer: git-send-email 2.34.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 Oct 2022 19:41:30 -0000 PR symtab/29694 points out a regression caused by the new DWARF scanner when the cc-with-gdb-index target board is used. What happens here is that an older version of gdb will make an index describing the "A" type as: [737] A: 1 [global, type] whereas the new gdb says: [1008] A: 0 [global, type] Here the old one is correct because the A in CU 0 is just a declaration without a size: <1><45>: Abbrev Number: 10 (DW_TAG_structure_type) <46> DW_AT_name : A <48> DW_AT_declaration : 1 <48> DW_AT_sibling : <0x6d> This patch fixes the problem by introducing the idea of a "type declaration". I think gdb still needs to recurse into these types, searching for methods, but by marking the type itself as a declaration, gdb can skip this type during lookups and when writing the index. Regression tested on x86-64 using the cc-with-gdb-index board. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29694 --- gdb/dwarf2/cooked-index.h | 15 +++++++++++++++ gdb/dwarf2/index-write.c | 5 +++++ gdb/dwarf2/read.c | 22 ++++++++++++++-------- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h index f3c26480a81..2ea32781be5 100644 --- a/gdb/dwarf2/cooked-index.h +++ b/gdb/dwarf2/cooked-index.h @@ -48,6 +48,9 @@ enum cooked_index_flag_enum : unsigned char IS_ENUM_CLASS = 4, /* True if this entry uses the linkage name. */ IS_LINKAGE = 8, + /* True if this entry is just for the declaration of a type, not the + definition. */ + IS_TYPE_DECLARATION = 16, }; DEF_ENUM_FLAGS_TYPE (enum cooked_index_flag_enum, cooked_index_flag); @@ -76,6 +79,10 @@ struct cooked_index_entry : public allocate_on_obstack /* Return true if this entry matches SEARCH_FLAGS. */ bool matches (block_search_flags search_flags) const { + /* Just reject type declarations. */ + if ((flags & IS_TYPE_DECLARATION) != 0) + return false; + if ((search_flags & SEARCH_STATIC_BLOCK) != 0 && (flags & IS_STATIC) != 0) return true; @@ -88,6 +95,10 @@ struct cooked_index_entry : public allocate_on_obstack /* Return true if this entry matches DOMAIN. */ bool matches (domain_enum domain) const { + /* Just reject type declarations. */ + if ((flags & IS_TYPE_DECLARATION) != 0) + return false; + switch (domain) { case LABEL_DOMAIN: @@ -106,6 +117,10 @@ struct cooked_index_entry : public allocate_on_obstack /* Return true if this entry matches KIND. */ bool matches (enum search_domain kind) const { + /* Just reject type declarations. */ + if ((flags & IS_TYPE_DECLARATION) != 0) + return false; + switch (kind) { case VARIABLES_DOMAIN: diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c index f592734addc..3d215a6307b 100644 --- a/gdb/dwarf2/index-write.c +++ b/gdb/dwarf2/index-write.c @@ -1167,6 +1167,11 @@ write_cooked_index (cooked_index_vector *table, be redundant are rare and not worth supporting. */ continue; } + else if ((entry->flags & IS_TYPE_DECLARATION) != 0) + { + /* Don't add type declarations to the index. */ + continue; + } gdb_index_symbol_kind kind; if (entry->tag == DW_TAG_subprogram) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index b5efcb3cc09..e849f62576d 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -18192,14 +18192,20 @@ cooked_indexer::scan_attributes (dwarf2_per_cu_data *scanning_per_cu, that is ok. Similarly, we allow an external variable without a location; those are resolved via minimal symbols. */ if (is_declaration && !for_specification - && !(abbrev->tag == DW_TAG_variable && (*flags & IS_STATIC) == 0) - && !((abbrev->tag == DW_TAG_class_type - || abbrev->tag == DW_TAG_structure_type - || abbrev->tag == DW_TAG_union_type) - && abbrev->has_children)) - { - *linkage_name = nullptr; - *name = nullptr; + && !(abbrev->tag == DW_TAG_variable && (*flags & IS_STATIC) == 0)) + { + /* We always want to recurse into some types, but we may not + want to treat them as definitions. */ + if ((abbrev->tag == DW_TAG_class_type + || abbrev->tag == DW_TAG_structure_type + || abbrev->tag == DW_TAG_union_type) + && abbrev->has_children) + *flags |= IS_TYPE_DECLARATION; + else + { + *linkage_name = nullptr; + *name = nullptr; + } } else if ((*name == nullptr || (*linkage_name == nullptr -- 2.34.3