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 70FB1384DD84 for ; Mon, 12 Dec 2022 20:31:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 70FB1384DD84 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 (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 2BCGwXUe022722 for ; Mon, 12 Dec 2022 20:31:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=message-id : date : subject : to : cc : references : from : in-reply-to : content-type : content-transfer-encoding : mime-version; s=corp-2022-7-12; bh=JNI4FAWlNmHfL5IY+Q/7aBqLSOAqtVKtu5IVGYpI5bI=; b=zEAnjNKl7xWrzHf6aI/3xO5GmDJVsdnkXMmBdmYGftPgfyacScvcaKfGQUeQrsH70OB2 02k1z5nfIiv+kwVr8/e3zl40iqJ8bygjwzQTWmoOSI/BTU/1qHxz9niKRMQ2lA3kKqGs GGDAoFsOr4K+myq1ZEXkbr7kIDKWefBXn6Xl1hH/rGicJfaICUpcKAaMpTDYEp0DY+C4 +w3ZDA1RUaj7ecvp1gEQ/JOF+wd0NBdO1UxKanw8g62qfnbCzf+FThaAdAWgpDaVefNw Bz8q4zNCwg2F0yx01fEQ48stZ/T81CGigSagw8sre96dG5eBxK+XwMhVw1aTyCC7yd+H IQ== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3mcghckuvt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 12 Dec 2022 20:31:06 +0000 Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 2BCKHJ4D017686 for ; Mon, 12 Dec 2022 20:31:06 GMT Received: from nam04-bn8-obe.outbound.protection.outlook.com (mail-bn8nam04lp2049.outbound.protection.outlook.com [104.47.74.49]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3mcgjavaky-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 12 Dec 2022 20:31:06 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FBtvmr8M19GsWRgXilIbWh2DShDWiaZHJa8ha4AIwZNwoLOEo4THljRA+lRM0GsW79Ng2PuoOg1H1DpkUs+vyOoA79s2bxIUxn37mQzefS4x05bXfoU96jT1fyecAL4yp16QJD9K4+CalorcS1zIcTNeOJTG2Rp6w6KTw3ncaXu7I0dd7PKS7mJ1F0RzikQBEgjHEaiu00xS9nD49n29oUKDVnwmcWGOZqMHjxmUWUyPhvhznCck9SIUXXvWvSFl76qyKJmczRNsXM0g7qwOVcj/toYo0ERAAfMyf75QTDsaXzXwqX3my2pUhjcmrwEpL4L7z2xbUzz0G2v/Ga4kCQ== 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=JNI4FAWlNmHfL5IY+Q/7aBqLSOAqtVKtu5IVGYpI5bI=; b=ZxOufS5pk1nfsmyYU6MGSnSjOAWtpskfwXI8KdXqKEPpAQJUOOef9Rcjl8tqjBzEsu9B0eYSz3h+fYe+N6pEBqWjiKKYhdUQrsp5dnFCLPoTJ8DvpDafMSiDDWAjw0Ew0TmhMuEcrizB68DHe7BfeUA/FiB0gWYdfdz90jKU2fJUea5+Sxgq3lhu7NpeuuwnqeuFpDbTgdVXtGMuoI1oZW4ACt0/NN630tz3ADu1QbrUVGkfqwngJGloMUL9Ltx/x2c7e+0rSsnSph3ATgAo8f0r2z9XtjZEkoGnl6oJJ0bXvb2m5oQVDy6tG6gLc5K1aomnN0MLdK5uX/VDV2GW0A== 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=JNI4FAWlNmHfL5IY+Q/7aBqLSOAqtVKtu5IVGYpI5bI=; b=rElVUmpxEyQfA2M+2/TJVIEUChykHoVRBdC8/ArlI+xPqhA2rEExALV3DbKtWMWvL8jL75fgCgbqL9mhxPZYSHzxdX1tp4GypyFM0bWTp1X+ekamfBbV38JbsFT1TfdPC8suRWH0Fu8850L3uwtUJv4eInp2PPmYVzQG5ICKQfc= Received: from MN2PR10MB3213.namprd10.prod.outlook.com (2603:10b6:208:131::33) by DM4PR10MB6063.namprd10.prod.outlook.com (2603:10b6:8:b9::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5880.19; Mon, 12 Dec 2022 20:31:04 +0000 Received: from MN2PR10MB3213.namprd10.prod.outlook.com ([fe80::dd41:a422:5763:8848]) by MN2PR10MB3213.namprd10.prod.outlook.com ([fe80::dd41:a422:5763:8848%7]) with mapi id 15.20.5880.019; Mon, 12 Dec 2022 20:31:04 +0000 Message-ID: <565b04a6-b495-a78f-8318-d178fc849e2d@oracle.com> Date: Mon, 12 Dec 2022 12:31:01 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.5.1 Subject: Re: [PATCH 3/3] btf: correct generation for extern funcs [PR106773] Content-Language: en-US To: Indu Bhagat Cc: jose.marchesi@oracle.com, gcc-patches@gcc.gnu.org References: <20221207205734.9287-1-david.faust@oracle.com> <20221207205734.9287-4-david.faust@oracle.com> <5958e0f0-a22c-33d9-c935-7adf0c524b06@oracle.com> From: David Faust In-Reply-To: <5958e0f0-a22c-33d9-c935-7adf0c524b06@oracle.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: SN6PR08CA0025.namprd08.prod.outlook.com (2603:10b6:805:66::38) To MN2PR10MB3213.namprd10.prod.outlook.com (2603:10b6:208:131::33) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR10MB3213:EE_|DM4PR10MB6063:EE_ X-MS-Office365-Filtering-Correlation-Id: c1618c0a-d45b-4332-4c5f-08dadc7fca56 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: agI86dEbB72/amWX+PN3HSVey+a6Xr9tcmeCOt0X0OwMvjiI0uMHeijrl9YaKMCCQ4Rc4EpFrDcNUmp9jY6qxlXGZLfOEe1wrrCOOjJOIn9cc/KIWn+58u3rWxaJeoOfoMv40BSfn5v0Fowj11rtu1Hon9j89KbMUZpB7kjCsL3MPhgqFeAhvSpFjSh1I4y+dn15Fv5qgK6QwHR8wHcqVZWSvhJ0Sj5H5tHNPQVCvMqugNpGJei1yS9ExOKSXpgFSuh+vk1J0F9li7rM9HraSt0PW6OE/UvETg9yASK/6JxrcKK0S/XUvmGBrTjmAQ7VdJhxV8YixjCY7ZsGo2uymfJSLo4C0l3fN+O0Cvuy44CIDs/fpNaiJHwVia0FWuZtjmLANmZ+QmWd546LNLIp9SvVclY93lT4rzsB7AywaF+ocDgno8cXaxI2repc9Qx6/QCEsSFVZNF6iPq9W3SP+FzVq+kpD8NYio5eXGKygBLooqLcZF0PeO2Lh4DWUYAgboSHSYhSw2QzfBVXEEB5N5TD0FnlXlxAbaEuaEgxuj7ZmlS0LVjlVLRKhysW0drcAnjPxIdk0w+tr64lc9KsnNal4CiWhyuQGr5sAgRDnMvmwqdgXopNftSuCKwmZV8N/RWgDPE/ty5iUiaBKD91UrR3YN6gyzhmLl5TMnIfiQr5I+SWaIiZj4yi41Jcw1I1hLSBafX+L/Dfy74lRR7HCO77eHamdpWfJTo+6dBiWLRzz48thLz0wpOPi/9ANIj0hg9Dr0bds0+kU+twOtk11SbJU6IXhJxX7C1Z3wK3sfU= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR10MB3213.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(376002)(39860400002)(396003)(366004)(346002)(136003)(451199015)(31686004)(36756003)(84970400001)(86362001)(4326008)(37006003)(316002)(8676002)(31696002)(38100700002)(186003)(26005)(83380400001)(6486002)(6506007)(6512007)(6666004)(53546011)(66556008)(478600001)(5660300002)(6636002)(66946007)(44832011)(2616005)(6862004)(2906002)(8936002)(66476007)(41300700001)(30864003)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RHhIcW1HcmNLbmFoQkRQaE53TC9FTW1sV1h4eW11RHljZlBYa1F0R1RHd1Yx?= =?utf-8?B?T0YwaGR6VTJCZ3dWN2VLTWtKcmRNcnJuSExDMXBOUjUzbmQ2YlAyN1MwMEFl?= =?utf-8?B?RkYyOG0wWTVJT1dIYTlscURNeTROWEVVRDVSMHRqNmh5R2x2eWxpRjZjN0Jk?= =?utf-8?B?cEhoZmNtdGsvOVZaL0g4aWNpbmFpdlJOVmhOeUxYalEwOE53OW92MDFaNkRw?= =?utf-8?B?QXk0dm0yeTlzT0VHZ0VXekU5aGlKaTVWZnV4Q200RU1zeDIyY3ZSaVNpem82?= =?utf-8?B?U0JCZlpvQVIwV1QycEpDakVFRVFHRjhmVWxZbldHTGZvQnlQRnZRYzNETmVP?= =?utf-8?B?RkRqQ1RVWFJlV0RiTjU1MFJScmJpOUZFSWtHRXdKZ1BhTjJQN3orM0ViNkZW?= =?utf-8?B?UU42T2szU1JiOFpuL3FqQTlNbS80WUZWenlTcGNja2xieENRaXk5Wmlnc1pP?= =?utf-8?B?N2FKeS9LK05WRzZFS0EycmtKT3dva0NOZnJWZmdZV1pBT1hCMExZVjVMR2E0?= =?utf-8?B?bkhtVDM3LzJSN2N2VGcxYlVYYWlyMWRvb0d3dE9hRnNHOEZRZ3lXUERoeEtz?= =?utf-8?B?T0pKYldkQUN5TDN0OVlEVnppeFcra09vcXJNOFR0TWNEcFJpRkxVN2xNK3d2?= =?utf-8?B?aWJYWUtDUFBYLzYzQ2xPYklvSkN1N1BLVWtOOW43djZSM1ZLOFlRaVM2alFU?= =?utf-8?B?dnl3bURkcnpkNWRjcWZoSktzUDRvOVVsWWpmUjk3TmtpcmFVcWcwMHk5MHA2?= =?utf-8?B?czNscnVwMjBEekE5WHk1M2xzeUxxd3JMRTVtWnJvWTBOeGZxcy9qZXNOT2VS?= =?utf-8?B?dXcvUHFGWjJkM0Zjd3h6Umk2V1MwYkh4VUVaSno4RnNOTkZDMWpSZHpHSEZw?= =?utf-8?B?U2NDRHNRMnVmbnRma2V4M2IvbjdjSUNuRHowTStvd2ZyRXMrakR5SW1JZ1RN?= =?utf-8?B?WXFtT09CaHJEMDk5RXBIMWpNeE1hTHB0VFVJckpIaG5VeXZZNUFhcHZZU3JW?= =?utf-8?B?aHdVbmVZbUtuaUUwME9LVXdNRjlDazNVSFNqcUNyYk1iYlY5Ny9ERTFLR3pj?= =?utf-8?B?SUJLOUc2ay9GVWlMVkhUQnZ1WGdKc3BMY1IxdnpaODdESUVIaUhodkd5dko5?= =?utf-8?B?cWFjZlJRbHlteHE4VU51em5La0FpK2hGOHFrYlp2b3p2VElYVnJRWm1YUklv?= =?utf-8?B?U3BCUEdPQ2s1dlgzZVA4L1QwamFpS24yWUYwTHdFRmlnVGZGeFQ4SCtMTkEr?= =?utf-8?B?bXBMcHJXREZLUk9YOTdzT0NQTTY2ZHFDVk03RjZGVEpoSmxsWEpmUjVJeTM2?= =?utf-8?B?OEw3Qi85Y3lzSHdYV2xXbjg4dmszN0MvN3B0TC9saHBsZ2xMejNGYklmZW9w?= =?utf-8?B?VWIrVktibXZ0OS8wSG9QQUt3aHlrVlZzWTJjUzJjQndrL2FiQ3d0UldER2xK?= =?utf-8?B?TnFQL056M2d3L2ZlcE0ra3JTNVNsR0xoQmZhcFR1UHExQ3NXSFRIZkhoQTMz?= =?utf-8?B?c2lIRmQ5RG1lVGtrQ3JoNHRTUHUvRkxDaUsxVDJCZFpMZllwYVgxd2hXR3ZU?= =?utf-8?B?Y0ExZlhFWFNveXlyMyt1OStmdDRiSEc1VDRaNFhtMFQzQ0lDdnliRjc0cDRP?= =?utf-8?B?Q2p3M3NWdndJMGVDcWpHWjk1OGNHb3RGM1czV2Y2Q0ZMeWxTQ25PMVV4eU5p?= =?utf-8?B?N1hvdDQyeTlpTkl6dmVlN0w1b3VJUVE5SVdkcFJVYUJzSUtzWU9JODlvc0hj?= =?utf-8?B?cDJIdlVKUUltMjlROEJhbTk5RVdTMitzcDRZbnI0a2FWa1dERmdDQXlRVldD?= =?utf-8?B?c0NCMkI1RFNOeEhqNHNnUFhDa2gwOGgyMEFrOWRNNWNlVlNDa2NjR1pQQURV?= =?utf-8?B?aTFja291OVMwL0RwczBKeGNkaTdMQ2tsVTlIQWpHY2pUeUZ6YWh6cGtUS28z?= =?utf-8?B?N2FYczh2NTFjT0xyYngvcGZQRG5hT1pQNTBhS0c2RFdYczZyck9zMTB5Z3FX?= =?utf-8?B?UHhSTElVYlN5ZXdQZ1ZGc1ZzanpiVW1CWk5wSGVweUtVYW9QMlVxZHBIVFZp?= =?utf-8?B?REpwakRMY2JnZFpxTlVUQ2hLS2hJQUNlaDhhMFc5ZUZnWnJkbTlPbkJHdmg2?= =?utf-8?Q?EcwX0WX0uIzJe1cEKzP8JHAef?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: c1618c0a-d45b-4332-4c5f-08dadc7fca56 X-MS-Exchange-CrossTenant-AuthSource: MN2PR10MB3213.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2022 20:31:04.1363 (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: s++CaugFXdthwKymiEMdWC+Xx85qOcKYBcBNqhxYL1SURAAoLvM+MWFbYkmGX154IdNHf6Vqw+opJnJ9+cGZ9A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR10MB6063 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.923,Hydra:6.0.545,FMLib:17.11.122.1 definitions=2022-12-12_02,2022-12-12_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 phishscore=0 bulkscore=0 malwarescore=0 mlxlogscore=999 mlxscore=0 adultscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2210170000 definitions=main-2212120181 X-Proofpoint-ORIG-GUID: Ie9UA7V50tRrsUf5UjzJopwG5UGvINIV X-Proofpoint-GUID: Ie9UA7V50tRrsUf5UjzJopwG5UGvINIV X-Spam-Status: No, score=-13.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,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: On 12/8/22 23:36, Indu Bhagat wrote: > On 12/7/22 12:57, David Faust wrote: >> The eBPF loader expects to find entries for functions declared as extern >> in the corresponding BTF_KIND_DATASEC record, but we were not generating >> these entries. >> >> This patch adds support for the 'extern' linkage of function types in >> BTF, and creates entries for for them BTF_KIND_DATASEC records as needed. >> >> PR target/106773 >> >> gcc/ >> >> * btfout.cc (get_section_name): New function. >> (btf_collect_datasec): Use it here. Process functions, marking them >> 'extern' and generating DATASEC entries for them as appropriate. Move >> creation of BTF_KIND_FUNC records to here... >> (btf_dtd_emit_preprocess_cb): ... from here. >> >> gcc/testsuite/ >> >> * gcc.dg/debug/btf/btf-datasec-2.c: New test. >> * gcc.dg/debug/btf/btf-function-6.c: New test. >> >> include/ >> >> * btf.h (struct btf_var_secinfo): Update comments with notes about >> extern functions. >> --- >> gcc/btfout.cc | 129 ++++++++++++------ >> .../gcc.dg/debug/btf/btf-datasec-2.c | 28 ++++ >> .../gcc.dg/debug/btf/btf-function-6.c | 19 +++ >> include/btf.h | 9 +- >> 4 files changed, 139 insertions(+), 46 deletions(-) >> create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c >> create mode 100644 gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c >> >> diff --git a/gcc/btfout.cc b/gcc/btfout.cc >> index 05f3a3f9b6e..d7ead377ec5 100644 >> --- a/gcc/btfout.cc >> +++ b/gcc/btfout.cc >> @@ -294,7 +294,35 @@ btf_datasec_push_entry (ctf_container_ref ctfc, const char *secname, >> ds.entries.safe_push (info); >> >> datasecs.safe_push (ds); >> - num_types_created++; >> +} >> + >> + >> +/* Return the section name, as of interest to btf_collect_datasec, for the >> + given symtab node. Note that this deliberately returns NULL for objects >> + which do not go in a section btf_collect_datasec cares about. */ > > "Dot, space, space, new sentence." > >> +static const char * >> +get_section_name (symtab_node *node) >> +{ >> + const char *section_name = node->get_section (); >> + >> + if (section_name == NULL) >> + { >> + switch (categorize_decl_for_section (node->decl, 0)) >> + { >> + case SECCAT_BSS: >> + section_name = ".bss"; >> + break; >> + case SECCAT_DATA: >> + section_name = ".data"; >> + break; >> + case SECCAT_RODATA: >> + section_name = ".rodata"; >> + break; >> + default:; >> + } >> + } >> + >> + return section_name; >> } >> >> /* Construct all BTF_KIND_DATASEC records for CTFC. One such record is created >> @@ -305,7 +333,60 @@ btf_datasec_push_entry (ctf_container_ref ctfc, const char *secname, >> static void >> btf_collect_datasec (ctf_container_ref ctfc) >> { >> - /* See cgraph.h struct symtab_node, which varpool_node extends. */ >> + cgraph_node *func; >> + FOR_EACH_FUNCTION (func) >> + { >> + dw_die_ref die = lookup_decl_die (func->decl); >> + if (die == NULL) >> + continue; >> + >> + ctf_dtdef_ref dtd = ctf_dtd_lookup (ctfc, die); >> + if (dtd == NULL) >> + continue; >> + >> + /* Functions actually get two types: a BTF_KIND_FUNC_PROTO, and >> + also a BTF_KIND_FUNC. But the CTF container only allocates one >> + type per function, which matches closely with BTF_KIND_FUNC_PROTO. >> + For each such function, also allocate a BTF_KIND_FUNC entry. >> + These will be output later. */ > > "Dot, space, space, new sentence." > >> + ctf_dtdef_ref func_dtd = ggc_cleared_alloc (); >> + func_dtd->dtd_data = dtd->dtd_data; >> + func_dtd->dtd_data.ctti_type = dtd->dtd_type; >> + func_dtd->linkage = dtd->linkage; >> + func_dtd->dtd_type = num_types_added + num_types_created; >> + >> + /* Only the BTF_KIND_FUNC type actually references the name. The >> + BTF_KIND_FUNC_PROTO is always anonymous. */ >> + dtd->dtd_data.ctti_name = 0; >> + >> + vec_safe_push (funcs, func_dtd); >> + num_types_created++; >> + >> + /* Mark any 'extern' funcs and add DATASEC entries for them. */ >> + if (DECL_EXTERNAL (func->decl)) >> + { >> + func_dtd->linkage = BTF_LINKAGE_EXTERN; >> + > > What is the expected BTF when both decl and definition are present: > > extern int extfunc(int x); > int extfunc (int x) { > int y = foo (); > return y; > } Using clang implementation as the reference, a single FUNC record for "extfunc" with "global" linkage: $ cat extfuncdef.c extern int extfunc (int x); int extfunc (int x) { int y = foo (); return y; } $ clang -target bpf -c -g extfuncdef.c -o extfuncdef.o $ /usr/sbin/bpftool btf dump file extfuncdef.o [1] FUNC_PROTO '(anon)' ret_type_id=2 vlen=1 '(anon)' type_id=2 [2] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED [3] FUNC 'extfunc' type_id=1 linkage=global With this patch we do the same in GCC. > >> + const char *section_name = get_section_name (func); >> + /* Note: get_section_name () returns NULL for functions in text >> + section. This is intentional, since we do not want to generate >> + DATASEC entries for them. */ > > "Dot, space, space, new sentence." > >> + if (section_name == NULL) >> + continue; >> + >> + struct btf_var_secinfo info; >> + >> + /* +1 for the sentinel type not in the types map. */ >> + info.type = func_dtd->dtd_type + 1; >> + >> + /* Both zero at compile time. */ >> + info.size = 0; >> + info.offset = 0; >> + >> + btf_datasec_push_entry (ctfc, section_name, info); >> + } >> + } >> + >> varpool_node *node; >> FOR_EACH_VARIABLE (node) >> { >> @@ -317,28 +398,13 @@ btf_collect_datasec (ctf_container_ref ctfc) >> if (dvd == NULL) >> continue; >> >> - const char *section_name = node->get_section (); >> /* Mark extern variables. */ >> if (DECL_EXTERNAL (node->decl)) >> dvd->dvd_visibility = BTF_LINKAGE_EXTERN; >> >> + const char *section_name = get_section_name (node); >> if (section_name == NULL) >> - { >> - switch (categorize_decl_for_section (node->decl, 0)) >> - { >> - case SECCAT_BSS: >> - section_name = ".bss"; >> - break; >> - case SECCAT_DATA: >> - section_name = ".data"; >> - break; >> - case SECCAT_RODATA: >> - section_name = ".rodata"; >> - break; >> - default: >> - continue; >> - } >> - } >> + continue; >> >> struct btf_var_secinfo info; >> >> @@ -363,6 +429,8 @@ btf_collect_datasec (ctf_container_ref ctfc) >> >> btf_datasec_push_entry (ctfc, section_name, info); >> } >> + >> + num_types_created += datasecs.length (); >> } >> >> /* Return true if the type ID is that of a type which will not be emitted (for >> @@ -461,29 +529,6 @@ btf_dtd_emit_preprocess_cb (ctf_container_ref ctfc, ctf_dtdef_ref dtd) >> if (!btf_emit_id_p (dtd->dtd_type)) >> return; >> >> - uint32_t btf_kind >> - = get_btf_kind (CTF_V2_INFO_KIND (dtd->dtd_data.ctti_info)); >> - >> - if (btf_kind == BTF_KIND_FUNC_PROTO) >> - { >> - /* Functions actually get two types: a BTF_KIND_FUNC_PROTO, and >> - also a BTF_KIND_FUNC. But the CTF container only allocates one >> - type per function, which matches closely with BTF_KIND_FUNC_PROTO. >> - For each such function, also allocate a BTF_KIND_FUNC entry. >> - These will be output later. */ >> - ctf_dtdef_ref func_dtd = ggc_cleared_alloc (); >> - func_dtd->dtd_data = dtd->dtd_data; >> - func_dtd->dtd_data.ctti_type = dtd->dtd_type; >> - func_dtd->linkage = dtd->linkage; >> - >> - vec_safe_push (funcs, func_dtd); >> - num_types_created++; >> - >> - /* Only the BTF_KIND_FUNC type actually references the name. The >> - BTF_KIND_FUNC_PROTO is always anonymous. */ >> - dtd->dtd_data.ctti_name = 0; >> - } >> - >> ctfc->ctfc_num_vlen_bytes += btf_calc_num_vbytes (dtd); >> } >> >> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c >> new file mode 100644 >> index 00000000000..f4b298cf019 >> --- /dev/null >> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-datasec-2.c >> @@ -0,0 +1,28 @@ >> +/* Test BTF generation of DATASEC records for extern functions. >> + >> + Only functions declared extern should have entries in DATASEC records. */ >> + >> +/* { dg-do compile } */ >> +/* { dg-options "-O0 -gbtf -dA" } */ >> + >> +/* Expect one DATASEC with vlen=1 (.foo_sec) and one with vlen=2 (.bar_sec) */ >> +/* { dg-final { scan-assembler-times "0xf000002\[\t \]+\[^\n\]*btt_info" 1 } } */ >> +/* { dg-final { scan-assembler-times "0xf000001\[\t \]+\[^\n\]*btt_info" 1 } } */ >> + >> +/* Function entries should have offset and size of 0 at compile time. */ >> +/* { dg-final { scan-assembler-times "0\[\t \]+\[^\n\]*bts_offset" 3 } } */ >> +/* { dg-final { scan-assembler-times "0\[\t \]+\[^\n\]*bts_size" 3 } } */ >> + >> +extern int foo (int a) __attribute__((section(".foo_sec"))); >> + >> + >> +extern int bar (int b) __attribute__((section(".bar_sec"))); >> +extern void chacha (void) __attribute__((section(".bar_sec"))); >> + >> +__attribute__((section(".foo_sec"))) >> +void baz (int *x) >> +{ >> + chacha (); >> + >> + *x = foo (bar (*x)); >> +} >> diff --git a/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c >> new file mode 100644 >> index 00000000000..48a946ab14b >> --- /dev/null >> +++ b/gcc/testsuite/gcc.dg/debug/btf/btf-function-6.c >> @@ -0,0 +1,19 @@ >> +/* Test BTF extern linkage for functions. >> + >> + We expect to see one BTF_KIND_FUNC type with global linkage (foo), and >> + one BTF_KIND_FUNC type with extern linkage (extfunc). */ >> + >> +/* { dg-do compile } */ >> +/* { dg-options "-O0 -gbtf -dA" } */ >> + >> +/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=2" 1 } } */ >> +/* { dg-final { scan-assembler-times "btt_info: kind=12, kflag=0, linkage=1" 1 } } */ >> + >> +extern int extfunc(int a, int b); >> + >> +int foo (int x) { >> + >> + int y = extfunc (x, x+1); >> + >> + return y; >> +} >> diff --git a/include/btf.h b/include/btf.h >> index 9a757ce5bc9..f41ea94b75f 100644 >> --- a/include/btf.h >> +++ b/include/btf.h >> @@ -186,12 +186,13 @@ struct btf_var >> }; >> >> /* BTF_KIND_DATASEC is followed by VLEN struct btf_var_secinfo entries, >> - which describe all BTF_KIND_VAR types contained in the section. */ >> + which describe all BTF_KIND_VAR or extern BTF_KIND_FUNC types contained >> + in the section. */ >> struct btf_var_secinfo >> { >> - uint32_t type; /* Type of variable. */ >> - uint32_t offset; /* In-section offset of variable (in bytes). */ >> - uint32_t size; /* Size (in bytes) of variable. */ >> + uint32_t type; /* Type of BTF_KIND_VAR or BTF_KIND_FUNC item. */ >> + uint32_t offset; /* In-section offset (in bytes) of item. */ >> + uint32_t size; /* Size (in bytes) of item. */ >> }; >> >> /* BTF_KIND_ENUM64 is followed by VLEN struct btf_enum64 entries, >