From patchwork Wed Nov 10 09:20:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 47380 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 158BA3857C40 for ; Wed, 10 Nov 2021 09:24:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 158BA3857C40 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1636536243; bh=iUeUw2De3dcbSePIbrX/l77XagDbtC2ueKqoNIEIglw=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=QH7tMmAggVXP1I6m6ZTgxC+P+deoUoiSnGXmFB/eALoidvvX0kXGBGxfOTsCtsbnk 2e+jtPhZP72HjpSbOITINbQ87QI+EBz4YSCoZq69EqX0YqdnhB325DTu+O9gkr6kza Z3AOUIpsWu8tMHR82gWqXn7KGgmc13mFdtUXx7M8= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTPS id 2FDAC3857C69 for ; Wed, 10 Nov 2021 09:20:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2FDAC3857C69 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-491-ucMyV2VDNGWzATHa-3pOQQ-1; Wed, 10 Nov 2021 04:20:48 -0500 X-MC-Unique: ucMyV2VDNGWzATHa-3pOQQ-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 16A81425C9; Wed, 10 Nov 2021 09:20:47 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.54]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8FE371007605; Wed, 10 Nov 2021 09:20:46 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.16.1/8.16.1) with ESMTPS id 1AA9Kh5q803437 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Wed, 10 Nov 2021 10:20:43 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.16.1/8.16.1/Submit) id 1AA9KgVU803436; Wed, 10 Nov 2021 10:20:42 +0100 Date: Wed, 10 Nov 2021 10:20:42 +0100 To: Jason Merrill , Richard Biener , Eric Botcazou Subject: [PATCH] dwarf2out: Fix up field_byte_offset [PR101378] Message-ID: <20211110092042.GE2710@tucnak> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline X-Spam-Status: No, score=-5.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jakub Jelinek via Gcc-patches From: Jakub Jelinek Reply-To: Jakub Jelinek Cc: gcc-patches@gcc.gnu.org Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi! For PCC_BITFIELD_TYPE_MATTERS field_byte_offset has quite large code to deal with it since many years ago (see it e.g. in GCC 3.2, although it used to be on HOST_WIDE_INTs, then on double_ints, now on offset_ints). But that code apparently isn't able to cope with members with empty class types with [[no_unique_address]] attribute, because the empty classes have non-zero type size but zero decl size and so one can end up from the computation with negative offset or offset 1 byte smaller than it should be. For !PCC_BITFIELD_TYPE_MATTERS, we just use tree_result = byte_position (decl); which seems exactly right even for the empty classes or anything which is not a bitfield (and for which we don't add DW_AT_bit_offset attribute). So, instead of trying to handle those no_unique_address members in the current already very complicated code, this limits it to bitfields. stor-layout.c PCC_BITFIELD_TYPE_MATTERS handling also affects only bitfields, twice it checks DECL_BIT_FIELD and once DECL_BIT_FIELD_TYPE. The only thing I'm unsure about is whether the test should be DECL_BIT_FIELD or DECL_BIT_FIELD_TYPE should be tested. I thought it doesn't matter, but it seems stor-layout.c in some cases clears DECL_BIT_FIELD if their TYPE_MODE can express the type exactly, and dwarf2out.c (gen_field_die) uses if (DECL_BIT_FIELD_TYPE (decl)) to decide if DW_AT_bit_offset etc. attributes should be added. So maybe I should go with && DECL_BIT_FIELD_TYPE (decl) instead. On struct S { int e; int a : 1, b : 7, c : 8, d : 16; } s; struct T { int a : 1, b : 7; long long c : 8; int d : 16; } t; it doesn't make a difference though on x86_64, ppc64le nor ppc64... I think Ada has bitfields of aggregate types, so CCing Eric, though I'd hope it doesn't have bitfields where type size is smaller than field decl size like C++ has. Bootstrapped/regtested on x86_64-linux, i686-linux, powerpc64le-linux and powerpc64-linux and Pedro has tested it on GDB testsuite. I can bootstrap/regtest the + && DECL_BIT_FIELD_TYPE (decl) version too. 2021-11-10 Jakub Jelinek PR debug/101378 * dwarf2out.c (field_byte_offset): Do the PCC_BITFIELD_TYPE_MATTERS handling only for DECL_BIT_FIELD decls. * g++.dg/debug/dwarf2/pr101378.C: New test. Jakub --- gcc/dwarf2out.c.jj 2021-11-05 10:19:46.339457342 +0100 +++ gcc/dwarf2out.c 2021-11-09 15:01:51.425437717 +0100 @@ -19646,6 +19646,7 @@ field_byte_offset (const_tree decl, stru properly dynamic byte offsets only when PCC bitfield type doesn't matter. */ if (PCC_BITFIELD_TYPE_MATTERS + && DECL_BIT_FIELD (decl) && TREE_CODE (DECL_FIELD_OFFSET (decl)) == INTEGER_CST) { offset_int object_offset_in_bits; --- gcc/testsuite/g++.dg/debug/dwarf2/pr101378.C.jj 2021-11-09 15:17:39.504975396 +0100 +++ gcc/testsuite/g++.dg/debug/dwarf2/pr101378.C 2021-11-09 15:17:28.067137556 +0100 @@ -0,0 +1,13 @@ +// PR debug/101378 +// { dg-do compile { target c++11 } } +// { dg-options "-gdwarf-5 -dA" } +// { dg-final { scan-assembler-times "0\[^0-9x\\r\\n\]* DW_AT_data_member_location" 1 } } +// { dg-final { scan-assembler-times "1\[^0-9x\\r\\n\]* DW_AT_data_member_location" 1 } } +// { dg-final { scan-assembler-times "2\[^0-9x\\r\\n\]* DW_AT_data_member_location" 1 } } +// { dg-final { scan-assembler-not "-1\[^0-9x\\r\\n\]* DW_AT_data_member_location" } } + +struct E {}; +struct S +{ + [[no_unique_address]] E e, f, g; +} s;