From patchwork Mon Aug 29 21:11:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guillermo E. Martinez" X-Patchwork-Id: 821 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:ecc5:0:0:0:0:0 with SMTP id s5csp1588631wro; Mon, 29 Aug 2022 14:12:23 -0700 (PDT) X-Google-Smtp-Source: AA6agR4LY0p+c2f7oK8ljo3QCk6PHrRuuNt9hC3RaWI4fQgU8gaqxUCtHUF98goOPcXx6oqnhQBs X-Received: by 2002:a17:907:d2a:b0:741:4f42:df74 with SMTP id gn42-20020a1709070d2a00b007414f42df74mr7466091ejc.535.1661807542930; Mon, 29 Aug 2022 14:12:22 -0700 (PDT) Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id z2-20020a05640235c200b00445bc0d93a2si8463737edc.159.2022.08.29.14.12.22 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Aug 2022 14:12:22 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=HJQd1d5V; arc=fail (signature failed); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D15CC3856959 for ; Mon, 29 Aug 2022 21:12:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D15CC3856959 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1661807533; bh=dw8Ys528lOfHTDDUoPNtsYRFOw9m32qt5K5JDSp+BF4=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=HJQd1d5V9ipVgNI3K5si0BQFL2EaXlfFBqMasgWrwqKyvav93xXbolFedr1pNtwan llGOzFqNCA0OwWKBvvuJbfLFucT6mXpw3wcvzbk3r4nBC2m6GG1JIYQwgOd06JP4Aq 1DI1+jAfuBcdrD16DboJY2DLQYnIa8nBeZLhAMo8= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by sourceware.org (Postfix) with ESMTPS id 9B00D3856959 for ; Mon, 29 Aug 2022 21:11:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9B00D3856959 Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 27TKxOCv013592 for ; Mon, 29 Aug 2022 21:11:15 GMT Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3j7btt4kj0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 29 Aug 2022 21:11:15 +0000 Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 27TIQrOj018623 for ; Mon, 29 Aug 2022 21:11:14 GMT Received: from nam12-dm6-obe.outbound.protection.outlook.com (mail-dm6nam12lp2177.outbound.protection.outlook.com [104.47.59.177]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3j79q37v37-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 29 Aug 2022 21:11:14 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JtkHiIqSZLZcEH/uyhfvbi35iReHFX9OhWNyg6j6QEhXLMML0kE5W/ABZUERSAZRB7oE/jINWBXO7B6PR5ZP4C33w7Rswl63MDYWuv8OPbfx08EKfGm/45yBJyyaGTMGfJf7WhltQbSeUSjBE7Vx34mvNWOQrAgWcgA4WqgAcis1XSsgyo4/RTmER3w0N+GEKxM2yfM7jTQ1XBe60Hk4FLbVtmVRhEtdXR402hN/nU/2SFrk4hzgqNdxGFtVr4v+saEM/cXMC0k2Ab5rY6xUqPKtzk4zrT8Tt9DDeypENiaOR7C2F+eyT5vx5C5/wpJeeBBG4tFeCic0BIjmmxqsrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dw8Ys528lOfHTDDUoPNtsYRFOw9m32qt5K5JDSp+BF4=; b=baZYjbao2KkCKot+ZTeFblMyEpqE0wSrMrSvKRrLowscIagHSyQyaK35WxSO1lAO2fW6rdM4lYJpFxHA0aGjHKdC44kOShxnhgitxdBOV9qMfGuG3lBT+LRzDnqsmXShueVLGI3SN3S/iR7sUI7ly2As7Egce8119s+7XXAByeJ6HqAWz4dArtNionoFMpzwmXS0AYD89t2FarzlJDr753/MOUJd89qCcNgFnhZA1nu6F7VZSTu/OkFjilTVOYElBL0+vnLIPnrXbTtJat0u6fAAViRTLe6AK84jx+9JG2P2lgvq9HdxpcRRGTaoJRkjb/04iRPEwBh3EjqLvMwVjw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none Received: from MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) by MWHPR1001MB2384.namprd10.prod.outlook.com (2603:10b6:301:2d::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5566.15; Mon, 29 Aug 2022 21:11:12 +0000 Received: from MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::18e8:e5f2:59a9:1ff5]) by MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::18e8:e5f2:59a9:1ff5%2]) with mapi id 15.20.5566.021; Mon, 29 Aug 2022 21:11:12 +0000 To: gcc-patches@gcc.gnu.org Subject: [PATCH] btf: Add support to BTF_KIND_ENUM64 type Date: Mon, 29 Aug 2022 16:11:06 -0500 Message-Id: <20220829211106.427267-1-guillermo.e.martinez@oracle.com> X-Mailer: git-send-email 2.35.1 X-ClientProxiedBy: BL1PR13CA0173.namprd13.prod.outlook.com (2603:10b6:208:2bd::28) To MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 755f61c5-9c4b-4e96-61a6-08da8a030024 X-MS-TrafficTypeDiagnostic: MWHPR1001MB2384:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: OqMzsUoNcbK/U9Bp11RXuX0LQYdDrLZa1BoZqupWMib+LaRDAd2SoEpsYyfffJwWq0TXMuKQZUWEBgXfPxiRRBXuCeQ/eZK2NRSBQsyCsmksNlEz4stql51OzH6zB7Q9L2Ut4rbG+dTkKu+4nJvxL7e/CgIbUpYz+dKFAY5GPGJ3nkFyjpMXaMfHUhyvXtu6651Y77YhHU7oFoIO68FGU7rbet+5Qz15NhGVFc5sYbB2RZo6UkfC25QKfOHxaviIBI3Jt+RnajKJDozf04ROeVrMPbmqIMpMHADUkd3X54mY0nX4DfZzffbBbM0iyoDq84VMJlDl5nOUKqisi9UdS0/Oo5nKPknkLGGOWGqfpV58jwyJbU/C3Ffq31qoQr1ml27U+K4T0K4uSsBu3bvweZMau+W6sdRHrk9Y6mTG22b94sRHsd9RHV+WtbiRCbBcBbToCP0csPTEuLKZcZos35Rhx5SJQXURB8cNng/7gqNM/RNRJbHpLU5SPG/6ih6Ou2E+lquBGZkdd9yRGBOyECKW9Yp3s9IaRqG4xPkdOJRk2A/YwZe69tVIVujvb+llQmPE8glJfh+UVkSZF6OaJjegUMNTevx1MOat5hhL/SnFliU1D2CNTGIvBOlSX/4+wtxWM5htGY5hD+QpzF+pwahIJxzDmj2S40HsjeBrCpyt20/45JYMNZTfwbhEVbfMdAIm6rkgmflPxkW7hBvabPiyToob21K4GW+9VR3apVuVnKghO+VNcMGhmyu9M/kmqfLqPyi8Qr9e5evs9I85QA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MWHPR10MB1407.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(366004)(136003)(39860400002)(346002)(396003)(376002)(107886003)(41300700001)(6512007)(6666004)(8936002)(83380400001)(186003)(6506007)(6486002)(30864003)(5660300002)(1076003)(8676002)(478600001)(2616005)(6916009)(66476007)(4326008)(316002)(66946007)(38100700002)(2906002)(66556008)(103116003)(36756003)(86362001)(84970400001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: bLhOVUBcI5uoJPL/bk1sq6HY1BOOOWcknE7E0oWIKG/6u7pF6GCsx7XsqQJrAXMqfu0PIpMo6HoKzgPRq2EblSpeykzAxBHnFIxqio9QrU9lMl62ffWhN20sPGXVosUZpekSwN7g3hBpRdYfXke3i32+NrDwUoE+7DQvW9TJ/yxc1o+dK4G3ydZNO1sH+BvPKWkSPqHrDTi5Bm31SwwIXQWE7iZVssj1VaI+jyx0cJ9aAi82b1OJyGk5sr/S4mHl7jmiRFbZYqINGMnv2PEbiF8T/lGdrPYXHtIBrqbwyBf5sL+s5z1K4GU25MtqtFathCnDeoxzrk4nnAyWoZEKw4hqh8xOQqIU9FUC/k774vf2x0dGBMj8XPSv+E6Mzd0jweZehVbEF2sGDUJZQZ4/wWry9EehaJ9GaMSypfEn6HQqDL1V/nyaYQ3Ti+vcEcwiu2kHOxi9FjxA1o0kBqVRJns/4ImvMTDc1h0ELwkrq73fgXFXT9cLYOaltPd1+DYdpjR3fp3ke1jfpzIOlpBWvzYcp+zaBxUVijRq5EH6arqf4B75DwDHO0cYB1+IaIlgnje2qT89BfMFMJwBWPQolPPSUj3+pYd1EBwa55k9CQhWFn7yABnJYt3wYbBckzU5qHH6NF4NUghRpZ1LY+qbosTidLruTaSoJViiQq6A1R9BYt1dm7WD5PyEmUpesmNuceL/YqwGH8kleqhI0CWoumHlvJM+YLbO9sHo++UoX/9MsXUwkg2juJJRMJMk8LXRTpP+oWQW0njmd/EVxUQTrpVkbjoMvwTb1A4hV5NFZkUEvdO7QZktJMHMU4MLDTb3TSOCx2okrTHZbYkBnE9o5YcUseqC0X7rSUCtjckaxVPw9NstiaXUgXkQmgDGAc7MCjbIUkrujYTzVAQWxpQdycJZ6OvJacTD0k/14c6VQH0psXT7CPRgFpbRnZoDYHoPOobYNrH177I29FfOjQgPr5jMGnP4qjD0v56M8KzUf4XhchMpHI3sVvcG2Kdkp2t5XHLpT/kjF9BZDSHV5FgtgY4lpeajUIpBN/kpR+c/ZXuKK4wyh304lm2+tehbyNpPD2lf8BTreT2xuu+/5FVu7xXj/dU06KQGzvudvqKvFG+WWguA+0eufB0IJpEmXExvs99XpYLBBOrDkkQ2XdTQ/3MYdXx5uRONBcyxxK0+7CuGd5wX0e7qwYtKu9cv1ubE1NsMmMcikhGoyinT1ZZgbNCyBRzGXvFLx/s/HZkF8kDp+5xMTXrxysV84mHBp2UzXKQLivCb2t+Wt9LlsFUGZvCEypcaxUtussHgrjvWdO0ryR3Kr2ntKOvQoPJ6YZJNKLe7FhGwEy/RlCHmwZE38hvsB70WSUs/kA4ootEep9WIUTsYr182ebmq3DmKYVZyKS2POZhM/+aC4ggL9MiOcwsKVnQeNdELhbK7Q2hPx451Bk+dJoKNWN3ETkCttU6vmgNi/5wtjVnULnMlOcRIwbPrHuw0k3WLyk0Y3ej1qpNs/Uf1Iu46qT/b9NNMb1rlsQmO79yZYKoQkj/5MEJ93xebmz3Ndn5P142iArAPV+e3giy3BcukiMYflZoobnclh/PNJDKYWSAVWYUzOcm4iR/yPwEO0O+PBtht9NKmpJrm7K7T63VqdMTrdXCySBkZ X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 755f61c5-9c4b-4e96-61a6-08da8a030024 X-MS-Exchange-CrossTenant-AuthSource: MWHPR10MB1407.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Aug 2022 21:11:12.0296 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 7NZmW3C/K5W2tJVnp/wI+GEjlh4CifSTvKK8rIUDrDfAmoyB9aqoQjXTQ4nisPuynKz7Q+qTTQisn/od3xnVEqqaem/uUS8RtUpFhJC3OcY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR1001MB2384 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.895,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-08-29_10,2022-08-25_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 malwarescore=0 spamscore=0 adultscore=0 mlxscore=0 mlxlogscore=999 suspectscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2207270000 definitions=main-2208290094 X-Proofpoint-ORIG-GUID: zdnTJ-ou3sBh8LFlI4LzOfb0rkJUNwaz X-Proofpoint-GUID: zdnTJ-ou3sBh8LFlI4LzOfb0rkJUNwaz X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE 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: 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: "Guillermo E. Martinez via Gcc-patches" From: "Guillermo E. Martinez" Reply-To: "Guillermo E. Martinez" Cc: "Guillermo E. Martinez" Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1742531506171328821?= X-GMAIL-MSGID: =?utf-8?q?1742531506171328821?= Hello GCC team, The following patch update BTF/CTF backend to support BTF_KIND_ENUM64 type. Comments will be welcomed and appreciated!, Kind regards, guillermo --- BTF supports 64-bits enumerators with following encoding: struct btf_type: name_off: 0 or offset to a valid C identifier info.kind_flag: 0 for unsigned, 1 for signed info.kind: BTF_KIND_ENUM64 info.vlen: number of enum values size: 1/2/4/8 The btf_type is followed by info.vlen number of: struct btf_enum64 { uint32_t name_off; /* Offset in string section of enumerator name. */ uint32_t val_lo32; /* lower 32-bit value for a 64-bit value Enumerator */ uint32_t val_hi32; /* high 32-bit value for a 64-bit value Enumerator */ }; So, a new btf_enum64 structure was added to represent BTF_KIND_ENUM64 and a new field in ctf_dtdef to represent specific type's properties, in the particular case for CTF enums it helps to distinguish when its enumerators values are signed or unsigned, later that information is used to encode the BTF enum type. gcc/ChangeLog: * btfout.cc (btf_calc_num_vbytes): Compute enumeration size depending of enumerator type btf_enum{,64}. (btf_asm_type): Update btf_kflag according to enumerators sign, using correct BPF type in BTF_KIND_ENUMi{,64}. (btf_asm_enum_const): New argument to represent the size of the BTF enum type. * ctfc.cc (ctf_add_enum): Use and initialization of flag field to CTF_ENUM_F_NONE. (ctf_add_enumerator): New argument to represent CTF flags, updating the comment and flag vaue according to enumerators sing. * ctfc.h (ctf_dmdef): Update dmd_value to HOST_WIDE_INT to allow use 32/64 bits enumerators. (ctf_dtdef): Add flags to to describe specifyc type's properties. * dwarf2ctf.cc (gen_ctf_enumeration_type): Update flags field depending when a signed enumerator value is found. include/btf.h (btf_enum64): Add new definition and new symbolic constant to BTF_KIND_ENUM64 and BTF_KF_ENUM_{UN,}SIGNED. gcc/testsuite/ChangeLog: gcc.dg/debug/btf/btf-enum-1.c: Update testcase, with correct info.kflags encoding. gcc.dg/debug/btf/btf-enum64-1.c: New testcase. --- gcc/btfout.cc | 24 ++++++++--- gcc/ctfc.cc | 14 ++++--- gcc/ctfc.h | 9 +++- gcc/dwarf2ctf.cc | 9 +++- gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c | 2 +- gcc/testsuite/gcc.dg/debug/btf/btf-enum64-1.c | 41 +++++++++++++++++++ include/btf.h | 19 +++++++-- 7 files changed, 99 insertions(+), 19 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-enum64-1.c diff --git a/gcc/btfout.cc b/gcc/btfout.cc index 997a33fa089..4b11c867c23 100644 --- a/gcc/btfout.cc +++ b/gcc/btfout.cc @@ -223,7 +223,9 @@ btf_calc_num_vbytes (ctf_dtdef_ref dtd) break; case BTF_KIND_ENUM: - vlen_bytes += vlen * sizeof (struct btf_enum); + vlen_bytes += (dtd->dtd_data.ctti_size == 0x8) + ? vlen * sizeof (struct btf_enum64) + : vlen * sizeof (struct btf_enum); break; case BTF_KIND_FUNC_PROTO: @@ -622,6 +624,15 @@ btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd) btf_size_type = 0; } + if (btf_kind == BTF_KIND_ENUM) + { + btf_kflag = (dtd->flags & CTF_ENUM_F_ENUMERATORS_SIGNED) + ? BTF_KF_ENUM_SIGNED + : BTF_KF_ENUM_UNSIGNED; + if (dtd->dtd_data.ctti_size == 0x8) + btf_kind = BTF_KIND_ENUM64; + } + dw2_asm_output_data (4, dtd->dtd_data.ctti_name, "btt_name"); dw2_asm_output_data (4, BTF_TYPE_INFO (btf_kind, btf_kflag, btf_vlen), "btt_info: kind=%u, kflag=%u, vlen=%u", @@ -634,6 +645,7 @@ btf_asm_type (ctf_container_ref ctfc, ctf_dtdef_ref dtd) case BTF_KIND_UNION: case BTF_KIND_ENUM: case BTF_KIND_DATASEC: + case BTF_KIND_ENUM64: dw2_asm_output_data (4, dtd->dtd_data.ctti_size, "btt_size: %uB", dtd->dtd_data.ctti_size); return; @@ -707,13 +719,13 @@ btf_asm_sou_member (ctf_container_ref ctfc, ctf_dmdef_t * dmd) } } -/* Asm'out an enum constant following a BTF_KIND_ENUM. */ +/* Asm'out an enum constant following a BTF_KIND_ENUM{,64}. */ static void -btf_asm_enum_const (ctf_dmdef_t * dmd) +btf_asm_enum_const (unsigned int size, ctf_dmdef_t * dmd) { dw2_asm_output_data (4, dmd->dmd_name_offset, "bte_name"); - dw2_asm_output_data (4, dmd->dmd_value, "bte_value"); + dw2_asm_output_data (size, dmd->dmd_value, "bte_value"); } /* Asm'out a function parameter description following a BTF_KIND_FUNC_PROTO. */ @@ -871,7 +883,7 @@ output_asm_btf_sou_fields (ctf_container_ref ctfc, ctf_dtdef_ref dtd) btf_asm_sou_member (ctfc, dmd); } -/* Output all enumerator constants following a BTF_KIND_ENUM. */ +/* Output all enumerator constants following a BTF_KIND_ENUM{,64}. */ static void output_asm_btf_enum_list (ctf_container_ref ARG_UNUSED (ctfc), @@ -881,7 +893,7 @@ output_asm_btf_enum_list (ctf_container_ref ARG_UNUSED (ctfc), for (dmd = dtd->dtd_u.dtu_members; dmd != NULL; dmd = (ctf_dmdef_t *) ctf_dmd_list_next (dmd)) - btf_asm_enum_const (dmd); + btf_asm_enum_const (dtd->dtd_data.ctti_size, dmd); } /* Output all function arguments following a BTF_KIND_FUNC_PROTO. */ diff --git a/gcc/ctfc.cc b/gcc/ctfc.cc index 9773358a475..253c36b6a0a 100644 --- a/gcc/ctfc.cc +++ b/gcc/ctfc.cc @@ -604,6 +604,7 @@ ctf_add_enum (ctf_container_ref ctfc, uint32_t flag, const char * name, gcc_assert (size <= CTF_MAX_SIZE); dtd->dtd_data.ctti_size = size; + dtd->flags = CTF_ENUM_F_NONE; ctfc->ctfc_num_stypes++; @@ -612,7 +613,7 @@ ctf_add_enum (ctf_container_ref ctfc, uint32_t flag, const char * name, int ctf_add_enumerator (ctf_container_ref ctfc, ctf_id_t enid, const char * name, - HOST_WIDE_INT value, dw_die_ref die) + HOST_WIDE_INT value, uint32_t flags, dw_die_ref die) { ctf_dmdef_t * dmd; uint32_t kind, vlen, root; @@ -630,10 +631,12 @@ ctf_add_enumerator (ctf_container_ref ctfc, ctf_id_t enid, const char * name, gcc_assert (kind == CTF_K_ENUM && vlen < CTF_MAX_VLEN); - /* Enum value is of type HOST_WIDE_INT in the compiler, dmd_value is int32_t - on the other hand. Check bounds and skip adding this enum value if out of - bounds. */ - if ((value > INT_MAX) || (value < INT_MIN)) + /* Enum value is of type HOST_WIDE_INT in the compiler, CTF enumerators + values in ctf_enum_t is limited to int32_t, BTF supports signed and + unsigned enumerators values of 32 and 64 bits, for both debug formats + we use ctf_dmdef_t.dmd_value entry of HOST_WIDE_INT type. So check + CTF bounds and skip adding this enum value if out of bounds. */ + if (!btf_debuginfo_p() && ((value > INT_MAX) || (value < INT_MIN))) { /* FIXME - Note this TBD_CTF_REPRESENTATION_LIMIT. */ return (1); @@ -649,6 +652,7 @@ ctf_add_enumerator (ctf_container_ref ctfc, ctf_id_t enid, const char * name, dmd->dmd_value = value; dtd->dtd_data.ctti_info = CTF_TYPE_INFO (kind, root, vlen + 1); + dtd->flags |= flags; ctf_dmd_list_append (&dtd->dtd_u.dtu_members, dmd); if ((name != NULL) && strcmp (name, "")) diff --git a/gcc/ctfc.h b/gcc/ctfc.h index bcf3a43ae1b..a22342b2610 100644 --- a/gcc/ctfc.h +++ b/gcc/ctfc.h @@ -125,6 +125,10 @@ typedef struct GTY (()) ctf_itype #define CTF_FUNC_VARARG 0x1 +/* Enum specific flags. */ +#define CTF_ENUM_F_NONE (0) +#define CTF_ENUM_F_ENUMERATORS_SIGNED (1 << 0) + /* Struct/union/enum member definition for CTF generation. */ typedef struct GTY ((chain_next ("%h.dmd_next"))) ctf_dmdef @@ -133,7 +137,7 @@ typedef struct GTY ((chain_next ("%h.dmd_next"))) ctf_dmdef ctf_id_t dmd_type; /* Type of this member (for sou). */ uint32_t dmd_name_offset; /* Offset of the name in str table. */ uint64_t dmd_offset; /* Offset of this member in bits (for sou). */ - int dmd_value; /* Value of this member (for enum). */ + HOST_WIDE_INT dmd_value; /* Value of this member (for enum). */ struct ctf_dmdef * dmd_next; /* A list node. */ } ctf_dmdef_t; @@ -162,6 +166,7 @@ struct GTY ((for_user)) ctf_dtdef bool from_global_func; /* Whether this type was added from a global function. */ uint32_t linkage; /* Used in function types. 0=local, 1=global. */ + uint32_t flags; /* Flags to describe specific type's properties. */ union GTY ((desc ("ctf_dtu_d_union_selector (&%1)"))) { /* struct, union, or enum. */ @@ -429,7 +434,7 @@ extern ctf_id_t ctf_add_sou (ctf_container_ref, uint32_t, const char *, uint32_t, size_t, dw_die_ref); extern int ctf_add_enumerator (ctf_container_ref, ctf_id_t, const char *, - HOST_WIDE_INT, dw_die_ref); + HOST_WIDE_INT, uint32_t, dw_die_ref); extern int ctf_add_member_offset (ctf_container_ref, dw_die_ref, const char *, ctf_id_t, uint64_t); extern int ctf_add_function_arg (ctf_container_ref, dw_die_ref, diff --git a/gcc/dwarf2ctf.cc b/gcc/dwarf2ctf.cc index 397100004c2..0ef96dd48fd 100644 --- a/gcc/dwarf2ctf.cc +++ b/gcc/dwarf2ctf.cc @@ -772,6 +772,7 @@ gen_ctf_enumeration_type (ctf_container_ref ctfc, dw_die_ref enumeration) const char *enumerator_name; dw_attr_node *enumerator_value; HOST_WIDE_INT value_wide_int; + uint32_t flags = 0; c = dw_get_die_sib (c); @@ -785,10 +786,14 @@ gen_ctf_enumeration_type (ctf_container_ref ctfc, dw_die_ref enumeration) == dw_val_class_unsigned_const_implicit)) value_wide_int = AT_unsigned (enumerator_value); else - value_wide_int = AT_int (enumerator_value); + { + value_wide_int = AT_int (enumerator_value); + flags |= CTF_ENUM_F_ENUMERATORS_SIGNED; + } ctf_add_enumerator (ctfc, enumeration_type_id, - enumerator_name, value_wide_int, enumeration); + enumerator_name, value_wide_int, + flags, enumeration); } while (c != dw_get_die_child (enumeration)); } diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c index 728493b0804..7e940529f1b 100644 --- a/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c @@ -4,7 +4,7 @@ /* { dg-options "-O0 -gbtf -dA" } */ /* { dg-final { scan-assembler-times "\[\t \]0x6000004\[\t \]+\[^\n\]*btt_info" 1 } } */ -/* { dg-final { scan-assembler-times "\[\t \]0x6000003\[\t \]+\[^\n\]*btt_info" 1 } } */ +/* { dg-final { scan-assembler-times "\[\t \]0x86000003\[\t \]+\[^\n\]*btt_info" 1 } } */ /* { dg-final { scan-assembler-times "ascii \"QAD.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ /* { dg-final { scan-assembler-times "ascii \"QED.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ /* { dg-final { scan-assembler-times "ascii \"QOD.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-enum64-1.c b/gcc/testsuite/gcc.dg/debug/btf/btf-enum64-1.c new file mode 100644 index 00000000000..da103842807 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-enum64-1.c @@ -0,0 +1,41 @@ +/* Test BTF generation for 64 bits enums. */ + +/* { dg-do compile } */ +/* { dg-options "-O0 -gbtf -dA" } */ + +/* { dg-final { scan-assembler-times "\[\t \].size\[\t \]myenum1,\[\t \]8" 1 } } */ +/* { dg-final { scan-assembler-times "\[\t \].size\[\t \]myenum2,\[\t \]8" 1 } } */ +/* { dg-final { scan-assembler-times "\[\t \].size\[\t \]myenum3,\[\t \]8" 1 } } */ +/* { dg-final { scan-assembler-times "\[\t \]0x13000003\[\t \]+\[^\n\]*btt_info" 2 } } */ +/* { dg-final { scan-assembler-times "\[\t \]0x93000003\[\t \]+\[^\n\]*btt_info" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"B1.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"B2.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"B3.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"C1.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"C2.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"C3.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"D1.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"D2.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ +/* { dg-final { scan-assembler-times "ascii \"D3.0\"\[\t \]+\[^\n\]*btf_string" 1 } } */ +/* { dg-final { scan-assembler-times "bte_value" 9 } } */ + +enum default_enum +{ + B1 = 0xffffffffaa, + B2 = 0xbbbbbbbb, + B3 = 0xaabbccdd, +} myenum1 = B1; + +enum explicit_unsigned +{ + C1 = 0xffffffffbbUL, + C2 = 0xbbbbbbbb, + C3 = 0xaabbccdd, +} myenum2 = C1; + +enum signed64 +{ + D1 = 0xffffffffaa, + D2 = 0xbbbbbbbb, + D3 = -0x1, +} myenum3 = D1; diff --git a/include/btf.h b/include/btf.h index 78b551ced23..eba67f9d599 100644 --- a/include/btf.h +++ b/include/btf.h @@ -109,7 +109,8 @@ struct btf_type #define BTF_KIND_VAR 14 /* Variable. */ #define BTF_KIND_DATASEC 15 /* Section such as .bss or .data. */ #define BTF_KIND_FLOAT 16 /* Floating point. */ -#define BTF_KIND_MAX BTF_KIND_FLOAT +#define BTF_KIND_ENUM64 19 /* Enumeration up to 64 bits. */ +#define BTF_KIND_MAX BTF_KIND_ENUM64 #define NR_BTF_KINDS (BTF_KIND_MAX + 1) /* For some BTF_KINDs, struct btf_type is immediately followed by @@ -130,14 +131,17 @@ struct btf_type #define BTF_INT_BOOL (1 << 2) /* BTF_KIND_ENUM is followed by VLEN struct btf_enum entries, - which describe the enumerators. Note that BTF currently only - supports signed 32-bit enumerator values. */ + which describe the enumerators. */ struct btf_enum { uint32_t name_off; /* Offset in string section of enumerator name. */ int32_t val; /* Enumerator value. */ }; +/* BTF_KF_ENUM_ holds the flags for kflags in BTF_KIND_ENUM{,64}. */ +#define BTF_KF_ENUM_UNSIGNED (0) +#define BTF_KF_ENUM_SIGNED (1 << 0) + /* BTF_KIND_ARRAY is followed by a single struct btf_array. */ struct btf_array { @@ -190,6 +194,15 @@ struct btf_var_secinfo uint32_t size; /* Size (in bytes) of variable. */ }; +/* BTF_KIND_ENUM64 is followed by VLEN struct btf_enum64 entries, + which describe the 64 bits enumerators. */ +struct btf_enum64 +{ + uint32_t name_off; /* Offset in string section of enumerator name. */ + uint32_t val_lo32; /* lower 32-bit value for a 64-bit value Enumerator */ + uint32_t val_hi32; /* high 32-bit value for a 64-bit value Enumerator */ +}; + #ifdef __cplusplus } #endif