[binutils-gdb] gdb, dwarf: update complaint logic in read_tag_pointer_type

Tankut Baris Aktemur via Gdb-cvs <[email protected]> Thu, 30 Jul 2026 16:50:19 +0000 (GMT)
Newsgroups gmane.comp.gdb.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D6d1be0b90e83=
7e4c82eaaf6f9e8c7da7227902e1

commit 6d1be0b90e837e4c82eaaf6f9e8c7da7227902e1
Author: Tankut Baris Aktemur <[email protected]>
Date:   Thu Jul 30 18:44:51 2026 +0200

    gdb, dwarf: update complaint logic in read_tag_pointer_type
   =20
    There is nested branching in `read_tag_pointer_type` with non-trivial
    conditions.  I think what is meant there is if there is a non-default
    address class attribute for the type, alignment and size changes are
    acceptable.  Otherwise we should check for unexpected size and
    alignment, and complain about them.  This patch updates the logic.
   =20
    In particular:
   =20
     - If addr_class is default, byte_size does not match the expectation,
       and the architecture defines the address_class_dwarf_to_id hook
       method, code before the patch does not complain about pointer size
       whereas the new code complains.
   =20
     - If addr_class is non-default, byte_size does not match the
       expectation, and the architecture does not define the
       address_class_dwarf_to_id hook method, code before the patch
       complains about pointer size whereas the code after does not
       complain.
   =20
    (Similar cases for alignment mismatch instead of type size, too.)
   =20
    I think the new behavior is what was intended and it yields simpler
    code.
   =20
    Approved-By: Tom Tromey <[email protected]>

Diff:
---
 gdb/dwarf2/read.c | 24 +++++++++---------------
 1 file changed, 9 insertions(+), 15 deletions(-)

diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 7db76140319..ca475f53745 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -12043,10 +12043,7 @@ read_tag_pointer_type (struct die_info *die, struc=
t dwarf2_cu *cu)
   /* If the pointer size, alignment, or address class is different
      than the default, create a type variant marked as such and set
      the length accordingly.  */
-  if (type->length () !=3D byte_size
-      || (alignment !=3D 0 && TYPE_RAW_ALIGN (type) !=3D 0
-	  && alignment !=3D TYPE_RAW_ALIGN (type))
-      || addr_class !=3D DW_ADDR_none)
+  if (addr_class !=3D DW_ADDR_none)
     {
       if (gdbarch_address_class_dwarf_to_id_p (gdbarch))
 	{
@@ -12055,22 +12052,19 @@ read_tag_pointer_type (struct die_info *die, stru=
ct dwarf2_cu *cu)
 						 addr_class);
 	  type =3D make_type_with_address_class (type, aclass);
 	}
-      else if (type->length () !=3D byte_size)
-	{
-	  complaint (_("invalid pointer size %s"), pulongest (byte_size));
-	}
-      else if (TYPE_RAW_ALIGN (type) !=3D alignment)
-	{
-	  complaint (_("Invalid DW_AT_alignment"
-		       " - DIE at %s [in module %s]"),
-		     sect_offset_str (die->sect_off),
-		     objfile_name (cu->per_objfile->objfile));
-	}
       else
 	{
 	  /* Should we also complain about unhandled address classes?  */
 	}
     }
+  else if (type->length () !=3D byte_size)
+    complaint (_("invalid pointer size %s"), pulongest (byte_size));
+  else if (alignment !=3D 0 && TYPE_RAW_ALIGN (type) !=3D 0
+	   && TYPE_RAW_ALIGN (type) !=3D alignment)
+    complaint (_("Invalid DW_AT_alignment"
+		 " - DIE at %s [in module %s]"),
+	       sect_offset_str (die->sect_off),
+	       objfile_name (cu->per_objfile->objfile));
=20
   type->set_length (byte_size);
   set_type_align (type, alignment);