{"id":2175878,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2175878/?format=json","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.0/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<20251219094607.3406-3-yury.khrustalev@arm.com>","date":"2025-12-19T09:46:07","name":"[2/2] dwarf: Save bit stride information for array type entry [PR121964]","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"85e2a64aa8e9db175b02923404acf4fda5bb5691","submitter":{"id":88214,"url":"http://patchwork.ozlabs.org/api/1.0/people/88214/?format=json","name":"Yury Khrustalev","email":"yury.khrustalev@arm.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/20251219094607.3406-3-yury.khrustalev@arm.com/mbox/","series":[{"id":485970,"url":"http://patchwork.ozlabs.org/api/1.0/series/485970/?format=json","date":"2025-12-19T09:46:06","name":"GCC-14: Save bit stride information for svbool_t","version":1,"mbox":"http://patchwork.ozlabs.org/series/485970/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2175878/checks/","tags":{},"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=38.145.34.32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=arm.com","sourceware.org; spf=pass smtp.mailfrom=arm.com","server2.sourceware.org;\n arc=none smtp.remote-ip=217.140.110.172"],"Received":["from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4dXjQ53czYz1y2r\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 19 Dec 2025 20:47:57 +1100 (AEDT)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 2B7794BA2E24\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 19 Dec 2025 09:47:55 +0000 (GMT)","from foss.arm.com (foss.arm.com [217.140.110.172])\n by sourceware.org (Postfix) with ESMTP id 7D6494BA2E07\n for <gcc-patches@gcc.gnu.org>; Fri, 19 Dec 2025 09:46:16 +0000 (GMT)","from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14])\n by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id EA7F81595;\n Fri, 19 Dec 2025 01:46:08 -0800 (PST)","from fdebian.localdomain (unknown [10.1.35.24])\n by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9A56C3F73F;\n Fri, 19 Dec 2025 01:46:15 -0800 (PST)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 2B7794BA2E24","OpenDKIM Filter v2.11.0 sourceware.org 7D6494BA2E07"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 7D6494BA2E07","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 7D6494BA2E07","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1766137576; cv=none;\n b=RhF6w6Wrh2xeaTHS8gbkaSFk97bXH+DIZDZXaFc9DWBW9gbl9YyqKwjGVIflFGenOfyNQfiNtzrVKUTNbFn7vbjl6ykk2e8jhAJs+RvC8FojscJhUY3+f689a4wbrVQn8NiGHFPGUCs8avsyF5br2jhQuuEWHHi6o/s+Jyorp4c=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1766137576; c=relaxed/simple;\n bh=okZgIZ9LPH7WbWgr+dTFar/JOY2wkEtUCoXSIXYKTME=;\n h=From:To:Subject:Date:Message-ID:MIME-Version;\n b=jIppVrcf08mMaSLCEpnVBwFmlaXwWPlWRA/rzQJENBUVR2mck2jESp7KWs4iD0WR8MGPG6pPPVxQlq9GFiIffyTZk0H7MTKs56LqARPdDCCoILt5Qx0hiw4INWDXoM4ivaJaOd5gDBvPyvwi6WmiamzzOBYS0pibwou44Bd6/lg=","ARC-Authentication-Results":"i=1; server2.sourceware.org","From":"Yury Khrustalev <yury.khrustalev@arm.com>","To":"gcc-patches@gcc.gnu.org","Cc":"tamar.christina@arm.com,\n\tjakub@redhat.com","Subject":"[PATCH 2/2] dwarf: Save bit stride information for array type entry\n [PR121964]","Date":"Fri, 19 Dec 2025 09:46:07 +0000","Message-ID":"<20251219094607.3406-3-yury.khrustalev@arm.com>","X-Mailer":"git-send-email 2.47.3","In-Reply-To":"<20251219094607.3406-1-yury.khrustalev@arm.com>","References":"<20251219094607.3406-1-yury.khrustalev@arm.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"Lack of DW_AT_bit_stride in a DW_TAG_array_type entry causes GDB to infer\nincorrect element size for vector types. The causes incorrect display of\nSVE predicate variables as well as out of bounds memory access when reading\ncontents of SVE predicates from memory in GDB.\n\nWe also locate DIE referenced by DW_AT_type and set DW_AT_bit_size 1 in it.\n\nAmended target flags in the tests compared to GCC 15 version.\n\n\tPR debug/121964\n\ngcc/\n\t* dwarf2out.cc (gen_array_type_die): Add DW_AT_bit_stride attribute\n\tfor array types based on element type bit precision for integer and\n\tboolean element types.\n\ngcc/testsuite/\n\t* g++.target/aarch64/dwarf-bit-stride-func.C: New test.\n\t* g++.target/aarch64/dwarf-bit-stride-pragma.C: New test.\n\t* g++.target/aarch64/dwarf-bit-stride-pragma-sme.C: New test.\n\t* g++.target/aarch64/sve/dwarf-bit-stride.C: New test.\n\t* gcc.target/aarch64/dwarf-bit-stride-func.c: New test.\n\t* gcc.target/aarch64/dwarf-bit-stride-pragma.c: New test.\n\t* gcc.target/aarch64/dwarf-bit-stride-pragma-sme.c: New test.\n\t* gcc.target/aarch64/sve/dwarf-bit-stride.c: New test.\n\n(cherry picked from commit 5a8746df980e3532bf6f293f086db21758e90a9e)\n(cherry picked from commit e3ce8d6b5b0deba0b6ccaab8a79b6fd477e96986)\n---\n gcc/dwarf2out.cc                              | 22 +++++++++++++++++++\n .../aarch64/dwarf-bit-stride-func.C           | 16 ++++++++++++++\n .../aarch64/dwarf-bit-stride-pragma-sme.C     | 16 ++++++++++++++\n .../aarch64/dwarf-bit-stride-pragma.C         | 17 ++++++++++++++\n .../g++.target/aarch64/sve/dwarf-bit-stride.C | 15 +++++++++++++\n .../aarch64/dwarf-bit-stride-func.c           | 16 ++++++++++++++\n .../aarch64/dwarf-bit-stride-pragma-sme.c     | 14 ++++++++++++\n .../aarch64/dwarf-bit-stride-pragma.c         | 17 ++++++++++++++\n .../gcc.target/aarch64/sve/dwarf-bit-stride.c | 15 +++++++++++++\n 9 files changed, 148 insertions(+)\n create mode 100644 gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-func.C\n create mode 100644 gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-pragma-sme.C\n create mode 100644 gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-pragma.C\n create mode 100644 gcc/testsuite/g++.target/aarch64/sve/dwarf-bit-stride.C\n create mode 100644 gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-func.c\n create mode 100644 gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-pragma-sme.c\n create mode 100644 gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-pragma.c\n create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/dwarf-bit-stride.c","diff":"diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc\nindex c91eb74683b..146328a1bca 100644\n--- a/gcc/dwarf2out.cc\n+++ b/gcc/dwarf2out.cc\n@@ -22666,6 +22666,28 @@ gen_array_type_die (tree type, dw_die_ref context_die)\n \t\t      && TYPE_REVERSE_STORAGE_ORDER (type),\n \t\t      context_die);\n \n+  /* Add bit stride information to boolean vectors of single bits so that\n+     elements can be correctly read and displayed by a debugger.  */\n+  if (VECTOR_BOOLEAN_TYPE_P (type))\n+    {\n+      enum machine_mode tmode = TYPE_MODE_RAW (type);\n+      if (GET_MODE_CLASS (tmode) == MODE_VECTOR_BOOL)\n+\t{\n+\t  /* Calculate bit-size of element based on mnode.  */\n+\t  poly_uint16 bit_size = exact_div (GET_MODE_BITSIZE (tmode),\n+\t\t\t\t\t    GET_MODE_NUNITS (tmode));\n+\t  /* Set bit stride in the array type DIE.  */\n+\t  add_AT_unsigned (array_die, DW_AT_bit_stride, bit_size.coeffs[0]);\n+\t  /* Find DIE corresponding to the element type so that we could\n+\t     add DW_AT_bit_size to it.  */\n+\t  dw_die_ref elem_die = get_AT_ref (array_die, DW_AT_type);\n+\t  /* Avoid adding DW_AT_bit_size twice.  */\n+\t  if (get_AT (elem_die, DW_AT_bit_size) == NULL)\n+\t    add_AT_unsigned (elem_die, DW_AT_bit_size,\n+\t\t\t     TYPE_PRECISION (element_type));\n+\t}\n+    }\n+\n   add_gnat_descriptive_type_attribute (array_die, type, context_die);\n   if (TYPE_ARTIFICIAL (type))\n     add_AT_flag (array_die, DW_AT_artificial, 1);\ndiff --git a/gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-func.C b/gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-func.C\nnew file mode 100644\nindex 00000000000..1917d9116b0\n--- /dev/null\n+++ b/gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-func.C\n@@ -0,0 +1,16 @@\n+/* { dg-do compile } */\n+// { dg-options \"-g -dA\" }\n+// { dg-final { scan-assembler-times \"DW_AT_name: \\\"svbool_t\\\"\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_stride\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_size\" 1 } }\n+\n+#include <arm_sve.h>\n+\n+[[gnu::target (\"arch=armv9-a+sve\")]]\n+void fun ()\n+{\n+  volatile svbool_t pred8 = svwhilelt_b8_u32 (0u, 1u);\n+  volatile svbool_t pred16 = svwhilelt_b16_u32 (0u, 3u);\n+  volatile svbool_t pred32 = svwhilelt_b32_u32 (0u, 7u);\n+  volatile svbool_t pred64 = svwhilelt_b64_u32 (0u, 11u);\n+}\ndiff --git a/gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-pragma-sme.C b/gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-pragma-sme.C\nnew file mode 100644\nindex 00000000000..9126fc18a49\n--- /dev/null\n+++ b/gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-pragma-sme.C\n@@ -0,0 +1,16 @@\n+/* { dg-do compile } */\n+// { dg-options \"-g -dA\" }\n+// { dg-final { scan-assembler-times \"DW_AT_name: \\\"svbool_t\\\"\" 1 } }\n+// { dg-final { scan-assembler-times \"DW_AT_name: \\\"svcount_t\\\"\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_stride\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_size\" 1 } }\n+\n+#include <arm_sme.h>\n+\n+#pragma GCC target \"+sve2+sme2\"\n+\n+void fun ()\n+{\n+  volatile svbool_t pred;\n+  volatile svcount_t count;\n+}\ndiff --git a/gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-pragma.C b/gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-pragma.C\nnew file mode 100644\nindex 00000000000..64b02cc8927\n--- /dev/null\n+++ b/gcc/testsuite/g++.target/aarch64/dwarf-bit-stride-pragma.C\n@@ -0,0 +1,17 @@\n+/* { dg-do compile } */\n+// { dg-options \"-g -dA\" }\n+// { dg-final { scan-assembler-times \"DW_AT_name: \\\"svbool_t\\\"\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_stride\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_size\" 1 } }\n+\n+#include <arm_sve.h>\n+\n+#pragma GCC target \"+sve\"\n+\n+void fun ()\n+{\n+  volatile svbool_t pred8 = svwhilelt_b8_u32 (0u, 1u);\n+  volatile svbool_t pred16 = svwhilelt_b16_u32 (0u, 3u);\n+  volatile svbool_t pred32 = svwhilelt_b32_u32 (0u, 7u);\n+  volatile svbool_t pred64 = svwhilelt_b64_u32 (0u, 11u);\n+}\ndiff --git a/gcc/testsuite/g++.target/aarch64/sve/dwarf-bit-stride.C b/gcc/testsuite/g++.target/aarch64/sve/dwarf-bit-stride.C\nnew file mode 100644\nindex 00000000000..80224d45f78\n--- /dev/null\n+++ b/gcc/testsuite/g++.target/aarch64/sve/dwarf-bit-stride.C\n@@ -0,0 +1,15 @@\n+/* { dg-do compile } */\n+// { dg-options \"-g -dA\" }\n+// { dg-final { scan-assembler-times \"DW_AT_name: \\\"svbool_t\\\"\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_stride\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_size\" 1 } }\n+\n+#include <arm_sve.h>\n+\n+void fun ()\n+{\n+  volatile svbool_t pred8 = svwhilelt_b8_u32 (0u, 1u);\n+  volatile svbool_t pred16 = svwhilelt_b16_u32 (0u, 3u);\n+  volatile svbool_t pred32 = svwhilelt_b32_u32 (0u, 7u);\n+  volatile svbool_t pred64 = svwhilelt_b64_u32 (0u, 11u);\n+}\ndiff --git a/gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-func.c b/gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-func.c\nnew file mode 100644\nindex 00000000000..654bae54e5f\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-func.c\n@@ -0,0 +1,16 @@\n+/* { dg-do compile } */\n+// { dg-options \"-g -dA\" }\n+// { dg-final { scan-assembler-times \"DW_AT_name: \\\"__SVBool_t\\\"\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_stride\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_size\" 1 } }\n+\n+#include <arm_sve.h>\n+\n+__attribute__((target(\"arch=armv9-a+sve\")))\n+void fun ()\n+{\n+  volatile svbool_t pred8 = svwhilelt_b8_u32 (0u, 1u);\n+  volatile svbool_t pred16 = svwhilelt_b16_u32 (0u, 3u);\n+  volatile svbool_t pred32 = svwhilelt_b32_u32 (0u, 7u);\n+  volatile svbool_t pred64 = svwhilelt_b64_u32 (0u, 11u);\n+}\ndiff --git a/gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-pragma-sme.c b/gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-pragma-sme.c\nnew file mode 100644\nindex 00000000000..d26a5568bc3\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-pragma-sme.c\n@@ -0,0 +1,14 @@\n+/* { dg-do compile } */\n+// { dg-options \"-g -dA\" }\n+// { dg-final { scan-assembler-times \"DW_AT_name: \\\"__SVBool_t\\\"\" 2 } }\n+// { dg-final { scan-assembler-times \"DW_AT_name: \\\"__SVCount_t\\\"\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_stride\" 2 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_size\" 1 } }\n+\n+#pragma GCC target \"+sve2+sme2\"\n+\n+void fun ()\n+{\n+  volatile __SVBool_t pred;\n+  volatile __SVCount_t count;\n+}\ndiff --git a/gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-pragma.c b/gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-pragma.c\nnew file mode 100644\nindex 00000000000..77a0d801876\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/aarch64/dwarf-bit-stride-pragma.c\n@@ -0,0 +1,17 @@\n+/* { dg-do compile } */\n+// { dg-options \"-g -dA\" }\n+// { dg-final { scan-assembler-times \"DW_AT_name: \\\"__SVBool_t\\\"\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_stride\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_size\" 1 } }\n+\n+#include <arm_sve.h>\n+\n+#pragma GCC target \"+sve\"\n+\n+void fun ()\n+{\n+  volatile svbool_t pred8 = svwhilelt_b8_u32 (0u, 1u);\n+  volatile svbool_t pred16 = svwhilelt_b16_u32 (0u, 3u);\n+  volatile svbool_t pred32 = svwhilelt_b32_u32 (0u, 7u);\n+  volatile svbool_t pred64 = svwhilelt_b64_u32 (0u, 11u);\n+}\ndiff --git a/gcc/testsuite/gcc.target/aarch64/sve/dwarf-bit-stride.c b/gcc/testsuite/gcc.target/aarch64/sve/dwarf-bit-stride.c\nnew file mode 100644\nindex 00000000000..3f34348ff91\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/aarch64/sve/dwarf-bit-stride.c\n@@ -0,0 +1,15 @@\n+/* { dg-do compile } */\n+// { dg-options \"-g -dA\" }\n+// { dg-final { scan-assembler-times \"DW_AT_name: \\\"__SVBool_t\\\"\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_stride\" 1 } }\n+// { dg-final { scan-assembler-times \".byte\t0x1\t// DW_AT_bit_size\" 1 } }\n+\n+#include <arm_sve.h>\n+\n+void fun ()\n+{\n+  volatile svbool_t pred8 = svwhilelt_b8_u32 (0u, 1u);\n+  volatile svbool_t pred16 = svwhilelt_b16_u32 (0u, 3u);\n+  volatile svbool_t pred32 = svwhilelt_b32_u32 (0u, 7u);\n+  volatile svbool_t pred64 = svwhilelt_b64_u32 (0u, 11u);\n+}\n","prefixes":["2/2"]}