From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by sourceware.org (Postfix) with ESMTPS id 294513856DD9 for ; Thu, 20 Oct 2022 02:05:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 294513856DD9 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=oracle.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=oracle.com Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 29JM4Nv6020671 for ; Thu, 20 Oct 2022 02:05:16 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2022-7-12; bh=mQ6Qs6jTDQNr+Lo0BiturLArWtWz40PuloLeqgJnUCc=; b=M0kVo7jW/rjnImnL0qWVi5zJ2nCl3lyf+ebSgMTedHFppWp577yMPw/XcWekLxu8r7lU cgN50ejQlKzkDLC47YBrk9830Ps+8DwC2pZyh+9IlKs2+MOTAcZ/kG5OouZs15bj2k17 dFYvfViwft9slwBk48cCoCuKxNAVV11rHX/AmN2yc6I6TcqFF2QihrIZBqmMJJ6Ys6dC kL5NjAMPwPQLM3afK5F/XIu1N57yMKLeekifLie9sjjnOP3whMfrr/bFE7pXFZ9G0o4S 80oAEen5nzOv2rvm16abkrdG3TUAJMFWzXZPZJYU7a/dYR5DbPrQU9zT84YevNw5BZOC ng== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3k7mu03xw9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 20 Oct 2022 02:05:16 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 29K10dsP016601 for ; Thu, 20 Oct 2022 02:05:15 GMT Received: from nam10-dm6-obe.outbound.protection.outlook.com (mail-dm6nam10lp2103.outbound.protection.outlook.com [104.47.58.103]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3k8hrcbfpy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 20 Oct 2022 02:05:15 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nFiIq8OyEAQLKxile6CuHEmYalz7rX52jfDOsEdJz2H//FEculU1UldFy9fdbbQTyzCN+Bjz4MPVOZPS4rrbOmCHJkfNU7QqUcFOozl1VTeFzO0qfZIRe8kYlfX0Enn2ECdBGvsWC14fNmwe4IZ7o2mC9JDzIVAR8UgxRNaIWGm9uyaSwz3t9IHESPod7PgwGUbtW6KZRWkl2w7Fmf0/RGpr9NAUw0yrFu6SLviKHdPjS5Y6mkv87+Ef8Lg5gUbxt36PjR2NyJidPlJV0X6LzQjh04KWJq4qyKzBkModa4PfOYwxkbg4RI+2cs8NmAorvzBRn291ho7zZllfQ9sBVg== 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=mQ6Qs6jTDQNr+Lo0BiturLArWtWz40PuloLeqgJnUCc=; b=QRFEXOFL9IJG2OPaF3BZ0G+B6yetepzDzEuuX4q/XFASQnKGRcutobOhc+PWnF61NLf9Hor4VKavCFABMdWsFNEJzMAWka0OmA7ByJegrD2r8x211wVxtYjsJJhPdTWag3fU0Gs4jD2DEQC/4ao/nOTJreoFJzDARRsmV+FMt2ToFuHDBr8WFL3xDMLSy4g+ND5h1MY/Ud3nVF+ZkoF/ruRBlmom8XfcfkcLUTDi59GepdF0+ADPjhr/MBJdqm/zvVMg/TLIdk/TbaATWOXLwp2gTEzacq2sxj8bfOtbTcQean8gAobjpt9JsrssAIVCIjTXLzewT6mge9DAOW+9eg== 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 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mQ6Qs6jTDQNr+Lo0BiturLArWtWz40PuloLeqgJnUCc=; b=Jw0sb9swiagbGYNzSn1LZJCZPf+CgxwY/v2zqHYKTRDM1e5ebRMumFSSc1ey4KZ9BKRWbQ5oh5URWTbq2BY2rpuauF7DMIXhqYvoCuWl9Kg/2Q+uJBRugsr3ijbljKzhbDMjiks01CMo3ZgTQOSd+hozja9o1fEqiRI/qwT+V5A= Received: from MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) by MN2PR10MB4351.namprd10.prod.outlook.com (2603:10b6:208:1d7::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5723.34; Thu, 20 Oct 2022 02:05:13 +0000 Received: from MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::58a6:3e76:b8f1:d126]) by MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::58a6:3e76:b8f1:d126%5]) with mapi id 15.20.5723.034; Thu, 20 Oct 2022 02:05:13 +0000 From: "Guillermo E. Martinez" To: gcc-patches@gcc.gnu.org Cc: indu.bhagat@oracle.com, david.faust@oracle.com, "Guillermo E. Martinez" Subject: [PATCH v4] btf: Add support to BTF_KIND_ENUM64 type Date: Wed, 19 Oct 2022 21:05:07 -0500 Message-Id: <20221020020507.616781-1-guillermo.e.martinez@oracle.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20221015035548.274704-1-guillermo.e.martinez@oracle.com> References: <20221015035548.274704-1-guillermo.e.martinez@oracle.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: SN1PR12CA0064.namprd12.prod.outlook.com (2603:10b6:802:20::35) To MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWHPR10MB1407:EE_|MN2PR10MB4351:EE_ X-MS-Office365-Filtering-Correlation-Id: 9760fdfd-ff40-4934-5c6d-08dab23f85e1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: FWSXnMpfJ1EKIPHWh2KuLq2MGiSsmQvljbKuwJlrZWtLsdhqyY91trVKhuWhzCBpJkDQnHilMwF9LKlHa21OCVlVD3ZiRm5eh9zbhJgSzrtk52F5V5thFhVcV0+nPSHmzp8NYOzhns/VTzjPXaNP+n+ENeV2dRC+qF4BY+sL5ugsCznOWAMC7GYHWalukZBldL1//td0G8V7ORQIK2/k1kThf2SpmjwOay5jp//43hbMKYC9i+NQy9VdU4/ej/y6JXjSe8m+teeFfPksXJsUHzyfaHl4YrFr6eXAxIKzf/0d8fx1SEV4n8NSOfSdtPfN26ZDgT8jg0LxVqAvvpxQNOPKjyn+EM1tWU1BZd3Y4RA6TP9t2jcfb6LFSXMalLQUjDsWTWLQPeW8yes+cdqtu2LIQzi9aw5sL6/cJwESMpU5nxum/xxXv19wr8gBatay7RlftNKNJDJLHDJMbsEN5fR58Mcyd2kt8zdYxCA5h+VqKRPgG+CMTBR4NlBWnbA6sr2GfJ9a/LSSsfOAzsM2fQdQ1U2kcwU811QpzMJeiPvZlST23Mdrelz1ZageYvzL/BEDZL8CA36sCOxr6VPzHlNlpdHBbaL/NesMlWtgNjoWl7aYGlufWV12+xhT8gb8o9bohInkjOCLTCEBsieXkR/Sh+kGJct6oKiRXyy1vof6SwlcA1wn8/Et5Meuz2WGPvMaotKWRhZLn0JLoU7PDT4m115I5/XTgdaCgf2OarmkweA6iR4bFXMmoYuTWfGQulnkyhJKsK9tBGVQk80uZg== 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:(13230022)(346002)(396003)(39860400002)(366004)(376002)(136003)(451199015)(186003)(1076003)(2616005)(6512007)(107886003)(6506007)(6666004)(83380400001)(2906002)(5660300002)(30864003)(8936002)(4326008)(6486002)(316002)(478600001)(41300700001)(8676002)(66476007)(6916009)(66556008)(66946007)(66899015)(36756003)(86362001)(84970400001)(103116003)(38100700002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?JPtdZR6AK1P0kCKqYOoVkROBZMQVJk3IAS8ffbwvF/6tHu5oSzhew+uwtSXD?= =?us-ascii?Q?lClfma6EVBxoffWjwM7cFsK4peBdtVYavNYo7zsozJerHG2q4hWxk8E6W8Ep?= =?us-ascii?Q?bxFwCU/HomQNMhvW4mtjtwcVZ2nsU2IoP9jPOGCxvRZN8xotTeVgkTexym/w?= =?us-ascii?Q?c2gWtr5ZvYm5gufC3/geJeBwkZTjfN3W6rSuuL+cIeZ413JpGIxn072AQzaS?= =?us-ascii?Q?r2Jvp2X0DAypPbf7UMbp2R6KXTHHveUCL5sbOqoY10t7j/eWYn6DcwJmOEWw?= =?us-ascii?Q?/mLu3+v+J8PN+01YBml73Zhynjn+gD6Uto1ssqefF0GOM6D9LR61PHz4kIjE?= =?us-ascii?Q?ZyMk+YvCI0JYoo/Z7lA49pdeAfHChvixgu8RRhTOjDdP6BaRKGaKXCNdf4kq?= =?us-ascii?Q?w2LGTWe41UiwIbqtAvnIIZ9zT/eCNeX0v+rRGQMFhHaKRVe9BbLQHMaQmIWi?= =?us-ascii?Q?QALSdPFBPO109+ZpMNBDIPUsRXlpbeiyWAw6NQGBD4uhAJnzH/BwWnhxPnw5?= =?us-ascii?Q?hG1tIK7hOR0mVafDtYWkPcB7+mQMe7ticfNF7zYxdn4dQdiyDJblv5uOBFUQ?= =?us-ascii?Q?ojYgKt6L3ACZuuDf9G5txZvTPrhjqwJOg1ay+Kx0ffEfognyQKAMu7fwv6Jy?= =?us-ascii?Q?MgeUQ0o827P4HVQGJfioxdtKi+e/dfr2LCP1wcjDfXpifnSaJSt3mmiWzAJT?= =?us-ascii?Q?UxBSSj312a8yxCNG31PYrDpr+A2CONB/AkiN/D31F2qJ9ZIdjWAnyC+Ep0Hx?= =?us-ascii?Q?sh/dljeJBPhNIN1rBQc+ONFC0fyOPspMUYMZz57s9a8ATFBLt9KW+r4W/7kt?= =?us-ascii?Q?UGWBCVn+IjmfAml1YrH23wTru+62+OD0Do8EB0GQAUaiGDvjEtX+UbksMNPf?= =?us-ascii?Q?WoKcr2PpBKQ3oKdf0MBPm+wo92nnLrHMurzVZz/7Kv+UoQir4jcWIbfQ3c6L?= =?us-ascii?Q?t7cEtnK+hrp0R6Jav3kUaJaffbJGGVJkCU3Vxfywh8Yy8FUPUYHP0gCJi3kP?= =?us-ascii?Q?yQhwkyTW80Xh6Wqk028ujBrYJoLKqgkcaZamLypwjE92zzFa8oX4SP1bhBsS?= =?us-ascii?Q?9vDdcGILN87k6EDkePiaGcwqLJBa8XSNiaLd1SPCc6kd2qdK6FH5NTlmOvAg?= =?us-ascii?Q?80cB5DEuXTPMUrt1ndx903FJReerWoeO++01cwvQCh6MqWKfra5TsjM2EZ+U?= =?us-ascii?Q?E+8L/egR5m0l3u/z7hWholFH+/dEntEmCt3z9hI1QVI6fjC8xEvacNlILmKd?= =?us-ascii?Q?ajOdAMfvWXqHgSnbRYw68DaX9+4tLnTfRMMkkWyQe1XHyIlk1Z/bXMShaYrQ?= =?us-ascii?Q?rFVzLfQ7TcJyRtWnIJGAWexXUPX2dfeyxWskEdNQgPA3VmhLiEj0f5GhrjfK?= =?us-ascii?Q?7Nox2FSP0/Gv28+qaXeGbOxtlUbGiOo4FxOT7YCIm8d29p6vTCH7WCoHOTcx?= =?us-ascii?Q?vBYpgCJ3gbBw5n+8xN0thw/zN/M6ckpsgAXEK21u3Czxf2yOZuXuFBZ6jCJa?= =?us-ascii?Q?gxKIp9Rb8EKHYkZbp9k+jfpgeO7KRGUH7yJXh5odaV6DCp+QE3bMjZoL+yLY?= =?us-ascii?Q?cO+x3Qhw+Et+fz1XKzbjyHidX3ZqDjYDtLaZtuG02rYlR3zYLf/UyII2rGUl?= =?us-ascii?Q?TICU2cGYKwBShpfGc32bS+1+jCW5PsAu2wVSIOvBQMdUKlN2V6W3CcwyGue2?= =?us-ascii?Q?yoAoPhGxmTQ6DVLHBeEDmix0y0U=3D?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9760fdfd-ff40-4934-5c6d-08dab23f85e1 X-MS-Exchange-CrossTenant-AuthSource: MWHPR10MB1407.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Oct 2022 02:05:13.1731 (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: inG4pva8GjrKAXJgxh00H8clf/xU6mXpK96CSntmHiHgWcak/tIoYwV8rVPZ6mjrLzlmiHGOafD6JRptSemnD3GhF/5Ic+yAZ7aYe2hLoUY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR10MB4351 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.895,Hydra:6.0.545,FMLib:17.11.122.1 definitions=2022-10-19_13,2022-10-19_04,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 spamscore=0 bulkscore=0 mlxscore=0 phishscore=0 suspectscore=0 adultscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2209130000 definitions=main-2210200010 X-Proofpoint-ORIG-GUID: 4Z3c4ZL-t-TCrgANlfk7hV1i94IdHU-f X-Proofpoint-GUID: 4Z3c4ZL-t-TCrgANlfk7hV1i94IdHU-f X-Spam-Status: No, score=-12.6 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 autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Hello, The following is patch v4 to update BTF/CTF backend supporting BTF_KIND_ENUM64 type. Changes from v3: + Remove `ctf_enum_binfo' structure. + Remove -m{little,big}-endian from dg-options in testcase. 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 dtd_enum_unsigned in ctf_dtdef structure to distinguish when CTF enum is a signed or unsigned type, 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 enumeration type sign using dtd_enum_unsigned field for both: BTF_KIND_ENUM{,64}. (btf_asm_enum_const): New argument to represent the size of the BTF enum type, writing the enumerator constant value for 32 bits, if it's 64 bits then explicitly writes lower 32-bits value and higher 32-bits value. (output_asm_btf_enum_list): Add enumeration size argument. * ctfc.cc (ctf_add_enum): New argument to represent CTF enum basic information. (ctf_add_generic): Use of ei_{name. size, unsigned} to build the dtd structure containing enumeration information. (ctf_add_enumerator): Update comment mention support for BTF enumeration in 64-bits. * dwarf2ctf.cc (gen_ctf_enumeration_type): Extract signedness for enumeration type and use it in ctf_add_enum. * ctfc.h (ctf_dmdef): Update dmd_value to HOST_WIDE_INT to allow use 32/64 bits enumerators. information. (ctf_dtdef): New field to describe enum signedness. 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 | 30 ++++++++++--- gcc/ctfc.cc | 13 +++--- gcc/ctfc.h | 5 ++- gcc/dwarf2ctf.cc | 5 ++- gcc/testsuite/gcc.dg/debug/btf/btf-enum-1.c | 2 +- gcc/testsuite/gcc.dg/debug/btf/btf-enum64-1.c | 44 +++++++++++++++++++ include/btf.h | 19 ++++++-- 7 files changed, 100 insertions(+), 18 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..aef9fd70a28 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->dtd_enum_unsigned + ? BTF_KF_ENUM_UNSIGNED + : BTF_KF_ENUM_SIGNED; + 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,19 @@ 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"); + if (size == 4) + dw2_asm_output_data (size, dmd->dmd_value, "bte_value"); + else + { + dw2_asm_output_data (4, dmd->dmd_value & 0xffffffff, "bte_value_lo32"); + dw2_asm_output_data (4, (dmd->dmd_value >> 32) & 0xffffffff, "bte_value_hi32"); + } } /* Asm'out a function parameter description following a BTF_KIND_FUNC_PROTO. */ @@ -871,7 +889,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 +899,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..34030cbaa49 100644 --- a/gcc/ctfc.cc +++ b/gcc/ctfc.cc @@ -577,7 +577,7 @@ ctf_add_array (ctf_container_ref ctfc, uint32_t flag, const ctf_arinfo_t * arp, ctf_id_t ctf_add_enum (ctf_container_ref ctfc, uint32_t flag, const char * name, - HOST_WIDE_INT size, dw_die_ref die) + HOST_WIDE_INT size, bool eunsigned, dw_die_ref die) { ctf_dtdef_ref dtd; ctf_id_t type; @@ -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->dtd_enum_unsigned = eunsigned; ctfc->ctfc_num_stypes++; @@ -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); diff --git a/gcc/ctfc.h b/gcc/ctfc.h index bcf3a43ae1b..48c381a008d 100644 --- a/gcc/ctfc.h +++ b/gcc/ctfc.h @@ -133,7 +133,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 +162,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. */ + bool dtd_enum_unsigned; /* Enum signedness. */ union GTY ((desc ("ctf_dtu_d_union_selector (&%1)"))) { /* struct, union, or enum. */ @@ -406,7 +407,7 @@ extern const char * ctf_add_string (ctf_container_ref, const char *, extern ctf_id_t ctf_add_reftype (ctf_container_ref, uint32_t, ctf_id_t, uint32_t, dw_die_ref); extern ctf_id_t ctf_add_enum (ctf_container_ref, uint32_t, const char *, - HOST_WIDE_INT, dw_die_ref); + HOST_WIDE_INT, bool, dw_die_ref); extern ctf_id_t ctf_add_slice (ctf_container_ref, uint32_t, ctf_id_t, uint32_t, uint32_t, dw_die_ref); extern ctf_id_t ctf_add_float (ctf_container_ref, uint32_t, const char *, diff --git a/gcc/dwarf2ctf.cc b/gcc/dwarf2ctf.cc index 397100004c2..748dd0cd8af 100644 --- a/gcc/dwarf2ctf.cc +++ b/gcc/dwarf2ctf.cc @@ -736,6 +736,7 @@ gen_ctf_enumeration_type (ctf_container_ref ctfc, dw_die_ref enumeration) { const char *enum_name = get_AT_string (enumeration, DW_AT_name); unsigned int bit_size = ctf_die_bitsize (enumeration); + unsigned int signedness = get_AT_unsigned (enumeration, DW_AT_encoding); int declaration_p = get_AT_flag (enumeration, DW_AT_declaration); ctf_id_t enumeration_type_id; @@ -759,7 +760,9 @@ gen_ctf_enumeration_type (ctf_container_ref ctfc, dw_die_ref enumeration) /* Generate a CTF type for the enumeration. */ enumeration_type_id = ctf_add_enum (ctfc, CTF_ADD_ROOT, - enum_name, bit_size / 8, enumeration); + enum_name, bit_size / 8, + (signedness == DW_ATE_unsigned), + enumeration); /* Process the enumerators. */ { 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..e443d4c8c00 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-enum64-1.c @@ -0,0 +1,44 @@ +/* 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 "\[\t \]0xffffffaa\[\t \]+\[^\n\]*bte_value_lo32" 2 } } */ +/* { dg-final { scan-assembler-times "\[\t \]0xff\[\t \]+\[^\n\]*bte_value_hi32" 3 } } */ +/* { 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_lo32" 9 } } */ +/* { dg-final { scan-assembler-times "bte_value_hi32" 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 -- 2.35.1