From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by sourceware.org (Postfix) with ESMTPS id 314CA385840A for ; Wed, 28 Feb 2024 19:28:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 314CA385840A Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=oracle.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=oracle.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 314CA385840A Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1709148526; cv=pass; b=MADGTHiFFo4/iEzZOcdXakhkUt6xqcbGjDJ1STkiPBooMzMy5IajIv6R0HLn1gAGQQo4vps4jDbyD4rLZhpFHHDsshHT3QEoXhum9wEBRlsUSh5kx7lmB5Eu82vc2KP3xWpKfwa4OwrL0KZbaSIr3cGwq6OWUpr81o9bfkWCtTU= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1709148526; c=relaxed/simple; bh=TCKIN3eaRXLOKuZX+oHY6bOg0ocbQOTbOWfSjMdCYbc=; h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID: MIME-Version; b=fe4MSDX2r5uXtJUldtg5HaExOJdUwvwuG1DU0+1IVEkRxBGmJ5YtECFCePLB3QqY9pRFojquQAHdAofDfaCLpcBip/5+xTHRPLLvIb1brEN43HvhFTZk/luy5nqb/fWFk27jBm1hvtoJfQwKdDjx5n1xwGEcqfVZkaRmVXK9urI= ARC-Authentication-Results: i=2; server2.sourceware.org Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 41SET6A0010567 for ; Wed, 28 Feb 2024 19:28:38 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=references : from : to : cc : subject : in-reply-to : date : message-id : content-type : mime-version; s=corp-2023-11-20; bh=r0fOoq6sX3Q6euXeAzVvJy4AFjx/G2piLhauu/kOvtc=; b=d7uhhz4xL1z12HTfLnYAIFQt2nbr7e+iwYPZvSYbaUeau794UepP30Ye2TfCGXgLwBIO PzpcOG/vdy1Q9xInDFC4+Pa35C0lCeyDdW1FEWjaaKI7MBgAcufAr/mMTSXTvyAarvES BkpkIhBG1cxaIEZGE3NlaqHaL04cBrd6+uQ2hGXInijBMrQ3vV1WpyYrrNPLNMpNKj3t njU6rvgBVEA7GZwAmQQXysvY00jWCCPdF6ymEVse8UHSkp55g31ZWsLMq45Sd1/MXW9j bEnlrcw1WD++Mu+3K266wWQNVJNveQAczHZdw8Tw2HClrGU7gniF3wk+nHeQp6Bf29qn CQ== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3wf8bbb2h4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 28 Feb 2024 19:28:37 +0000 Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 41SI2CTT025534 for ; Wed, 28 Feb 2024 19:28:36 GMT Received: from nam11-bn8-obe.outbound.protection.outlook.com (mail-bn8nam11lp2169.outbound.protection.outlook.com [104.47.58.169]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3wf6wfv470-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 28 Feb 2024 19:28:36 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=F9bF65B/1XWZ4EdfYl2LclmdBC0+dpFqIJacqJr/tOx55EWSLhsF2XRVMYjCT+s39kmSNfwmJWwfuZtZy7XwxH/zs4g9IvfAi6kfNhTuUXuvnM3f0Oyqevs1vtteYv+s1fE6HI1t+6NiaCoxGqmSAivKUTlAiSY0JDp8T6bjTd8i7FUyxAHgnQipLQKRGPjQdWhkoMQqypyzv4p5ZBc/Fx6D+HtnQzYQI1rAyo6EEQCd5vMBrRcSmWC1iZDxsqxP75UgOhz2/AC2OSdGe9H+n2N+mYSt6azcTv3OW1Ce2zwZGFk6MfkpYD0TJ5JosTRQ387vl5P1Rr4VUYWZIXh3+w== 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=r0fOoq6sX3Q6euXeAzVvJy4AFjx/G2piLhauu/kOvtc=; b=Y8y42A54gHfPqR1jm/4THYFuxdhyny7wKwt1WPKiTmrqxNI/b7EzQttGczdHQidmEAkpAyzNqMyIHLiMMoy91ElOGcISxdMmIBTtWOQRddDbXY3f3het8ELXSKgwNtnSlHufQIIWHxATjcCkw13XSXWpfNcntz94Cao+oflqRUPINqr2Lx4l8OEfYr/y8xLttQw8+pjUnT/mJNTxF6v2v2xXzxTGaXnmySqjYYTFhIXI0gS2M9TRcitL/shmQAb7bDBYtSa4JrEvZovaUPfNPaOIj12vcdk6nuh9XzfqyGZ622NVecmaCnaRu6XNcc6pbcP1oL5sr/rRkDpXTYRKGw== 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=r0fOoq6sX3Q6euXeAzVvJy4AFjx/G2piLhauu/kOvtc=; b=Y8TbEIgcrCyaLe36X7odgngzdO7LBdaIBTGF0JPk1hck1hJ1cttIooag2v93XSEPUT5Z+4/ced0oSECtXiNcmpe5anmhNQbgnljB+DDKNOPLgrrP3qSkYK/qHiR9RM04yVziFfKGSOTXieAtqinyfizBznYcGe67h4wnLZTqViQ= Received: from MN2PR10MB4382.namprd10.prod.outlook.com (2603:10b6:208:1d7::13) by MN2PR10MB4335.namprd10.prod.outlook.com (2603:10b6:208:19a::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7316.41; Wed, 28 Feb 2024 19:28:34 +0000 Received: from MN2PR10MB4382.namprd10.prod.outlook.com ([fe80::8aee:c094:84e2:9401]) by MN2PR10MB4382.namprd10.prod.outlook.com ([fe80::8aee:c094:84e2:9401%4]) with mapi id 15.20.7316.039; Wed, 28 Feb 2024 19:28:34 +0000 References: <20240227190435.35750-1-cupertino.miranda@oracle.com> <20240227190435.35750-5-cupertino.miranda@oracle.com> <32569497-31c5-475f-a534-18699f4b1b41@oracle.com> User-agent: mu4e 1.4.15; emacs 28.1 From: Cupertino Miranda To: David Faust Cc: gcc-patches@gcc.gnu.org, jose.marchesi@oracle.com, elena.zannoni@oracle.com, indu.bhagat@oracle.com Subject: Re: [PATCH v2 4/5] bpf: implementation of func_info in .BTF.ext. In-reply-to: <32569497-31c5-475f-a534-18699f4b1b41@oracle.com> Date: Wed, 28 Feb 2024 19:28:30 +0000 Message-ID: <87edcw75i9.fsf@oracle.com> Content-Type: text/plain X-ClientProxiedBy: AS4PR09CA0005.eurprd09.prod.outlook.com (2603:10a6:20b:5e0::11) To MN2PR10MB4382.namprd10.prod.outlook.com (2603:10b6:208:1d7::13) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR10MB4382:EE_|MN2PR10MB4335:EE_ X-MS-Office365-Filtering-Correlation-Id: 7502ce26-3175-43e6-ed31-08dc3893741a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: V6hLMwKwuupf7nJgI40/agMwogdXllfSEPvhYqXIQXdMUimLuPN/w/tjVxV94BB2uW5+kW+Gt0/9Zst/m33agp6iL7k1VoTaB7uW5cf6sOzqDmivtnw7xa02/gQZU/Kkt0ZTMp98FKA7kPSTK5ljm9u9ENS6+f3sj2o2WUEK+AXdG/L07aj/FRp/5WH+e1PzMiRHV8SFoYaXYv71muv68swQzhkKdK5hjbTKLoRz1Ryq+CA7DgusROQBrOT9boHGQtKEa9wB0VeXkjdNtd3fYSh2fssCG7kgSxVuqI3/r0oDU74b37qkJqA4dd6Fr6gjIfA041GXjg7OndN9V55cfXZuL8/pApRzQfLr4pNCcw0eBCrizrfkveSQKM6OYoeCCgdrtxOwrGERH/YMTpGrMHU6RO7D33+wgOUmVXN2HezMDYg4aN/oNjd1KqMNjILU8bLmoPuDz6PqjrQqrOz05PsnNCZXJQjxUxmSqMidnwi/tYyBAVCgUR7+4688CkFQ4KMAbXwwrKhOftQekMULcm/5rCBjf4RcH+GgKXJEPpTKRCM/engtJ3o77lr1e3VZLvzQQg8c/XNWKbgjhRJGmPOWrR2CnLPGNNUIBMb38zv8jRUTYrf23R79Pohw2RQr X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR10MB4382.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ZaBfpyzqymuxrN+hfFaeL1sK1eTFQcXsctsBWQI3UV4KB0S6hVQBXNCqD4fI?= =?us-ascii?Q?Np6uPI9WWxE1ZTFGFgmMtCmR/tYf2v5OWKSDBpamV9GHcVRW7QH0Hg3OOnbV?= =?us-ascii?Q?l9tQXYndeU/0VjPQEmYI1jQLzcebIOC8Q6b+/GN809lc3ym4PgLeU3KstDd2?= =?us-ascii?Q?EhBCUCjlXQcRl/7B2zsW9RZ/aHLaoC0F5uJbVmdHFeaS0GP/G5XfG+AIUqOJ?= =?us-ascii?Q?01e4i0Sj1j3I3HxwhoQ93mEzD33pH+qskoRuOyUdN5sPJirnbXH8zMueJVhT?= =?us-ascii?Q?dAKZA4bZLxyzCI8IPZx+2xOifYaM6D7PoK4ZA7EzeeiFgvWsczc67SPR1PNM?= =?us-ascii?Q?F3EOeGP5klpuXs3zCvBHNgchSnGUzkMxja3ORJ44pL3xSQZyQE81gaQ52+Zy?= =?us-ascii?Q?l5D+an+vX3QXZhGhRUVcmpsjRF0RTvbu2om3TyOS9XNDFqPF95ag+OP6bHak?= =?us-ascii?Q?Fwq4DaOhfPWgM4Yhk5548PO6HuK0MnPSVANKqf0a4ko2Bhr3/1ruintBJ+be?= =?us-ascii?Q?q+0IRyhQX621RLVGXfutGbJWkVmDJrxMNes/E/hNt+4E2jqenT8HNyhU9N7L?= =?us-ascii?Q?EuYK6bOhQVifC7rSzz/S025m2nix7Una5pvR/B/xDe+lM5rM0YkgfLu38wh2?= =?us-ascii?Q?VK1bJCjAKiF6J0P23hBEMn1lkFwL1C6thaSreGEXD71FzGIlUGC+FUvPdwZg?= =?us-ascii?Q?RqInKtXjOh7fwyKi3Vsk6CRgbYcJqSsAli5wSeZJ1emgljZpoyWhCvUjlqKm?= =?us-ascii?Q?EvHHITI9425Npmzim1rxrL2IXYSdZRufMhhvky1l6PnQdIyhstoEahYCEMpk?= =?us-ascii?Q?m6UriSdEpPBqPS4KwaNQCpD6qpCxKqK0b6UBwk08vgRPHjClwS91IrOZykBj?= =?us-ascii?Q?cDZnXXDdi1qDVkv7STyc9ZMtXCMiHfc7+nzys32exXjLroBP41f8OZMWc1Xe?= =?us-ascii?Q?Y6AIDzK7jAfGF/fBzW0hAIGHRwnCktJT8NA9EiVkuBE+hd2DY2q/yjNmOAq9?= =?us-ascii?Q?lz4DVi5omUY5uS8ZqEvhKvzYLuwxHjP+voclppIykdTnQx0defUDFkPs2Gti?= =?us-ascii?Q?dltWBhyA3GAYRIYH1WW09p9Q3RGb1KFmZ9l+cuLABXRHbfcvk++FpdtkJbGd?= =?us-ascii?Q?LuRq9mBLsK9tRUCPJbwc/q5WAqd+kGXV6sAhQ9qew+4hX6qTykt0HIVISOrn?= =?us-ascii?Q?JRNFKUyiIn6blS/XtG/l0vIk7KxgGFbw/HdskfLmzLni51iEYqBQ7QW40lvv?= =?us-ascii?Q?mmMmn+hYYuUzTZXTuXw/DToCulYBwJY5f5z18seFicG13gKj6vYUiPaecKZm?= =?us-ascii?Q?7FQ9hXjBFPEADGX5VsPqiOjHegWHKXSVW65mJpVZNIjEHr2E3iIjd+6mX5zJ?= =?us-ascii?Q?86qnqfBbBGYoKFc1IN4C0yJ7deM0j7g2pjWOj5voyxYtLUREMC16tue2YGFt?= =?us-ascii?Q?L/qxjtrwEE7lgvwIWYMdqPfxj5FFPSrKk/RVnjgA5jPENI5LL0WHN/nEkMrd?= =?us-ascii?Q?BZjualJOwN78MpcSCteuwfTpYPVdComTOC08s0RJUApwuSUYZj22WwFkeMdK?= =?us-ascii?Q?hkAtDC2yr21fzkokMgYiC3UXeuASySwQ9sdLVDJMA6nlETkMvtPM1vyTTeJ5?= =?us-ascii?Q?4UpwpOEWytjkmSV5f5BO1xA=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: FXp2s3MWv6BgUrwY6e11n+a/TmsKZ5vOgYSzzKTvHMrI61AmhZalX5ef4NC+44QgvgUIWmAXuh852S8yEnqlvJtyVlJ8xTVIrAsJiNL22DDIujQ76NuytgkEVHQapgPhUnX4dzQEJnEtc6Z+qCjaUG8Rr6vaPN3su5OatuOj0uDlyDf9jAlFlJcHw8Iue+4dQLAPOGPcw86frq14siB5VKwHiSuZwXVIxfo+sndpFAOQChTo8PmvwHQZBIpD/Zu+GoJqI//ZXGQrqRvPJbZwzoPQj8JGkBD0+hFr5yZa5LD76612xJK+ukUdRI+aMFfJqS8u66Lo/hDhbkyl8Wj199AFt0djSbfyCXDujhs+57SUp37CUGpxcvzZ6YKGxJaiYYEdieMF3ik2OlvkWH77zRxP2In8ZYIFai32SPg/ev6snGV6O5WLK7Nt1vvA6WqXANhVNtrHH6R+t4mnD1PQ9MuSKCFa/I1vC9+VsJCDGkwcVa4EItdiFluma5ue1sfOg+MovYTy1BzmYqVTzH2sZpHKUobT7Zq5G7gmCp0RE/jxyi81ESA9D5Q0+46QlMlTWgUaKsFRAx0VmsoB6mQmdkmm96jZCZZ5tGrp2FQ8NWU= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7502ce26-3175-43e6-ed31-08dc3893741a X-MS-Exchange-CrossTenant-AuthSource: MN2PR10MB4382.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Feb 2024 19:28:34.1227 (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: 9v+vZhGL32gXdN2I0GSDldjOaszibsA7PXBhaybDmNVLSwAf4wYCqEMQbltxOiyFKz/kjWrUk820IuKsZcfMjgW12MSR12plHe8TehPAYFc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR10MB4335 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.1011,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2024-02-28_08,2024-02-27_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 phishscore=0 adultscore=0 mlxlogscore=999 malwarescore=0 spamscore=0 bulkscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2311290000 definitions=main-2402280153 X-Proofpoint-GUID: QV3bAHyFNwdJhtgJmGJglmdo5HwZd6hs X-Proofpoint-ORIG-GUID: QV3bAHyFNwdJhtgJmGJglmdo5HwZd6hs X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,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 List-Id: Corrected and Pushed, with the following little change to resolve a warning I missed before, the patch introduced was: diff --git a/gcc/config/bpf/btfext-out.cc b/gcc/config/bpf/btfext-out.cc index 6ebbb54ef73e..00d2501a976b 100644 --- a/gcc/config/bpf/btfext-out.cc +++ b/gcc/config/bpf/btfext-out.cc @@ -200,7 +200,7 @@ btfext_info_sec_find_or_add (const char *sec_name, bool add) return ret; } -#define SEARCH_NODE_AND_RETURN(TYPE, FIELD, CONDITION) ({ \ +#define SEARCH_NODE_AND_RETURN(TYPE, FIELD, CONDITION) __extension__ ({ \ TYPE **head = &(FIELD); \ while (*head != NULL) \ { \ Thanks, Cupertino David Faust writes: > Hi Cupertino, > > On 2/27/24 11:04, Cupertino Miranda wrote: >> Kernel verifier complains in some particular cases for missing func_info >> implementation in .BTF.ext. This patch implements it. >> >> Strings are cached locally in coreout.cc to avoid adding duplicated >> strings in the string list. This string deduplication should eventually >> be moved to the CTFC functions such that this happens widely. >> >> With this implementation, the CO-RE relocations information was also >> simplified and integrated with the FuncInfo structures. >> > > I have just a couple small comments inline in the patch below, but they > are very minor and only suggestions/nits. > > The ChangeLog has the same past/present tense issue as the other patches > in the series, but apart from that I see no issues. Great work! Thanks > for implementing this. > > Patch is OK with the ChangeLog fixed up, and the inline nits - if > you agree. > Thanks! > >> gcc/Changelog: >> >> PR target/113453 >> * config/bpf/bpf.cc (bpf_function_prologue): Defined target >> hook. >> * config/bpf/coreout.cc (brf_ext_info_section) >> (btf_ext_info): Moved from coreout.h >> (btf_ext_funcinfo, btf_ext_lineinfo): Added struct. >> (bpf_core_reloc): Renamed to btf_ext_core_reloc. >> (btf_ext): Added static variable. >> (btfext_info_sec_find_or_add, SEARCH_NODE_AND_RETURN) >> (bpf_create_or_find_funcinfo, bpt_create_core_reloc) >> (btf_ext_add_string, btf_funcinfo_type_callback) >> (btf_add_func_info_for, btf_validate_funcinfo) >> (btf_ext_info_len, output_btfext_func_info): Added function. >> (output_btfext_header, bpf_core_reloc_add) >> (output_btfext_core_relocs, btf_ext_init, btf_ext_output): >> Changed to support new structs. >> * config/bpf/coreout.h (btf_ext_funcinfo, btf_ext_lineinfo): >> Moved and changed in coreout.cc. >> (btf_add_func_info_for, btf_ext_add_string): Added prototypes. >> >> gcc/testsuite/ChangeLog: >> PR target/113453 >> * gcc.target/bpf/btfext-funcinfo-nocore.c: Added. >> * gcc.target/bpf/btfext-funcinfo.c: Added. >> * gcc.target/bpf/core-attr-5.c: Fixed regexp. >> * gcc.target/bpf/core-attr-6.c: Fixed regexp. >> * gcc.target/bpf/core-builtin-fieldinfo-offset-1.c: Fixed regexp. >> * gcc.target/bpf/core-section-1.c: Fixed regexp >> --- >> gcc/config/bpf/bpf.cc | 12 + >> gcc/config/bpf/coreout.cc | 518 +++++++++++++----- >> gcc/config/bpf/coreout.h | 20 +- >> .../gcc.target/bpf/btfext-funcinfo-nocore.c | 42 ++ >> .../gcc.target/bpf/btfext-funcinfo.c | 46 ++ >> gcc/testsuite/gcc.target/bpf/core-attr-5.c | 9 +- >> gcc/testsuite/gcc.target/bpf/core-attr-6.c | 6 +- >> .../bpf/core-builtin-fieldinfo-offset-1.c | 13 +- >> gcc/testsuite/gcc.target/bpf/core-section-1.c | 2 +- >> 9 files changed, 506 insertions(+), 162 deletions(-) >> create mode 100644 gcc/testsuite/gcc.target/bpf/btfext-funcinfo-nocore.c >> create mode 100644 gcc/testsuite/gcc.target/bpf/btfext-funcinfo.c >> >> diff --git a/gcc/config/bpf/bpf.cc b/gcc/config/bpf/bpf.cc >> index 4318b26b9cda..ea47e3a8dbfb 100644 >> --- a/gcc/config/bpf/bpf.cc >> +++ b/gcc/config/bpf/bpf.cc >> @@ -385,6 +385,18 @@ bpf_compute_frame_layout (void) >> #undef TARGET_COMPUTE_FRAME_LAYOUT >> #define TARGET_COMPUTE_FRAME_LAYOUT bpf_compute_frame_layout >> >> +/* Defined to initialize data for func_info region in .BTF.ext section. */ >> + >> +static void >> +bpf_function_prologue (FILE *f ATTRIBUTE_UNUSED) >> +{ >> + if (btf_debuginfo_p ()) >> + btf_add_func_info_for (cfun->decl, current_function_func_begin_label); >> +} >> + >> +#undef TARGET_ASM_FUNCTION_PROLOGUE >> +#define TARGET_ASM_FUNCTION_PROLOGUE bpf_function_prologue >> + >> /* Expand to the instructions in a function prologue. This function >> is called when expanding the 'prologue' pattern in bpf.md. */ >> >> diff --git a/gcc/config/bpf/coreout.cc b/gcc/config/bpf/coreout.cc >> index 2f06ec2a0f29..31b2abc3151b 100644 >> --- a/gcc/config/bpf/coreout.cc >> +++ b/gcc/config/bpf/coreout.cc >> @@ -31,6 +31,7 @@ >> #include "btf.h" >> #include "rtl.h" >> #include "tree-pretty-print.h" >> +#include "cgraph.h" >> >> #include "coreout.h" >> >> @@ -95,64 +96,193 @@ >> result, a single .BTF.ext section can contain CO-RE relocations for multiple >> programs in distinct sections. */ >> >> -/* Internal representation of a BPF CO-RE relocation record. */ >> +/* BTF.ext debug info section. */ >> +static GTY (()) section * btf_ext_info_section; >> + >> +#ifndef BTF_EXT_INFO_SECTION_NAME >> +#define BTF_EXT_INFO_SECTION_NAME ".BTF.ext" >> +#endif >> +#define BTF_EXT_INFO_SECTION_FLAGS (SECTION_DEBUG) >> + >> +#ifndef BTF_EXT_INFO_SECTION_LABEL >> +#define BTF_EXT_INFO_SECTION_LABEL "Lbtfext" >> +#endif >> + >> +#define MAX_BTF_EXT_LABEL_BYTES 40 >> +static char btf_ext_info_section_label[MAX_BTF_EXT_LABEL_BYTES]; >> + >> +/* A funcinfo record, in the .BTF.ext funcinfo section. */ >> +struct GTY ((chain_next ("%h.next"))) btf_ext_funcinfo >> +{ >> + uint32_t type; /* Type ID of a BTF_KIND_FUNC type. */ >> + const char *fnname; >> + const char *label; >> + >> + struct btf_ext_funcinfo *next; /* Linked list to collect func_info elems. */ >> +}; >> + >> +/* A lineinfo record, in the .BTF.ext lineinfo section. */ >> +struct GTY ((chain_next ("%h.next"))) btf_ext_lineinfo >> +{ >> + uint32_t insn_off; /* Offset of the instruction. */ >> + uint32_t file_name_off; /* Offset of file name in BTF string table. */ >> + uint32_t line_off; /* Offset of source line in BTF string table. */ >> + uint32_t line_col; /* Line number (bits 31-11) and column (11-0). */ >> >> -typedef struct GTY (()) bpf_core_reloc { >> + struct btf_ext_lineinfo *next; /* Linked list to collect line_info elems. */ >> +}; >> + >> +/* Internal representation of a BPF CO-RE relocation record. */ >> +struct GTY ((chain_next ("%h.next"))) btf_ext_core_reloc { >> unsigned int bpfcr_type; /* BTF type ID of container. */ >> unsigned int bpfcr_astr_off; /* Offset of access string in .BTF >> string table. */ >> rtx_code_label * bpfcr_insn_label; /* RTX label attached to instruction >> to patch. */ >> enum btf_core_reloc_kind bpfcr_kind; /* Kind of relocation to perform. */ >> -} bpf_core_reloc_t; >> >> -typedef bpf_core_reloc_t * bpf_core_reloc_ref; >> + struct { >> + const char *accessor_str; >> + tree type; >> + } info; >> >> -/* Internal representation of a CO-RE relocation (sub)section of the >> - .BTF.ext information. One such section is generated for each ELF section >> - in the output object having relocations that a BPF loader must resolve. */ >> + struct btf_ext_core_reloc *next; >> +}; >> >> -typedef struct GTY (()) bpf_core_section { >> - /* Name of ELF section to which these CO-RE relocations apply. */ >> - const char * name; >> +/* Main data structure to keep .BTF.ext section data. */ >> +struct GTY ((chain_next ("%h.next"))) btf_ext_info_sec { >> + const char *sec_name; >> + uint32_t sec_name_off; /* offset to section name. */ >> + >> + struct { >> + uint32_t num_info; >> + struct btf_ext_funcinfo *head; >> + } func_info; >> + struct { >> + uint32_t num_info; >> + struct btf_ext_lineinfo *head; >> + } line_info; >> + struct { >> + uint32_t num_info; >> + struct btf_ext_core_reloc *head; >> + } core_info; >> + >> + struct btf_ext_info_sec *next; >> +}; >> >> - /* Offset of section name in .BTF string table. */ >> - uint32_t name_offset; >> +static GTY (()) struct btf_ext_info_sec *btf_ext = NULL; >> >> - /* Relocations in the section. */ >> - vec * GTY (()) relocs; >> -} bpf_core_section_t; >> +/* Helper function to add a section structure to the linked list with entry >> + point in info static variable. */ >> >> -typedef bpf_core_section_t * bpf_core_section_ref; >> +static struct btf_ext_info_sec * >> +btfext_info_sec_find_or_add (const char *sec_name, bool add) >> +{ >> + struct btf_ext_info_sec **tmp = &btf_ext; >> >> -/* BTF.ext debug info section. */ >> + while (*tmp != NULL) >> + { >> + if (strcmp ((*tmp)->sec_name, sec_name) == 0) >> + return *tmp; >> + tmp = &((*tmp)->next); >> + } >> >> -static GTY (()) section * btf_ext_info_section; >> + if (add == false) >> + return NULL; >> >> -static int btf_ext_label_num; >> + struct btf_ext_info_sec *ret = ggc_cleared_alloc (); >> + *tmp = ret; >> >> -#ifndef BTF_EXT_INFO_SECTION_NAME >> -#define BTF_EXT_INFO_SECTION_NAME ".BTF.ext" >> -#endif >> + /* Set data for section info. */ >> + ret->sec_name = sec_name; >> + ret->sec_name_off = btf_ext_add_string (sec_name); >> >> -#define BTF_EXT_INFO_SECTION_FLAGS (SECTION_DEBUG) >> + return ret; >> +} >> >> -#define MAX_BTF_EXT_LABEL_BYTES 40 >> +#define SEARCH_NODE_AND_RETURN(TYPE, FIELD, CONDITION) ({ \ >> + TYPE **head = &(FIELD); \ >> + while (*head != NULL) \ >> + { \ >> + if (CONDITION) \ >> + return (*head); \ >> + head = &((*head)->next); \ >> + } \ >> + head; \ >> +}) >> + >> +/* Function to create or find a funcinfo node in info. */ >> + >> +static struct btf_ext_funcinfo * >> +bpf_create_or_find_funcinfo (const char *fnname, const char *sec_name, >> + btf_ext_info_sec **in_sec = NULL) >> +{ >> + struct btf_ext_info_sec *sec_elem = >> + btfext_info_sec_find_or_add (sec_name, true); >> >> -static char btf_ext_info_section_label[MAX_BTF_EXT_LABEL_BYTES]; >> + if (in_sec != NULL) >> + *in_sec = sec_elem; >> >> -#ifndef BTF_EXT_INFO_SECTION_LABEL >> -#define BTF_EXT_INFO_SECTION_LABEL "Lbtfext" >> -#endif >> + struct btf_ext_funcinfo **head = >> + SEARCH_NODE_AND_RETURN(struct btf_ext_funcinfo, >> + sec_elem->func_info.head, >> + strcmp ((*head)->fnname, fnname) == 0); >> >> -static GTY (()) vec *bpf_core_sections; >> + *head = ggc_cleared_alloc (); >> + (*head)->fnname = fnname; >> + (*head)->label = NULL; >> >> -struct GTY(()) bpf_core_extra { >> - const char *accessor_str; >> - tree type; >> + return *head; >> +} >> + >> +/* Function to create a core_reloc node in info. */ >> + >> +static struct btf_ext_core_reloc * >> +bpf_create_core_reloc (const char *sec_name, >> + struct btf_ext_info_sec **in_sec = NULL) >> +{ >> + struct btf_ext_info_sec *sec_elem = >> + btfext_info_sec_find_or_add (sec_name, true); >> + >> + if (in_sec != NULL) >> + *in_sec = sec_elem; >> + >> + struct btf_ext_core_reloc **head = >> + SEARCH_NODE_AND_RETURN(struct btf_ext_core_reloc, >> + sec_elem->core_info.head, >> + false); >> + >> + *head = ggc_cleared_alloc (); >> + >> + return *head; >> +} >> + >> +/* String caching to avoid repeated strings added to BTF string table. */ >> +struct GTY((chain_next ("%h.next"))) string_cache { >> + const char *str; >> + unsigned int offset; >> + struct string_cache *next; >> }; >> -typedef struct bpf_core_extra *bpf_core_extra_ref; >> -static GTY(()) hash_map *bpf_comment_info; >> +static GTY(()) struct string_cache *btf_ext_strings = NULL; >> + >> +unsigned int >> +btf_ext_add_string (const char *str) >> +{ >> + ctf_container_ref ctfc = ctf_get_tu_ctfc (); >> + struct string_cache **tmp = &btf_ext_strings; >> + while (*tmp != NULL) >> + { >> + if (strcmp ((*tmp)->str, str) == 0) >> + return (*tmp)->offset; >> + tmp = &((*tmp)->next); >> + } >> + >> + *tmp = ggc_cleared_alloc (); >> + (*tmp)->str = ggc_strdup (str); >> + ctf_add_string (ctfc, (*tmp)->str, &((*tmp)->offset), CTF_AUX_STRTAB); >> + >> + return (*tmp)->offset; >> +} >> >> /* Create a new BPF CO-RE relocation record, and add it to the appropriate >> CO-RE section. */ >> @@ -162,42 +292,23 @@ bpf_core_reloc_add (const tree type, const char * section_name, >> rtx_code_label *label, >> enum btf_core_reloc_kind kind) >> { >> - bpf_core_reloc_ref bpfcr = ggc_cleared_alloc (); >> - bpf_core_extra_ref info = ggc_cleared_alloc (); >> + struct btf_ext_info_sec *sec = NULL; >> + struct btf_ext_core_reloc *bpfcr = bpf_create_core_reloc (section_name, &sec); >> + >> ctf_container_ref ctfc = ctf_get_tu_ctfc (); >> >> /* Buffer the access string in the auxiliary strtab. */ >> - ctf_add_string (ctfc, accessor, &(bpfcr->bpfcr_astr_off), CTF_AUX_STRTAB); >> + bpfcr->bpfcr_astr_off = 0; >> + if (accessor != NULL) >> + bpfcr->bpfcr_astr_off = btf_ext_add_string (accessor); >> bpfcr->bpfcr_type = get_btf_id (ctf_lookup_tree_type (ctfc, type)); >> bpfcr->bpfcr_insn_label = label; >> bpfcr->bpfcr_kind = kind; >> >> - info->accessor_str = accessor; >> - info->type = type; >> - bpf_comment_info->put (bpfcr, info); >> - >> - /* Add the CO-RE reloc to the appropriate section. */ >> - bpf_core_section_ref sec; >> - int i; >> - FOR_EACH_VEC_ELT (*bpf_core_sections, i, sec) >> - if (strcmp (sec->name, section_name) == 0) >> - { >> - vec_safe_push (sec->relocs, bpfcr); >> - return; >> - } >> + bpfcr->info.accessor_str = accessor; >> + bpfcr->info.type = type; >> >> - /* If the CO-RE section does not yet exist, create it. */ >> - sec = ggc_cleared_alloc (); >> - >> - ctf_add_string (ctfc, section_name, &sec->name_offset, CTF_AUX_STRTAB); >> - if (strcmp (section_name, "")) >> - ctfc->ctfc_aux_strlen += strlen (section_name) + 1; >> - >> - sec->name = section_name; >> - vec_alloc (sec->relocs, 1); >> - vec_safe_push (sec->relocs, bpfcr); >> - >> - vec_safe_push (bpf_core_sections, sec); >> + sec->core_info.num_info += 1; >> } >> >> /* Return the 0-based index of the field NODE in its containing struct or union >> @@ -243,6 +354,113 @@ bpf_core_get_sou_member_index (ctf_container_ref ctfc, const tree node) >> return -1; >> } >> >> +/* Helper function to check if a particular named function exists as a >> + BTF_KIND_FUNC type record. */ >> + >> +static bool >> +btf_funcinfo_type_callback (ctf_dtdef_ref func, void *data) >> +{ >> + struct btf_ext_funcinfo *info = (struct btf_ext_funcinfo *) data; >> + if (strcmp (func->dtd_name, info->fnname) == 0) >> + { >> + uint32_t type = func->dtd_type; >> + info->type = type; >> + return true; >> + } >> + return false; >> +} >> + >> +/* Entry point function to add a func_info in local data structures >> + represented by info static variable. >> + This function is used in bpf.cc. */ >> + >> +struct btf_ext_funcinfo * >> +btf_add_func_info_for (tree decl, const char *label) >> +{ >> + const char *fnname = IDENTIFIER_POINTER (DECL_NAME (decl)); >> + const char *sec_name = decl_section_name (decl); >> + >> + /* Finding suffixed function names, due to the function cloning base on >> + optimizations. >> + This is required to recover the original function name that is the one >> + used in BTF_KIND_FUNC type records. */ > > I find this comment hard to follow, it took me some time to understand. > It may be helpful to simply say something like > "Recover the original function name, which may have been mangled > by optimizations." > >> + const char *cp_ptr = strstr (fnname, "."); >> + if (cp_ptr != NULL) >> + { >> + char new_name[100]; >> + strcpy (new_name, fnname); >> + int pos = cp_ptr - fnname; >> + new_name[pos] = 0; >> + fnname = ggc_strdup (new_name); >> + } >> + >> + if (sec_name == NULL) >> + sec_name = ".text"; >> + >> + struct btf_ext_info_sec *sec = NULL; >> + struct btf_ext_funcinfo *info = >> + bpf_create_or_find_funcinfo (fnname, sec_name, &sec); >> + >> + info->label = label; >> + return info; >> +} >> + >> +/* This function traverses all func_info entries and verified they do have a >> + BTF_KIND_FUNC type record associated. If they do not it is marked as >> + invalided by clearing the associated label. */ >> + >> +static void >> +btf_validate_funcinfo (btf_ext_info_sec *sec) >> +{ >> + while (sec != NULL) >> + { >> + struct btf_ext_funcinfo *funcinfo = sec->func_info.head; >> + while (funcinfo != NULL) >> + { >> + bool found = traverse_btf_func_types (btf_funcinfo_type_callback, >> + funcinfo); >> + if (found == true) >> + sec->func_info.num_info += 1; >> + else >> + funcinfo->label = NULL; >> + >> + funcinfo = funcinfo->next; >> + } >> + sec = sec->next; >> + } >> +} >> + >> +/* Compute the section size in section for func_info, line_info and core_info >> + regions of .BTF.ext. */ >> + >> +static void >> +btf_ext_info_len (uint32_t *fi_len, uint32_t *li_len, uint32_t *cr_len) >> +{ >> + *fi_len = *li_len = *cr_len = 0; >> + struct btf_ext_info_sec *tmp = btf_ext; >> + if (tmp != NULL) >> + while (tmp != NULL) >> + { >> + /* Size computation does 8 bytes per section entry plus num_info of the >> + * respective structure size: >> + - 8 bytes for func_info, >> + - 16 bytes for both line_info and core_info. */ >> + if (tmp->func_info.num_info > 0) >> + *fi_len += 8 + (8 * tmp->func_info.num_info); >> + if (tmp->line_info.num_info > 0) >> + *li_len += 8 + (16 * tmp->line_info.num_info); >> + if (tmp->core_info.num_info > 0) >> + *cr_len += 8 + (16 * tmp->core_info.num_info); >> + tmp = tmp->next; >> + } >> + >> + /* If there are entries within the regions, add 4 bytes to set the header of >> + the respective sections that contains the size for each of the entry. */ >> + *fi_len += *fi_len != 0 ? 4 : 0; >> + *li_len += *li_len != 0 ? 4 : 0; >> + *cr_len += *cr_len != 0 ? 4 : 0; >> +} >> + >> /* Compute and output the header of a .BTF.ext debug info section. */ >> >> static void >> @@ -256,23 +474,19 @@ output_btfext_header (void) >> dw2_asm_output_data (1, 0, "btfext_flags"); >> dw2_asm_output_data (4, sizeof (struct btf_ext_header), "btfext_hdr_len"); >> >> - uint32_t func_info_off = 0, func_info_len = 0; >> - uint32_t line_info_off = 0, line_info_len = 0; >> - uint32_t core_relo_off = 0, core_relo_len = 0; >> + btf_validate_funcinfo (btf_ext); >> >> - /* Header core_relo_len is the sum total length in bytes of all CO-RE >> - relocation sections, plus the 4 byte record size. */ >> - size_t i; >> - bpf_core_section_ref sec; >> - core_relo_len += vec_safe_length (bpf_core_sections) >> - * sizeof (struct btf_ext_section_header); >> + uint32_t func_info_len = 0; >> + uint32_t line_info_len = 0; >> + uint32_t core_info_len = 0; >> + btf_ext_info_len (&func_info_len, &line_info_len, &core_info_len); >> >> - FOR_EACH_VEC_ELT (*bpf_core_sections, i, sec) >> - core_relo_len += >> - vec_safe_length (sec->relocs) * sizeof (struct btf_ext_reloc); >> + if (!TARGET_BPF_CORE) >> + core_info_len = 0; >> >> - if (core_relo_len) >> - core_relo_len += sizeof (uint32_t); >> + uint32_t func_info_off = 0; >> + uint32_t line_info_off = func_info_len; >> + uint32_t core_info_off = line_info_off + line_info_len; >> >> dw2_asm_output_data (4, func_info_off, "func_info_offset"); >> dw2_asm_output_data (4, func_info_len, "func_info_len"); >> @@ -280,47 +494,47 @@ output_btfext_header (void) >> dw2_asm_output_data (4, line_info_off, "line_info_offset"); >> dw2_asm_output_data (4, line_info_len, "line_info_len"); >> >> - dw2_asm_output_data (4, core_relo_off, "core_relo_offset"); >> - dw2_asm_output_data (4, core_relo_len, "core_relo_len"); >> + dw2_asm_output_data (4, core_info_off, "core_relo_offset"); >> + dw2_asm_output_data (4, core_info_len, "core_relo_len"); >> } >> >> -/* Output a single CO-RE relocation record. */ >> +/* Outputs func_info region on .BTF.ext. */ >> >> static void >> -output_asm_btfext_core_reloc (bpf_core_reloc_ref bpfcr) >> +output_btfext_func_info (struct btf_ext_info_sec *sec) >> { >> - bpf_core_extra_ref *info = bpf_comment_info->get (bpfcr); >> - gcc_assert (info != NULL); >> - >> - bpfcr->bpfcr_astr_off += ctfc_get_strtab_len (ctf_get_tu_ctfc (), >> - CTF_STRTAB); >> - >> - dw2_assemble_integer (4, gen_rtx_LABEL_REF (Pmode, bpfcr->bpfcr_insn_label)); >> - fprintf (asm_out_file, "\t%s%s\n", >> - flag_debug_asm ? ASM_COMMENT_START : "", >> - (flag_debug_asm ? " bpfcr_insn" : "")); >> - >> - /* Extract the pretty print for the type expression. */ >> - pretty_printer pp; >> - dump_generic_node (&pp, (*info)->type, 0, TDF_VOPS|TDF_MEMSYMS|TDF_SLIM, >> - false); >> - char *str = xstrdup (pp_formatted_text (&pp)); >> - >> - dw2_asm_output_data (4, bpfcr->bpfcr_type, "bpfcr_type (%s)", str); >> - dw2_asm_output_data (4, bpfcr->bpfcr_astr_off, "bpfcr_astr_off (\"%s\")", >> - (*info)->accessor_str); >> - dw2_asm_output_data (4, bpfcr->bpfcr_kind, "bpfcr_kind"); >> -} >> - >> -/* Output all CO-RE relocation records for a section. */ >> - >> -static void >> -output_btfext_core_relocs (bpf_core_section_ref sec) >> -{ >> - size_t i; >> - bpf_core_reloc_ref bpfcr; >> - FOR_EACH_VEC_ELT (*(sec->relocs), i, bpfcr) >> - output_asm_btfext_core_reloc (bpfcr); >> + unsigned int str_aux_off = ctfc_get_strtab_len (ctf_get_tu_ctfc (), >> + CTF_STRTAB); >> + bool executed = false; >> + while (sec != NULL) >> + { >> + uint32_t count = 0; >> + if (sec->func_info.num_info > 0) >> + { >> + if (executed == false && (executed = true)) >> + dw2_asm_output_data (4, 8, "FuncInfo entry size"); >> + dw2_asm_output_data (4, sec->sec_name_off + str_aux_off, >> + "FuncInfo section string for %s", >> + sec->sec_name); >> + dw2_asm_output_data (4, sec->func_info.num_info, "Number of entries"); >> + >> + struct btf_ext_funcinfo *elem = sec->func_info.head; >> + while (elem != NULL) >> + { >> + if (elem->label != NULL) >> + { >> + count += 1; >> + dw2_asm_output_offset (4, elem->label, >> + NULL, "label for function %s", elem->fnname); >> + dw2_asm_output_data (4, elem->type, "btf_type_id"); >> + } >> + elem = elem->next; >> + } >> + } >> + >> + gcc_assert (count == sec->func_info.num_info); >> + sec = sec->next; >> + } >> } >> >> /* Output all CO-RE relocation sections. */ >> @@ -328,28 +542,51 @@ output_btfext_core_relocs (bpf_core_section_ref sec) >> static void >> output_btfext_core_sections (void) >> { >> - size_t i; >> - bpf_core_section_ref sec; >> - >> - /* BTF Ext section info. */ >> - dw2_asm_output_data (4, sizeof (struct btf_ext_reloc), >> - "btfext_core_info_rec_size"); >> - >> - FOR_EACH_VEC_ELT (*bpf_core_sections, i, sec) >> + struct btf_ext_info_sec *sec = btf_ext; >> + unsigned int str_aux_off = ctfc_get_strtab_len (ctf_get_tu_ctfc (), >> + CTF_STRTAB); >> + bool executed = false; >> + while (sec != NULL) >> { >> - /* Section name offset, refers to the offset of a string with the name of >> - the section to which these CORE relocations refer, e.g. '.text'. >> - The string is buffered in the BTF strings table. */ >> - >> - /* BTF specific strings are in CTF_AUX_STRTAB, which is concatenated >> - after CTF_STRTAB. Add the length of STRTAB to the final offset. */ >> - sec->name_offset += ctfc_get_strtab_len (ctf_get_tu_ctfc (), CTF_STRTAB); >> - >> - dw2_asm_output_data (4, sec->name_offset, "btfext_secinfo_sec_name_off"); >> - dw2_asm_output_data (4, vec_safe_length (sec->relocs), >> - "btfext_secinfo_num_recs"); >> - >> - output_btfext_core_relocs (sec); >> + uint32_t count = 0; >> + if (sec->core_info.num_info > 0) >> + { >> + if (executed == false && (executed = true)) >> + dw2_asm_output_data (4, 16, "CoreInfo entry size"); >> + dw2_asm_output_data (4, sec->sec_name_off + str_aux_off, >> + "CoreInfo section string for %s", >> + sec->sec_name); >> + dw2_asm_output_data (4, sec->core_info.num_info, "Number of entries"); >> + >> + struct btf_ext_core_reloc *bpfcr = sec->core_info.head; >> + while (bpfcr != NULL) >> + { >> + count += 1; >> + dw2_assemble_integer (4, >> + gen_rtx_LABEL_REF (Pmode, bpfcr->bpfcr_insn_label)); >> + fprintf (asm_out_file, "\t%s%s\n", >> + flag_debug_asm ? ASM_COMMENT_START : "", >> + (flag_debug_asm ? " bpfcr_insn" : "")); >> + >> + /* Extract the pretty print for the type expression. */ >> + pretty_printer pp; >> + dump_generic_node (&pp, bpfcr->info.type, 0, >> + TDF_VOPS|TDF_MEMSYMS|TDF_SLIM, >> + false); >> + char *str = xstrdup (pp_formatted_text (&pp)); >> + >> + dw2_asm_output_data (4, bpfcr->bpfcr_type, "bpfcr_type (%s)", >> + str); >> + dw2_asm_output_data (4, bpfcr->bpfcr_astr_off + str_aux_off, >> + "bpfcr_astr_off (\"%s\")", >> + bpfcr->info.accessor_str); >> + dw2_asm_output_data (4, bpfcr->bpfcr_kind, "bpfcr_kind"); >> + bpfcr = bpfcr->next; >> + } >> + } >> + >> + gcc_assert (count == sec->core_info.num_info); >> + sec = sec->next; >> } >> } >> >> @@ -362,22 +599,23 @@ btf_ext_init (void) >> BTF_EXT_INFO_SECTION_FLAGS, NULL); >> >> ASM_GENERATE_INTERNAL_LABEL (btf_ext_info_section_label, >> - BTF_EXT_INFO_SECTION_LABEL, >> - btf_ext_label_num++); >> - >> - vec_alloc (bpf_core_sections, 1); >> - bpf_comment_info = hash_map::create_ggc (); >> + "Lbtfext", 0); >> } >> >> + > > nit: extraneous newline > >> /* Output the entire .BTF.ext section. */ >> >> void >> btf_ext_output (void) >> { >> output_btfext_header (); >> - output_btfext_core_sections (); >> + output_btfext_func_info (btf_ext); >> + if (TARGET_BPF_CORE) >> + output_btfext_core_sections (); >> >> - bpf_core_sections = NULL; >> + /* Extra padding required by BPF code, just in case all structures are empty. >> + */ > > nit: trailing */ on newline. > >> + dw2_asm_output_data (4, 0, "Required padding by libbpf structs"); >> } >> >> #include "gt-coreout.h" >> diff --git a/gcc/config/bpf/coreout.h b/gcc/config/bpf/coreout.h >> index 8a209f26e94b..1c26b9274739 100644 >> --- a/gcc/config/bpf/coreout.h >> +++ b/gcc/config/bpf/coreout.h >> @@ -38,22 +38,6 @@ struct btf_ext_section_header >> uint32_t num_records; >> }; >> >> -/* A funcinfo record, in the .BTF.ext funcinfo section. */ >> -struct btf_ext_funcinfo >> -{ >> - uint32_t insn_off; /* Offset of the first instruction of the function. */ >> - uint32_t type; /* Type ID of a BTF_KIND_FUNC type. */ >> -}; >> - >> -/* A lineinfo record, in the .BTF.ext lineinfo section. */ >> -struct btf_ext_lineinfo >> -{ >> - uint32_t insn_off; /* Offset of the instruction. */ >> - uint32_t file_name_off; /* Offset of file name in BTF string table. */ >> - uint32_t line_off; /* Offset of source line in BTF string table. */ >> - uint32_t line_col; /* Line number (bits 31-11) and column (11-0). */ >> -}; >> - >> enum btf_core_reloc_kind >> { >> BPF_RELO_INVALID = -1, >> @@ -113,6 +97,10 @@ bpf_core_reloc_add (const tree type, const char * section_name, >> >> extern int bpf_core_get_sou_member_index (ctf_container_ref, const tree); >> >> +struct btf_ext_funcinfo *btf_add_func_info_for (tree decl, >> + const char *label); >> +unsigned int btf_ext_add_string (const char *str); >> + >> #ifdef __cplusplus >> } >> #endif >> diff --git a/gcc/testsuite/gcc.target/bpf/btfext-funcinfo-nocore.c b/gcc/testsuite/gcc.target/bpf/btfext-funcinfo-nocore.c >> new file mode 100644 >> index 000000000000..09d3acc8c2d4 >> --- /dev/null >> +++ b/gcc/testsuite/gcc.target/bpf/btfext-funcinfo-nocore.c >> @@ -0,0 +1,42 @@ >> +/* { dg-do compile } */ >> +/* { dg-options "-O2 -dA -gbtf -mno-co-re" } */ >> + >> +struct T { >> + int a; >> + int b; >> + struct U { >> + int c; >> + struct V { >> + int d; >> + int e[4]; >> + int f; >> + } v; >> + } u; >> +} __attribute__((preserve_access_index)); >> + >> +__attribute__((section("foo_sec"), used)) >> +int foo_func (struct T *t) >> +{ >> + t->u.c = 5; >> + return t->u.v.e[3]; >> +} >> + >> +__attribute__((section("bar_sec"), used)) >> +int bar_func (struct T *t) >> +{ >> + int *x = &(t->u.v.f); >> + int old = *x; >> + *x = 4; >> + return old; >> +} >> + >> +/* { dg-final { scan-assembler-times "FuncInfo section string for foo_sec" 1 } } */ >> +/* { dg-final { scan-assembler-times "FuncInfo section string for bar_sec" 1 } } */ >> +/* { dg-final { scan-assembler-times "label for function foo_func" 1 } } */ >> +/* { dg-final { scan-assembler-times "label for function bar_func" 1 } } */ >> +/* { dg-final { scan-assembler-times ".4byte\t0x1\t# Number of entries" 2 } } */ >> +/* { dg-final { scan-assembler-times "Required padding" 1 } } */ >> + >> +/* { dg-final { scan-assembler-times "ascii \"foo_sec.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> +/* { dg-final { scan-assembler-times "ascii \"bar_sec.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> + >> diff --git a/gcc/testsuite/gcc.target/bpf/btfext-funcinfo.c b/gcc/testsuite/gcc.target/bpf/btfext-funcinfo.c >> new file mode 100644 >> index 000000000000..a59c5bd37eb9 >> --- /dev/null >> +++ b/gcc/testsuite/gcc.target/bpf/btfext-funcinfo.c >> @@ -0,0 +1,46 @@ >> +/* { dg-do compile } */ >> +/* { dg-options "-O2 -dA -gbtf" } */ >> + >> +struct T { >> + int a; >> + int b; >> + struct U { >> + int c; >> + struct V { >> + int d; >> + int e[4]; >> + int f; >> + } v; >> + } u; >> +} __attribute__((preserve_access_index)); >> + >> +__attribute__((section("foo_sec"), used)) >> +int foo_func (struct T *t) >> +{ >> + t->u.c = 5; >> + return t->u.v.e[3]; >> +} >> + >> +__attribute__((section("bar_sec"), used)) >> +int bar_func (struct T *t) >> +{ >> + int *x = &(t->u.v.f); >> + int old = *x; >> + *x = 4; >> + return old; >> +} >> + >> +/* { dg-final { scan-assembler-times "FuncInfo section string for foo_sec" 1 } } */ >> +/* { dg-final { scan-assembler-times "FuncInfo section string for bar_sec" 1 } } */ >> +/* { dg-final { scan-assembler-times "label for function foo_func" 1 } } */ >> +/* { dg-final { scan-assembler-times "label for function bar_func" 1 } } */ >> + >> +/* { dg-final { scan-assembler-times "ascii \"0:2:1:1:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> +/* { dg-final { scan-assembler-times "ascii \"0:2:1:2.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> +/* { dg-final { scan-assembler-times "ascii \"foo_sec.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> +/* { dg-final { scan-assembler-times "ascii \"bar_sec.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> +/* { dg-final { scan-assembler-times "FuncInfo entry size" 1 } } */ >> + >> +/* { dg-final { scan-assembler-times ".4byte\t0x1\t# Number of entries" 3 } } */ >> +/* { dg-final { scan-assembler-times ".4byte\t0x2\t# Number of entries" 1 } } */ >> +/* { dg-final { scan-assembler-times "Required padding" 1 } } */ >> diff --git a/gcc/testsuite/gcc.target/bpf/core-attr-5.c b/gcc/testsuite/gcc.target/bpf/core-attr-5.c >> index c0dc15fbb271..e71901d0d4d1 100644 >> --- a/gcc/testsuite/gcc.target/bpf/core-attr-5.c >> +++ b/gcc/testsuite/gcc.target/bpf/core-attr-5.c >> @@ -55,8 +55,13 @@ func (struct T *t, int i) >> /* { dg-final { scan-assembler-times "ascii \"0:4.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"0:1:1:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"0:1:1:1.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> -/* { dg-final { scan-assembler-times "ascii \"0:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 2 } } */ >> +/* { dg-final { scan-assembler-times "ascii \"0:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"0:0.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:1:3\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:4\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:3\"\\)" 2 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:2\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:1:1\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:0\"\\)" 1 } } */ >> /* { dg-final { scan-assembler-times "bpfcr_type \\(struct T \\*\\)" 4 } } */ >> /* { dg-final { scan-assembler-times "bpfcr_type \\(struct U \\*\\)" 4 { xfail *-*-* } } } */ >> - >> diff --git a/gcc/testsuite/gcc.target/bpf/core-attr-6.c b/gcc/testsuite/gcc.target/bpf/core-attr-6.c >> index 858ae627cb8b..34a4c367e528 100644 >> --- a/gcc/testsuite/gcc.target/bpf/core-attr-6.c >> +++ b/gcc/testsuite/gcc.target/bpf/core-attr-6.c >> @@ -37,10 +37,14 @@ func (struct T *t, int i) >> mset (&t->a); >> } >> >> -/* { dg-final { scan-assembler-times "ascii \"0:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 2 } } */ >> +/* { dg-final { scan-assembler-times "ascii \"0:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"0:1:1:1.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"0:1:2.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"0:0.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:1:1\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:3\"\\)" 2 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:2\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:0\"\\)" 1 } } */ >> /* { dg-final { scan-assembler-times "bpfcr_type \\(struct T \\*\\)" 3 } } */ >> /* { dg-final { scan-assembler-times "bpfcr_type \\(struct U \\*\\)" 2 } } */ >> >> diff --git a/gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-offset-1.c b/gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-offset-1.c >> index a4af9a53282a..27654205287d 100644 >> --- a/gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-offset-1.c >> +++ b/gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-offset-1.c >> @@ -52,9 +52,18 @@ unsigned int foo (struct T *t) >> /* { dg-final { scan-assembler-times "ascii \"0:1:0:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"0:1:0:4.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"0:1:1:0.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> -/* { dg-final { scan-assembler-times "ascii \"0:1:1:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 2 } } */ >> +/* { dg-final { scan-assembler-times "ascii \"0:1:1:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"0:1:1:4.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"0:2.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> -/* { dg-final { scan-assembler-times "ascii \"0:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 2 } } */ >> +/* { dg-final { scan-assembler-times "ascii \"0:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> + >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:0:0\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:0:3\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:0:4\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:1:0\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:1:3\"\\)" 2 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:1:4\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:2\"\\)" 1 } } */ >> +/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:3\"\\)" 2 } } */ >> >> /* { dg-final { scan-assembler-times "0\[\t \]+\[^\n\]*bpfcr_kind" 10 } } */ >> diff --git a/gcc/testsuite/gcc.target/bpf/core-section-1.c b/gcc/testsuite/gcc.target/bpf/core-section-1.c >> index 4f16b087c1a2..c2bac46cee78 100644 >> --- a/gcc/testsuite/gcc.target/bpf/core-section-1.c >> +++ b/gcc/testsuite/gcc.target/bpf/core-section-1.c >> @@ -35,4 +35,4 @@ int bar_func (struct T *t) >> /* { dg-final { scan-assembler-times "ascii \"foo_sec.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "ascii \"bar_sec.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ >> /* { dg-final { scan-assembler-times "bpfcr_type" 2 } } */ >> -/* { dg-final { scan-assembler-times "btfext_core_info_rec_size" 1 } } */ >> +/* { dg-final { scan-assembler-times "CoreInfo entry size" 1 } } */