From patchwork Thu Aug 1 07:57:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Indu Bhagat X-Patchwork-Id: 94931 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 951583858C35 for ; Thu, 1 Aug 2024 07:58:24 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by sourceware.org (Postfix) with ESMTPS id 2A5AF3858C56 for ; Thu, 1 Aug 2024 07:57:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2A5AF3858C56 Authentication-Results: sourceware.org; dmarc=pass (p=reject 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 2A5AF3858C56 Authentication-Results: server2.sourceware.org; arc=pass smtp.remote-ip=205.220.177.32 ARC-Seal: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1722499075; cv=pass; b=XtD5xnJU7pzOaOuOBR/kTVefJMIY/FHQ4IM2G/mhTjt1I6NpMGIopQdo1l59Vt7bqDSbbqtBAytRv6GHYj1lgcwgL9HlCuaddc9h9EM/H/eKoqOr3wnVRUqtv7YAVP/nOVOjqn54MZPSE4MxB0yMuUvMpj6thWPF67Ls1B0xiJA= ARC-Message-Signature: i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1722499075; c=relaxed/simple; bh=0l2B9kkBqsUo8v5ahZLb9NUnUCUFIhx44p1BVgEfLk8=; h=DKIM-Signature:DKIM-Signature:From:To:Subject:Date:Message-ID: MIME-Version; b=gAOkeMMCrIuQA0rfJA/3zOYXam4+nk6zHXxxx2BQmtgpUCdWp5t9eR+q1X/5VgDdQoGprWIYCDgGiQ2kyb37kfcC/kDZ2j/bCJ5IYMHkIErwSAO8jZe3TLKnnTpquCJmawYaBhcqFWOe8aT2ZrTkvZmYoh85DJOiTbwhIbi4CKY= ARC-Authentication-Results: i=2; server2.sourceware.org Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 4717tZYr024313; Thu, 1 Aug 2024 07:57:52 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h= from:to:cc:subject:date:message-id:content-transfer-encoding :content-type:mime-version; s=corp-2023-11-20; bh=0l2B9kkBqsUo8v 5ahZLb9NUnUCUFIhx44p1BVgEfLk8=; b=DXzQinPFpr6sKblj4pjLit3GyXREuo lf4iEinO0Yqp1bXrB0gr1fp9fl4d25pFvb9GygsgSgIjeLmjImBrKe0fbSKTQC1p NH1DFdIdvMvzswhdgTeq/A+qr4xGApSywSU9RdtWcHK2oKV9tdecrzfCay1IuGqH ai9okl96JyS34a7sMsYjzEn88mrMnJYAhT6eO6Al4tQdRt5uYtYpbsRMW1z7+svz IVy8ytAcHZAJCQg4hCcBuIj5gJvGopAOrfAe2R2CvXrmjVz4ORH4/hkUVUPfjava DuFlV6/Xh+n3cAXH4XTIy0qN3X+G9OLgBsLCYfMfjOHcIhpPPAkIvNiw== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 40mqacs5s6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 01 Aug 2024 07:57:52 +0000 (GMT) Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 4716MwaT019143; Thu, 1 Aug 2024 07:57:52 GMT Received: from nam10-bn7-obe.outbound.protection.outlook.com (mail-bn7nam10lp2042.outbound.protection.outlook.com [104.47.70.42]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 40qjmta2bp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 01 Aug 2024 07:57:51 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KQK0DBICLxFhxqmo3/FEBFE3TdVygPZlhlBPumouxxnZDfWBOY0hG9u3SnGv3bBwZd4MLTJQ0tStBO4WlVQbDWYV6bcfSmZ46jMaq0UFbeRXM5FzcCFmh4hG13pF4CLIEKPQNdhP2nAUK/B4r2Na8vdfP2g6UwbbXm9AI6jChpDWL9a436gaJ4NvARl2kkvagUVOdVVscdnkHMWG+r2cJkG8wQNPRApxuUAjR0Qp+eJ3j2vAI1PrNTooAq9U/yGpBO41DG6FTBhS52vT+lsd/k0or4XXMHmZiAuUomk9BvueTTEmQFsHhYhFVxu0zgLKyIcEl9LnwHDSaqfn8k7qyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=0l2B9kkBqsUo8v5ahZLb9NUnUCUFIhx44p1BVgEfLk8=; b=IYdzn6lvZmiU1Y87wrdsR2REJZo+5gKSe7tJnN7HvZlq48n404wnvN7zMa3/K6IwYxg6fsp/8XNel+Wm3uweBlfFp+0lweQZ7O+GD3cqQFAkqB1AQT6DMQfBYeidqZlFSIBZhhceHKIztFP4j2Sk90BjHIV6H9drznx3QMBObe9nBFUR/zkiaJqtCR0CfpCPAQo983o/G3SCE99tTZBLpG5Y2SdWAlDh7fIoewYu9JVYsGi2ZQxts3i6EWtK+RmONI+GWLY2WkBgm0q0O6EPTNNVOgad+6hgC1E+BbyH3APEYQGF34DrrkrB3BAfVcGWLxspiRRKgFaYsnWGITtIdw== 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=0l2B9kkBqsUo8v5ahZLb9NUnUCUFIhx44p1BVgEfLk8=; b=rTIyYzoOiB4x3ZCqIj/lWApcZbWLlbe5TWyhTl/rJ82VDeZQLdO4XC7dx/ZOxlY46NsQpwBaN9xcRsJw2wElKboyCVtbgmbJSU6KEqgPQmNHBVW2nyVwhTe5F6R1MRsZu0PLGW1251qTCBf1sI+1tPh0BiUX+DL6bahvoYSnLKA= Received: from BN6PR1001MB2180.namprd10.prod.outlook.com (2603:10b6:405:32::23) by SA2PR10MB4492.namprd10.prod.outlook.com (2603:10b6:806:11f::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7828.21; Thu, 1 Aug 2024 07:57:50 +0000 Received: from BN6PR1001MB2180.namprd10.prod.outlook.com ([fe80::34e:408e:c7a1:2446]) by BN6PR1001MB2180.namprd10.prod.outlook.com ([fe80::34e:408e:c7a1:2446%4]) with mapi id 15.20.7807.026; Thu, 1 Aug 2024 07:57:50 +0000 From: Indu Bhagat To: binutils@sourceware.org Cc: jbeulich@suse.com, Indu Bhagat Subject: [PATCH, V2] gas: x86: ginsn: handle previously missed indirect call and jmp ops Date: Thu, 1 Aug 2024 00:57:44 -0700 Message-ID: <20240801075744.2893180-1-indu.bhagat@oracle.com> X-Mailer: git-send-email 2.43.0 X-ClientProxiedBy: MW4P220CA0002.NAMP220.PROD.OUTLOOK.COM (2603:10b6:303:115::7) To BN6PR1001MB2180.namprd10.prod.outlook.com (2603:10b6:405:32::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN6PR1001MB2180:EE_|SA2PR10MB4492:EE_ X-MS-Office365-Filtering-Correlation-Id: c23e05cc-5334-4e75-67cb-08dcb1ffa38b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: b0hLVFWCDbJ4W3EoUOyLFWE065JUvuFpu1Ly7YAcO5BYG4R13BmFjfOpyrPChjCtNtC3WWUNNAcZmpJgbNi5RSK/0FRzep+JzjS4dUrTkfIziaCip+eeOk1tq8f1njs7PEUZ+pun6n1IxP0iVl0BrHBOpw1vBxyvKFAl0OcMPj1z3DyHQkUsWEP1u12Gi4zeT9oz5dptWAdL237gXSg/jGaSjCaLxGofLNoB8fJjNxfYZTk61jGBO1UkR7AFiptngehURSqAYtQRMedFCK/nTgTtH0hqPRdws4BwIjgbpp81igsE9lNQrjfNTGt7swgJJYmNxwFYLrLqIXj/nc1VKzHVlFDGp8h4qBSVBVzHjGYfbFjpYBL9LyvYHzBrjTIJ5Az9fFdW14fhFKQgYPlzDjLkERKO+qQdPWXJw5tvXxvZlZwdHayEVow18H2mSisPljpB9ez91sQI02GaQOy1f/vRTr2BZ3UsYvVl4KCmmTVWnmirKyn+QkxgilB/5sqSm3ey2+ZQUbzF8Fgr7wKNapMhI2Zi4/6BYu15H12pU48NHbpLCC7+iNlahfSkcyiizGjW2yihtjO/Y3nSV6y6ateezkvhHlqKD8jaR0ecvDMQNCCVw0aVjdZO954dxB4SeGkJmH2FPrOncK94E4P6+4hXw5HJ1li4AzjK0PO5Kgv5xSmgEWGgwo2hyKtH5oFicPYDQlXNnlz5DF54utpt/VtNvSHL08HPQQGfUzuUdVAk+bkoXxMo3KnC1xp8uN3gXt8F7901CbZwy+ouM+dUOXsr9wF6Fbv4TfP2pr4ly2x4Bzvu89SonfB1eH+V6xzLGhf+BcwPaKu+GRFj1NNEiJIIoNVj/sMbL3BYOpE1koXJDOrGAt+n6PHHlqoT2tvo4C0FOuJA8rJEjc1b7B1ILXh/IC/6Z/ZGJk7rH4koT/b0A+nGkQeY9WCUJcfq/7K9eC5N21GBMQLzk5Dpun1MWVS2gGyNILiwkucs2VSWvDcPIcxr6MSBmzHfNqP2Zo0SknUD01QXBWPrrmyqZKWL+5X0C5yXTBN5f3zg2TotSdpMc5Idm6/PGJAgp/Bwpfgnp6Cw08LYY88i3DXBX/nrvAYFaxZm2CJ21BIEGbjXz+wX0kzj7e+wfPbVGD7RPiZrkiBev+/ALeYXNrNNLiOjFu73QJ972G09JIKqczBxuACCSEmp//ehhk2sAPa0Y8GGKB4f8xNNIzFNVn3rTEndf+V9ChhmiPFRGE5KfiM13QdD0Y8pPt3woUtjFP4Ofl8TIbHxXrJHE+byjijNYrAUacAuxgpHQK0mBWbDFKuiShAKE7de/yiaSMduv+u1CFcTaQH3H7JryPhokcNIOpVTHA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:BN6PR1001MB2180.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(376014)(366016)(1800799024); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 9+zmLVWIaWPFBbm1HvqDBjHUuehC+gM3KoBp5hFP1z4cBOaZDesxuyk6gbPCM7hg6PZochDyF+b3s70ifqAIluhhyBvvZwctLeHBq9D5esUMfHnuBi6d9Jn7UkICwRshlPi3hWHa3oqC8bJa3eqFBJdubaG9MPOkxH3t0xC1lic3k+w0Q5EIGw0imxMnih9Z1Hlw2kJ2UjIvU77Lcnp0LAIHiaeEU2Ml+6dUTpNJOf2sBbLGKiq8ddRL+46o+nvwr6HeGEC6IPrHBu2OJCFAgmN2LT4DLiQ/goWBVKCcFnk5w1/gF+cehY2xEY6XkJJIUYMazk2JqW9lzX6ApvZ8MDBUfSeVo9VpKmuuSGFQUKFGr/aIDPjj/RkRh0lgFll1MY3NIazyn/v+QJDNhfUFgt0JMy6npOsAorYCfrXODbukDRe0KC+UF+6+k/+o7I6Y5nRbeop2oKOvaftY9Qw7WSVCYjYxnyO3Jj7H4ISkrEL4FYLgGNv3T6cnrpnXVjF1cxU1oQYlPngY63vBavWIortp4aaSmig5sg1aj5SYjzw1IKtlCvNF5LukzKoQc1D5XGQEm/GpaPsZvtcHgS8W28rv+y97PfXWVjkjXQMemU8pXDGTK0kVbDQiRk6DGUT5by0j7wDHyiJe0vPCjEJ7Gn4KnFPbnSotAjOi9CGewbBray8Y3udxW5PmzOqi4HRfdKcrty5UIqyh6QHU7/mYl/YDRD71gwPsr2EYELfqvqEviz4DAnDHMawgzo9p1f6cwAWzrcw0VwkFEYJ8FuvfacCNokozqdZmz68bXOMWh3h5LxK430Zg/8TYItVslUNklWWSSuJOmyuemkTvV+1IU6yawkbqlTT3Xw6EHaPPJJLoIBTSbUPx0w1J00OoVhLLBIY0sWOA9pGru4h9vVHCmah13hER9Eud8hnwkqpCyhH5IiukoovpIIPWjVIWJ/zaHUaPaQWMcu1yTkn44xLlE1CfrL3QsDTnwaqb+Kms00ugILM3/IoU/tuxNQ52YfT+AO474gOj2VakSzrI8hvsT63rQPoIN1i1bo4PXXnO8gyDzdpnSMhQRW5URmqyiWS2qWSApuDuXZ9CytQLThsl3hIEtKKoiusQZBekdeg8yeHyeZvSAEnL+4J0HdJIvE1Lb9fj2w0cRWk8EMGzC6ZdAVozTV/YzDsq+Es+SWeRoMQx5Y0v/1baX8THfHldp62RNyZOTaK2GG3EvIGN3dhKS3wmYDP892x0IJxjUPD0DHKwfg+EUg93f4TAUVFGg4x0YNlNEbrPtDTrb3nrTDTSJyXMsOoh+XlfyCsX87dteiqAjHC7M8lV8GcakVkF6k58+m4N5Yy3IXjQqElrKqSV/7eHZOVf/H63fFti0JVHuoXc6Lakel9mbf7Az6Ago1xKBKmzEVcpw+9lbyu+vvKYF6L6urZKLP8nRxHTzviCXYuiTcqTT6cWUlDoiYBS/wVwnjk9oV9FrR0gGV0nwZpH4kZG9MIKHXQKdYWzgirrryVX9WPCm9Ra6byFho77Pg9Uteql0EFmfBRxXxVY5qzqZbGUxBeUfgRt2YiP/9r5LVXCF/7+vqBhKIkFG/aso2RnIPh8ktrSiC0zRB5fsATqYszoiEGF//7lu9jCCKwNxEE= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: nrse9M3WAntO4XLTQcDRMCd7lFI8J1mWyJtj7ESI9uMc/6Fqfnvxth1GIKQGWs35jNH6yLbSzcvL6WkWqOoBIGndhlyhRHeb70jYsihvnKcpbg9FrSh6SzNO4GP/PA+fZ7VikcoR+23e9cikbTUq6XRU/44H9za3ZrwKiO4oWLFZqg8iS+dRZ3eEpnUvWWywYQ7hGF3jquPxl5sCfmKjr0oesykQPQkzMh5U9LpWXWOZobthXUdzgkq3PvdFgBeK+BzXtFSBhyQJNIhSr0D44lqXTzpnvoQzP8ymcauiYuop7Y0b612Om1899M1LxRWXScRAJV8cgjTG9h1dkoMGaHw+BzMKzW/2voM/ndIju+7e4ERhb37ws229agOEhz91UxCWk5n7XrkfjUpZs9fs04frRUcPAuuQWZ77pMEqzEE5JRwHfvuicoymD7uqWQ9cIVK8RtMD2t/Kwjf9uHTX69ntMQcqOdQL7hZBtdkMKUzgsLkwoqlcGnUtYTzWSSJCJZyeZTkTMqFGB6cvYvZHoMWMoeVn+RWIkIDthY4ylCVXJFlH3zfJXq7QevIG3I2UXYo2lvH7PGr8SERtTAQ7UOD08SuwM51euyypD44k1Pw= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: c23e05cc-5334-4e75-67cb-08dcb1ffa38b X-MS-Exchange-CrossTenant-AuthSource: BN6PR1001MB2180.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Aug 2024 07:57:49.9699 (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: JhAWLHSM0cD/B7zJNHs3EuPQX/LbfalS1LoCTugwAOzWHKicls2wdmqOY6q/MIMMv7uQSCBQ77eTVFBZY4wmKw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4492 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.28.16 definitions=2024-08-01_04,2024-07-31_01,2024-05-17_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 malwarescore=0 suspectscore=0 mlxlogscore=999 phishscore=0 spamscore=0 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2407110000 definitions=main-2408010046 X-Proofpoint-ORIG-GUID: faKVZ6cYKTvQyC3Y4gVeu6a3LkmvskWj X-Proofpoint-GUID: faKVZ6cYKTvQyC3Y4gVeu6a3LkmvskWj X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, MIME_BASE64_TEXT, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, 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 X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org Some flavors of indirect call and jmp instructions were not being handled earlier, leading to a GAS error (#1): (#1) "Error: SCFI: unhandled op 0xff may cause incorrect CFI" Not handling jmp/call (direct or indirect) ops is an error (as shown above) because SCFI needs an accurate CFG to synthesize CFI correctly. Recall that the presence of indirect jmp/call, however, does make the CFG ineligible for SCFI. In other words, generating the ginsns for them now, will eventually cause SCFI to bail out later with an error (#2) anyway: (#2) "Error: untraceable control flow for func 'XXX'" The first error (#1) gives the impression of missing functionality in GAS. So, it seems cleaner to synthesize a GINSN_TYPE_JUMP / GINSN_TYPE_CALL now in the backend, and let SCFI machinery complain with the error as expected. The handling for these indirect jmp/call instructions is similar, so reuse the code by carving out a function for the same. Adjust the testcase to include the now handled jmp/call instructions as well. gas/ * config/tc-i386-ginsn.c (x86_ginsn_indirect_branch): New function. (x86_ginsn_new): Refactor out functionality to above. gas/testsuite/ * gas/scfi/x86_64/ginsn-cofi-1.l: Adjust the output. * gas/scfi/x86_64/ginsn-cofi-1.s: Add further varieties of jmp/call opcodes. --- [Changes in V2] - Rebase to latest master. - Rename function to x86_ginsn_indirect_branch. Adjust commit log. - Fix code comments. Mention TBD_GINSN_GEN_NOT_SCFI. - Add new insns: call *(,%rdx, 4) and jmp *%r8 to ginsn-cofi-1.s testcase. [End of changes in V2] gas/config/tc-i386-ginsn.c | 101 +++++++++++-------- gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l | 48 ++++++--- gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.s | 6 ++ 3 files changed, 95 insertions(+), 60 deletions(-) diff --git a/gas/config/tc-i386-ginsn.c b/gas/config/tc-i386-ginsn.c index dccd6758f0a..b9dc9c10cbb 100644 --- a/gas/config/tc-i386-ginsn.c +++ b/gas/config/tc-i386-ginsn.c @@ -468,6 +468,61 @@ x86_ginsn_jump (const symbolS *insn_end_sym, bool cond_p) return ginsn; } +static ginsnS * +x86_ginsn_indirect_branch (const symbolS *insn_end_sym) +{ + ginsnS *ginsn = NULL; + const reg_entry *mem_reg; + unsigned int dw2_regnum; + + ginsnS * (*ginsn_func) (const symbolS *sym, bool real_p, + enum ginsn_src_type src_type, unsigned int src_reg, + const symbolS *src_ginsn_sym); + + /* Other cases are not expected. */ + gas_assert (i.tm.extension_opcode == 4 || i.tm.extension_opcode == 2); + + if (i.tm.extension_opcode == 4) + /* 0xFF /4 (jmp r/m). */ + ginsn_func = ginsn_new_jump; + else if (i.tm.extension_opcode == 2) + /* 0xFF /2 (call r/m). */ + ginsn_func = ginsn_new_call; + + if (i.reg_operands) + { + dw2_regnum = ginsn_dw2_regnum (i.op[0].regs); + ginsn = ginsn_func (insn_end_sym, true, + GINSN_SRC_REG, dw2_regnum, NULL); + ginsn_set_where (ginsn); + } + else if (i.mem_operands) + { + /* Handle jump/call near, absolute indirect, address. + E.g., jmp/call *imm(%rN), jmp/call *sym(,%rN,imm) + or jmp/call *sym(%rN) etc. */ + mem_reg = i.base_reg ? i.base_reg : i.index_reg; + /* Generate a ginsn, even if it is with TBD_GINSN_INFO_LOSS. Otherwise, + the user gets the impression of missing functionality due to this + being a COFI and alerted for via the x86_ginsn_unhandled () workflow + as unhandled operation (which can be misleading for users). + + Indirect branches make the code block ineligible for SCFI; Hence, an + approximate ginsn will not affect SCFI correctness: + - Use dummy register if no base or index + - Skip symbol information, if any. + Note this case of TBD_GINSN_GEN_NOT_SCFI. */ + dw2_regnum = (mem_reg + ? ginsn_dw2_regnum (mem_reg) + : GINSN_DW2_REGNUM_RSI_DUMMY); + ginsn = ginsn_func (insn_end_sym, true, + GINSN_SRC_REG, dw2_regnum, NULL); + ginsn_set_where (ginsn); + } + + return ginsn; +} + static ginsnS * x86_ginsn_enter (const symbolS *insn_end_sym) { @@ -977,50 +1032,8 @@ x86_ginsn_new (const symbolS *insn_end_sym, enum ginsn_gen_mode gmode) ginsn_set_where (ginsn_next); gas_assert (!ginsn_link_next (ginsn, ginsn_next)); } - else if (i.tm.extension_opcode == 4) - { - /* jmp r/m. E.g., notrack jmp *%rax. */ - if (i.reg_operands) - { - dw2_regnum = ginsn_dw2_regnum (i.op[0].regs); - ginsn = ginsn_new_jump (insn_end_sym, true, - GINSN_SRC_REG, dw2_regnum, NULL); - ginsn_set_where (ginsn); - } - else if (i.mem_operands && i.index_reg) - { - /* jmp *0x0(,%rax,8). */ - dw2_regnum = ginsn_dw2_regnum (i.index_reg); - ginsn = ginsn_new_jump (insn_end_sym, true, - GINSN_SRC_REG, dw2_regnum, NULL); - ginsn_set_where (ginsn); - } - else if (i.mem_operands && i.base_reg) - { - dw2_regnum = ginsn_dw2_regnum (i.base_reg); - ginsn = ginsn_new_jump (insn_end_sym, true, - GINSN_SRC_REG, dw2_regnum, NULL); - ginsn_set_where (ginsn); - } - } - else if (i.tm.extension_opcode == 2) - { - /* 0xFF /2 (call). */ - if (i.reg_operands) - { - dw2_regnum = ginsn_dw2_regnum (i.op[0].regs); - ginsn = ginsn_new_call (insn_end_sym, true, - GINSN_SRC_REG, dw2_regnum, NULL); - ginsn_set_where (ginsn); - } - else if (i.mem_operands && i.base_reg) - { - dw2_regnum = ginsn_dw2_regnum (i.base_reg); - ginsn = ginsn_new_call (insn_end_sym, true, - GINSN_SRC_REG, dw2_regnum, NULL); - ginsn_set_where (ginsn); - } - } + else if (i.tm.extension_opcode == 4 || i.tm.extension_opcode == 2) + ginsn = x86_ginsn_indirect_branch (insn_end_sym); break; case 0xc2: /* ret imm16. */ diff --git a/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l b/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l index ab6b50d47e8..3261b76a5fd 100644 --- a/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l +++ b/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l @@ -1,8 +1,7 @@ .*: Assembler messages: -.*:20: Error: untraceable control flow for func 'foo' +.*:26: Error: untraceable control flow for func 'foo' GAS LISTING .* - 1 # Testcase with a variety of "change of flow instructions" 2 # 3 # This test does not have much going on wrt synthesis of CFI; @@ -22,17 +21,34 @@ GAS LISTING .* 12 ginsn: JMP %r0, 13 \?\?\?\? 41FFD0 call \*%r8 13 ginsn: CALL - 14 \?\?\?\? 67E305 jecxz .L179 - 14 ginsn: JCC - 15 \?\?\?\? FF6730 jmp \*48\(%rdi\) - 15 ginsn: JMP %r5, - 16 \?\?\?\? 7000 jo .L179 - 16 ginsn: JCC - 17 .L179: - 17 ginsn: SYM .L179 - 18 \?\?\?\? C3 ret - 18 ginsn: RET - 19 .LFE0: - 19 ginsn: SYM .LFE0 - 20 .size foo, .-foo - 20 ginsn: SYM FUNC_END + 14 \?\?\?\? FF14C500 call \*cost_arr\(,%rax,8\) + 14 000000 + 14 ginsn: CALL + 15 \?\?\?\? FF149500 call \*\(,%rdx, 4\) + 15 000000 + 15 ginsn: CALL + 16 \?\?\?\? FF142500 call \*symbol\+1 + 16 000000 + 16 ginsn: CALL + 17 \?\?\?\? 67E316 jecxz .L179 + 17 ginsn: JCC + 18 \?\?\?\? 41FFE0 jmp \*%r8 + 18 ginsn: JMP %r8, + 19 \?\?\?\? FF6730 jmp \*48\(%rdi\) + 19 ginsn: JMP %r5, + 20 \?\?\?\? FF24C500 jmp \*cost_arr\(,%rax,8\) + 20 000000 + 20 ginsn: JMP %r0, + 21 \?\?\?\? FF242500 jmp \*symbol\+1 + 21 000000 + 21 ginsn: JMP %r4, + 22 \?\?\?\? 7000 jo .L179 + 22 ginsn: JCC + 23 .L179: + 23 ginsn: SYM .L179 + 24 \?\?\?\? C3 ret + 24 ginsn: RET + 25 .LFE0: + 25 ginsn: SYM .LFE0 + 26 .size foo, .-foo + 26 ginsn: SYM FUNC_END diff --git a/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.s b/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.s index 0a63910e046..5ab66ba5c26 100644 --- a/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.s +++ b/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.s @@ -11,8 +11,14 @@ foo: loop foo notrack jmp *%rax call *%r8 + call *cost_arr(,%rax,8) + call *(,%rdx, 4) + call *symbol+1 jecxz .L179 + jmp *%r8 jmp *48(%rdi) + jmp *cost_arr(,%rax,8) + jmp *symbol+1 jo .L179 .L179: ret