[{"id":3683700,"web_url":"http://patchwork.ozlabs.org/comment/3683700/","msgid":"<afERMrg7h7TVDxCn@redhat.com>","list_archive_url":null,"date":"2026-04-28T19:57:38","subject":"Re: [PATCH v2] c++: Improve -fdump-lang-class output","submitter":{"id":14370,"url":"http://patchwork.ozlabs.org/api/people/14370/","name":"Marek Polacek","email":"polacek@redhat.com"},"content":"On Tue, Apr 28, 2026 at 05:54:50PM +0100, Peter Damianov wrote:\n> When I was researching to write my blogpost about vtables:\n> https://peter0x44.github.io/posts/vtables-itanium-abi/\n> \n> I noticed a few improvements I could make to -fdump-lang-class's output\n> \n> -fdump-lang-class prepended \"0x\" to HOST_WIDE_INT_PRINT_HEX outputs, but the\n> macro already includes that prefix, producing \"0x0x...\" in dumps.\n> \n> Some vtable entries hold signed values e.g. vcall offsets, vbase offsets,\n>  offset-to-top.  When expr_as_string prints those INTEGER_CSTs,\n> negative offsets appear as large (unsigned) values.  Print integer vtable\n> entries as signed values, and keep expr_as_string for all other entries.\n\nNot an approval but the patch LGTM now, thanks.\n \n> gcc/cp/ChangeLog:\n> \n> \t* class.cc (dump_vtable_entry): New function.\n> \t(dump_array): Use it.\n> \t(dump_class_hierarchy_r): Drop redundant literal 0x from\n> \tHOST_WIDE_INT_PRINT_HEX formatting.\n> \t(dump_vtable): Likewise.\n> \n> Signed-off-by: Peter Damianov <peter0x44@disroot.org>\n> ---\n> \n> v2: add comment to dump_vtable_entry\n> use STRIP_NOPS\n> simplify code using print_decs instead of print_dec with SIGNED\n> \n>  gcc/cp/class.cc | 31 ++++++++++++++++++++++++++-----\n>  1 file changed, 26 insertions(+), 5 deletions(-)\n> \n> diff --git a/gcc/cp/class.cc b/gcc/cp/class.cc\n> index 8beeb797a08..4d2284b1891 100644\n> --- a/gcc/cp/class.cc\n> +++ b/gcc/cp/class.cc\n> @@ -167,6 +167,7 @@ static int maybe_indent_hierarchy (FILE *, int, int);\n>  static tree dump_class_hierarchy_r (FILE *, dump_flags_t, tree, tree, int);\n>  static void dump_class_hierarchy (tree);\n>  static void dump_class_hierarchy_1 (FILE *, dump_flags_t, tree);\n> +static void dump_vtable_entry (FILE *, tree);\n>  static void dump_array (FILE *, tree);\n>  static void dump_vtable (tree, tree, tree);\n>  static void dump_vtt (tree, tree);\n> @@ -9729,7 +9730,7 @@ dump_class_hierarchy_r (FILE *stream,\n>    tree base_binfo;\n>    int i;\n>  \n> -  fprintf (stream, \"%s (0x\" HOST_WIDE_INT_PRINT_HEX \") \",\n> +  fprintf (stream, \"%s (\" HOST_WIDE_INT_PRINT_HEX \") \",\n>  \t   type_as_string (BINFO_TYPE (binfo), TFF_PLAIN_IDENTIFIER),\n>  \t   (HOST_WIDE_INT) (uintptr_t) binfo);\n>    if (binfo != igo)\n> @@ -9752,7 +9753,7 @@ dump_class_hierarchy_r (FILE *stream,\n>    if (BINFO_PRIMARY_P (binfo))\n>      {\n>        indented = maybe_indent_hierarchy (stream, indent + 3, indented);\n> -      fprintf (stream, \" primary-for %s (0x\" HOST_WIDE_INT_PRINT_HEX \")\",\n> +      fprintf (stream, \" primary-for %s (\" HOST_WIDE_INT_PRINT_HEX \")\",\n>  \t       type_as_string (BINFO_TYPE (BINFO_INHERITANCE_CHAIN (binfo)),\n>  \t\t\t       TFF_PLAIN_IDENTIFIER),\n>  \t       (HOST_WIDE_INT) (uintptr_t) BINFO_INHERITANCE_CHAIN (binfo));\n> @@ -9845,6 +9846,23 @@ dump_class_hierarchy (tree t)\n>      }\n>  }\n>  \n> +/* Dump VALUE, a vtable entry, to STREAM.  Print integer offsets as signed\n> +   values.  */\n> +\n> +static void\n> +dump_vtable_entry (FILE *stream, tree value)\n> +{\n> +  /* Vtable offset entries are stored in the pointer-sized vtable entry\n> +     type, but should be displayed as signed ptrdiff_t values.  */\n> +  tree cst = value;\n> +  STRIP_NOPS (cst);\n> +\n> +  if (TREE_CODE (cst) == INTEGER_CST)\n> +    print_decs (wi::to_wide (cst), stream);\n> +  else\n> +    fprintf (stream, \"%s\", expr_as_string (value, TFF_PLAIN_IDENTIFIER));\n> +}\n> +\n>  static void\n>  dump_array (FILE * stream, tree decl)\n>  {\n> @@ -9863,8 +9881,11 @@ dump_array (FILE * stream, tree decl)\n>  \n>    FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (DECL_INITIAL (decl)),\n>  \t\t\t      ix, value)\n> -    fprintf (stream, \"%-4ld  %s\\n\", (long)(ix * elt),\n> -\t     expr_as_string (value, TFF_PLAIN_IDENTIFIER));\n> +    {\n> +      fprintf (stream, \"%-4ld  \", (long)(ix * elt));\n> +      dump_vtable_entry (stream, value);\n> +      fprintf (stream, \"\\n\");\n> +    }\n>  }\n>  \n>  static void\n> @@ -9886,7 +9907,7 @@ dump_vtable (tree t, tree binfo, tree vtable)\n>        if (ctor_vtbl_p)\n>  \t{\n>  \t  if (!BINFO_VIRTUAL_P (binfo))\n> -\t    fprintf (stream, \" (0x\" HOST_WIDE_INT_PRINT_HEX \" instance)\",\n> +\t    fprintf (stream, \" (\" HOST_WIDE_INT_PRINT_HEX \" instance)\",\n>  \t\t     (HOST_WIDE_INT) (uintptr_t) binfo);\n>  \t  fprintf (stream, \" in %s\", type_as_string (t, TFF_PLAIN_IDENTIFIER));\n>  \t}\n> -- \n> 2.54.0\n> \n\nMarek","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\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=hzVLzK7d;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::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\tdkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=hzVLzK7d","sourceware.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","sourceware.org; spf=pass smtp.mailfrom=redhat.com","server2.sourceware.org;\n arc=none smtp.remote-ip=170.10.133.124"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::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 4g4rpJ3v6lz1xrS\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 05:58:15 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 35FD54BB8F58\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 19:58:13 +0000 (GMT)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by sourceware.org (Postfix) with ESMTP id A82254B920FC\n for <gcc-patches@gcc.gnu.org>; Tue, 28 Apr 2026 19:57:44 +0000 (GMT)","from mail-qt1-f199.google.com (mail-qt1-f199.google.com\n [209.85.160.199]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-28-_gdm_qviPOSeFM8a-aDK9Q-1; Tue, 28 Apr 2026 15:57:42 -0400","by mail-qt1-f199.google.com with SMTP id\n d75a77b69052e-50ff0bef198so77112651cf.2\n for <gcc-patches@gcc.gnu.org>; Tue, 28 Apr 2026 12:57:42 -0700 (PDT)","from redhat.com ([2603:7002:1f00:31d2::1db4])\n by smtp.gmail.com with ESMTPSA id\n d75a77b69052e-5100db22b9csm25191221cf.15.2026.04.28.12.57.40\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 28 Apr 2026 12:57:40 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org 35FD54BB8F58","OpenDKIM Filter v2.11.0 sourceware.org A82254B920FC"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org A82254B920FC","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org A82254B920FC","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1777406264; cv=none;\n b=R1VszoJ9eRmnPb/rAiw6sGWDkRG56JNQ0n7F6UBjPhm01ub4lFASWbGeQIxZ9WWUcW6b4eUn5zT1ogunbhVcij4RfouLWyrL6isyW1kLfmTN+HU649fGONCsOmqBbLyi6xRoJQCpw1Qp6JFu8fGJdxMw3lqrxJAF34E4EUyE32Q=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777406264; c=relaxed/simple;\n bh=hB42jOjUK8km91oAv6mOxMtYlTTUnOoi+jGNjfCgAqM=;\n h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version;\n b=Z1WT+EDFWiEYDUVsTfiHHHKaFIjRm5i0+vkGwjn92e8I3tPy9HK7Gpm1S7BU0BVSojvxJzC8aJc+Gf7KnPix5yda15GoDol7RJovCcMLME4Ucd78CwsisdJMr5sw4fzz5ngyNkdCuSH8GVf4fivLt8tl7eX/s/No6WKoKwkl9Ps=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777406264;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=eYCha2ZxR0+F9+XJSw3vAa97kKJfMGNFOu298JVE/jA=;\n b=hzVLzK7dsslOlldbqE1b9Jb2AnoZnnBTyeth0iA8Rh9IK0Y0QLNsbYl+a/eXzTsxazeLti\n cPcnYEBj6c2ZyJ5vQa/8VFtUgg+WBwNCoIaxpKI6GvEFyszDPdldzQ5+OFLcO5rwX1eeHv\n lNjeIQmXXy60XfG/OLAvevENA2RVTJo=","X-MC-Unique":"_gdm_qviPOSeFM8a-aDK9Q-1","X-Mimecast-MFC-AGG-ID":"_gdm_qviPOSeFM8a-aDK9Q_1777406262","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777406262; x=1778011062;\n h=user-agent:in-reply-to:content-disposition:mime-version:references\n :message-id:subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=eYCha2ZxR0+F9+XJSw3vAa97kKJfMGNFOu298JVE/jA=;\n b=CxhuerrQA543xQGebXbQtY9Z05HFbyWS92vq/6jlNCL6+xa0qoy9TXQRiWUmhOpkab\n 8w17i7WbMMUO3XgLaxLyRKJ22PO3yxmtyALs7EIMZhspbp6UNwbwCFwpR2eYmywYS+ey\n YOx6QVnNnBxsMnY9gvdU3dHF6qCBSbGEOcPqjmczpyjRfvYT+TED4fY1EQPPe3S+GnfT\n XCrbJ8B6+8XC1SSOz5feSWarHnYiLRfhdtk3j/iC4mo4kFyhNlIwJWe+Kk0AfZqw9H4O\n 3OcvbzNdPhOgjcoJi/VD1f5RMUUhl531kvuCOFZneP5b+jGi32sKN5+QlfnPsEACzbhk\n W7dw==","X-Gm-Message-State":"AOJu0Yzh+9ZJ11cirNjX2bNd5RkTImeO1HjMPuVo23CgPPXyYJSmFSTt\n nXJb1XfL71se9Y+bsKI3S0ErV+hB6qj28XnVPpNFwkeMuTRk+WJjrgzVsYu75JKofWr1hzcR0e6\n 8v/kPlud63Bpuc/hXYU6gbiFNIf+rPb+bFRPXMnsgVkgSEBgENaRS/CyL+xA=","X-Gm-Gg":"AeBDieuKQcKacYupZ0SmVmpkeBmdWjxXWSWV8d7RcVX5lJmN+L4EsZiGgj8xmL4vgBo\n s/wm3iXpeJJWShDS4C4hvkCkumd45Xf3EEQM2qPObvTig4HvGgB422As9dU0nMAiBL9d/dKLmPA\n KzexLS94ZG0mIgbHxRDQ+jHsGEAz0qJ+S1ftE9xBD/XsTrxmLx4fGApXC4T55TJuBuCf0al/0II\n C1FQl4d7sBJyVegtejBheN+wUm44SisGiV3fu6xZLMA52YmG+X4zvmN3XsMZQnwvEuSZow+c0dj\n wawW5JWnOEUB8AhWac0O2zYaR87PQJRsnpyJSlydwRxJOFa8SetpxSSDchrGd/RF8tTEs2rQbx7\n bUTOVd8QT6e+9SJk=","X-Received":["by 2002:ac8:5d4c:0:b0:50e:a1ab:67e4 with SMTP id\n d75a77b69052e-5100e1bf3e7mr59959091cf.40.1777406262048;\n Tue, 28 Apr 2026 12:57:42 -0700 (PDT)","by 2002:ac8:5d4c:0:b0:50e:a1ab:67e4 with SMTP id\n d75a77b69052e-5100e1bf3e7mr59958741cf.40.1777406261498;\n Tue, 28 Apr 2026 12:57:41 -0700 (PDT)"],"Date":"Tue, 28 Apr 2026 15:57:38 -0400","From":"Marek Polacek <polacek@redhat.com>","To":"Peter Damianov <peter0x44@disroot.org>","Cc":"gcc-patches@gcc.gnu.org","Subject":"Re: [PATCH v2] c++: Improve -fdump-lang-class output","Message-ID":"<afERMrg7h7TVDxCn@redhat.com>","References":"<20260428165450.28555-2-peter0x44@disroot.org>","MIME-Version":"1.0","In-Reply-To":"<20260428165450.28555-2-peter0x44@disroot.org>","User-Agent":"Mutt/2.3.1 (2026-03-20)","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"6kyfieaY5DEUKbm84A5RwcOTlBQTomj2518LsR06JtI_1777406262","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","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"}}]