From patchwork Wed Sep 20 23:04:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Indu Bhagat X-Patchwork-Id: 76475 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 9217E388455E for ; Wed, 20 Sep 2023 23:06:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9217E388455E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1695251200; bh=voeO4w5QQIxprbFVBd5KAewWZIirYvz714JrJSA7+m4=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=LYgdVy9JQ6UrydEfLUzlxqSOx/xgfEraQrxOZW+EHdJUarKcQPiquvHVsIceQADqf KGGDGICnxhlpARUY/vgzZUA91KlrzU3g+lbCX1CdiauCW3DbNUSzpB+0VVjMQSeXF0 ONIOMVjJbYKkxtgqknff6voMuhHPyPFQqZo8VWWc= 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 B37FE386BFEF for ; Wed, 20 Sep 2023 23:05:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B37FE386BFEF Received: from pps.filterd (m0333520.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 38KKJ5GO002711 for ; Wed, 20 Sep 2023 23:05:28 GMT Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3t54dd8h0s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 20 Sep 2023 23:05:27 +0000 Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 38KMw5I5030935 for ; Wed, 20 Sep 2023 23:05:26 GMT Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2173.outbound.protection.outlook.com [104.47.57.173]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3t52t7r8bb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 20 Sep 2023 23:05:26 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=F9Xe9hcQ42/ms72RlUaQk/IBwyuiVmrDrZ9lZAdmnrAmrxd7K4uIrJKhfUudWA7S9r48wLg0Rbz0LVnjS2pGQnKWDKg/2z4rJDBKqj7yslzL34A9f90yux9BlYRjvTYfM4j0gS205wM6fcn64Fv9miZbEj6nkj4gopAlVz6L8akMie5EFseIaL/dx13i3vrfrdLXcROHxdTciMXuJ7mvc2IcpE39yRHTe+gzX/gKZorUI8CPlTqlmGT0R2zYGsf7M5wb10su2PmsQTyByhU4Aw/iICqeKh4fbav7JcbuIzVfSyUE7Q6mUtFtFTWx80iejGwm/HySVPxI4S9ps8p+oA== 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=voeO4w5QQIxprbFVBd5KAewWZIirYvz714JrJSA7+m4=; b=grgSTjeGBqV2VxNHi9b5OdlKB1j/z2UfX/7bh1ACEOnaOyVRgXQf+b+gsyz1J52OgxcfIOzLDNw8B4Fuq2sQGzHW3tzzKBR9YezaEnvB8rXS9mlvl9GOJ7U1WRr0Y9MW+Y6sqtpEa2feDm1xGG6faMa5HqrBDKptjmK+AH25HV034GNImhtQhJTcDl/sb6Umwq1sdtp7FNJM7ppNPfkbx9Lo2NyDd8XmEGQ1LJzRuClADZ30M0OLevT7E0pRIvgLugR5i8rc4qIOhTGsYD5fiQZe9qMcPPZh569ui+Vu62duRNx9m0foWel8TsoAZ8qf8A7XIjZFao2Z42PfTKBwMA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none Received: from MWHPR1001MB2158.namprd10.prod.outlook.com (2603:10b6:301:2d::17) by CH3PR10MB6786.namprd10.prod.outlook.com (2603:10b6:610:140::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6813.20; Wed, 20 Sep 2023 23:05:00 +0000 Received: from MWHPR1001MB2158.namprd10.prod.outlook.com ([fe80::44f7:ba76:db28:606e]) by MWHPR1001MB2158.namprd10.prod.outlook.com ([fe80::44f7:ba76:db28:606e%3]) with mapi id 15.20.6813.017; Wed, 20 Sep 2023 23:05:00 +0000 To: binutils@sourceware.org Cc: Indu Bhagat Subject: [PATCH,RFC 9/9] gas: testsuite: add a x86_64 testsuite for SCFI Date: Wed, 20 Sep 2023 16:04:01 -0700 Message-ID: <20230920230401.1739139-10-indu.bhagat@oracle.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230920230401.1739139-1-indu.bhagat@oracle.com> References: <20230920230401.1739139-1-indu.bhagat@oracle.com> X-ClientProxiedBy: MW4PR03CA0360.namprd03.prod.outlook.com (2603:10b6:303:dc::35) To MWHPR1001MB2158.namprd10.prod.outlook.com (2603:10b6:301:2d::17) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWHPR1001MB2158:EE_|CH3PR10MB6786:EE_ X-MS-Office365-Filtering-Correlation-Id: 87cd8f90-90ea-4ce1-4633-08dbba2e03fb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: lSqz6koC8Zgrg/a9opFnVwU3alSoS+MAyZ4fcyMKYvMFwrP5ajJIJWEBAKIOz4+LimA8nyoEN5Yd97BeLzjfT2bi9pTU2PGU9Mscb4NyoqQgv0dBaY8rXgJeHVhnT63V33EQrlJ0HPBDU8ThL1wprpb6RTi/FfrTawwlb23km+Zk59qWWbzDlTsIC7m/vwBCyucT4hpNrqp7rlpl6T5hI3G1Q14SfjMvpthSyhV3qmC2LHFW1vbN42cmaq+cQGS5pIktTOd1xxjPisJwfvQHrSCQ016R0fCmGqy0k43HVnIMknqCM461B/vQgXGQwhUrbDH52jxp0vKs/54xRJ1nmPkHfNM378CLryamRKeiOAS3MHGDiPXsopsf2RkUU7+RGEpkoBo61k/l1/QTZFVoWHQdGNAzARlgKpTSxNfgR+HZaT7kCI2VFpz7Mvw3qkzRqc29/Qv54MG4U8RFWaNYE1UEgUqwipc0KIuXUOq8i7qIVJ9qtwalyTewk3MMsf/WtNBweCGjFICKc7Lv0chY9LoKPslOU4/YKmW2G4sRXdvt9+XfFEDG0xtnIQk5zfRviqADOjtR2ydj1wz1YNNS8ACtxlZYIx38JN/8vx/6lOI= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MWHPR1001MB2158.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(366004)(396003)(376002)(39860400002)(346002)(136003)(1800799009)(186009)(451199024)(478600001)(6486002)(6512007)(6506007)(8676002)(8936002)(44832011)(83380400001)(66946007)(66476007)(66556008)(6916009)(316002)(5660300002)(66899024)(107886003)(2616005)(36756003)(4326008)(38100700002)(86362001)(2906002)(1076003)(41300700001)(30864003)(2004002)(559001)(579004); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: I8QEo5xnXWiQ4Jj1MAxnhIh08Za49vELilZbPOIvYubOD/lQCzTL+cipR+mSPw6gklTwgv3VrMfd0gjMg0OFUOqbBec5SRSz6b/fBS7jeJz5L2dR7mDrvmZI6A1MkzAKM97JR9WGR12EoegKSq0qd4xihYAyDjxBiAOJ/EJUCrrpYgameyXNP1cYm/n7fuILViFqROfWZrHWrNRZJ1ELrwJMDQgYSxdzb5ornT8iCj+xdONWXlD9N/UV3P5/29XXCvYO8lKWx9/iLILES9HpoPUali93+ih7oFzW67QA22JBOamyuYqQL8QSZ21ud9fR63n2QDI8lJr0tEqBwApv1N2EA+SvLkWPMHPmBgg3DsC4mmpJSCxbFUJcF4WmrbRl4ykeLh1lLBM+TTKvAGLOp8arv1Swsb3NBngSCtMgj9GulHIv9T0VOZGaNsX61pooy554DOr1K+ktd5zQq/Y6/oiAkfJ5wTkKvquKRHOLtQp12TmYLSWd6LdyVuuCu6aWT4I6mM3alPL8WpvrLe2A1PfuTiCBkW1MNPUtAiE/R/otlGx55f2YXsVPcUB9xMiU+6NxXtgyFOU0tvBNZlPB0WzfpxR7OMpbYyhsFFXzXMvGcunBUXFVlEbY5a8BEk+Lvx15xylLWqma8S0BwfoBu+RYq5OqULmeXKiaQVLbx76u0G9jlbyuxtiSo4ku8P3obhHQrpOXJizUf9qip2LVmDg5syoOsT8wjVcHg2E4ANbNcJkBp5pX72KJiDMWOHW3HhB7Irb3LcaGAc/MWvr13kLjhWVQSPIE6k1RXHzAclalh+LAbfyHg3uQj+eprANg7euUcyDGQ+rI+7/87yuJczW9Obcay6JH7Y+a/5UIjaXuPUNqKh+3x3IiOJXhznICdYK+KYPLnFwSIMAg0nMjuUmw6ObOBpIgTMSg4UJ9n2LxS4yve5T/RDrmLQ9j2vCrcunX/F5CNHhX3SYkywUoM9Octbk615JeH+KoO/ymfaKIGQzByYi24a1uWcObKdepnCe1UWVfjHay7LwNYMAevUkJlG+LZatMwDM9pqYjaLS3ldE6aPnV77SslNdXWC33EshBy4Q4M2xy5Dy/N9y8LMppBe2QEUFJpyxyz0HJYjc5E7tJj21qQTVt/tbEncF0/8AzkgiKhtHonZZVMhNAIWzG7tbFCM4uXlNFw6O+oMNxqk+rMOiM4W+vBkEO+0hKa8Xa2lsEzukkck6YkLjAVcYi1Fh184bQtjifcFvXoMEMrFkmiHD6IfrRAuSQDhk9zBqnFjkydbers7ccVuD8ZUzCXwwNAomUdHQv/9EwPfl3UbJG3qjQmEDqXvZjoKNvGyfP5eqfdb8rQ5A6Y/MnoG9fjjIX1cligbssoKET0yC9nENkPbbUKPiYMHG/d4maXsoWAEuYlxzhho/TC7ggiC3dBYQRszmv6JYsRJ5qnNhArSCXKapriqS3LfiQFmBC6CajQPrd56J1EV9wqvt1DMHETWpf4gdSCYVT1gwEV2eFxcVjBenvtuM8QPTGJuO0fdE5sy2Dd8H0LpjwRJv1icohpIfe8Ud0CPmFUCVYNedAroX9YuRzEHndmAuIn3p2MW8V0/+AsVzNRp6sonDGM47pzuHHhoPHNhwizXMca8Y= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: yb5Y102xSpMScgiNIc0Gzez+2bJc9x+iw21m0F3Ex/ZqBNqw2XMVjeiH7LKfxWBzBQZ0GnvI7/yQSkNyFYfsaLY7VWQnEAoKE+VTJKDhPTdL2gyMUJAUqabkt75gePFLTuo94tlBoPwwX5AALzen4k3tL/b6cb2wpeCEJHRCy3+jZe2S2PPGkp3/Md3dF6PcTyybJYNG6fIhtkd04LceeY0A30b1f1vdelFAGInNrV1VvGeKM8MD/oXEeitRqPhWsb9gI+YIA4YYjvj4wkNBlbz6CmnkUdcehF385jwUQHGoN8PzvGic/6g21GacoqinuEfHNX2INWhFLTP+BUhetc4h44omcXtJjnEJwU8ZrC/o2J3ctd7aWMccX9Z1xE3bPgNYtwcA1xH6IiPfY+cqNgrTSKpvD6c9YZrf7JpREOVUoPrerlY1xh0P5SYYacUl/IE7RaO3RQKjJDq0IcSWmy9m8JpaWHVEPFIYMbdNMRAu7OQdFBEeNEpDH+ch3wDi6n5tsHcRsEJ4Enr9uCdZSTb3WlSBVJfMgN/J7+acwv9a3n/S/bvE1FbslMZTYEbYhZg2gHIHMGrfpTHQPFTZPCstpwrLJzljsFk2Ve8k3ayd/E/213D59izQCbzULjbrhrjilGPWv6lwiYwK3RJzpgz2sB2dBY6anffai6lMdW35KyuhYvKe9zNZt5HP7zEO2xc1/4yA2mCQeaTqwhwjuZoHDAqPndM23ykHNVCmYzEtqzhZbyF1dLu0NRh9/7wiGWb7C+veqV/58g97vXRaEg== X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 87cd8f90-90ea-4ce1-4633-08dbba2e03fb X-MS-Exchange-CrossTenant-AuthSource: MWHPR1001MB2158.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Sep 2023 23:05:00.4536 (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: v38rF/g/k784csRfdxDdPmM/D+foi5pI9a7cJj1LVjgASdsy5vIcnjOA4b47GWW1VN0WMkls/TR7JKx3aQO2Yw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR10MB6786 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.601,FMLib:17.11.176.26 definitions=2023-09-20_11,2023-09-20_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 phishscore=0 mlxscore=0 mlxlogscore=999 bulkscore=0 malwarescore=0 suspectscore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2308100000 definitions=main-2309200193 X-Proofpoint-GUID: DV2yfhuKVSbxupwD3cpU6vBRi6GtsIgr X-Proofpoint-ORIG-GUID: DV2yfhuKVSbxupwD3cpU6vBRi6GtsIgr 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, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL, SCC_5_SHORT_WORD_LINES, 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: , X-Patchwork-Original-From: Indu Bhagat via Binutils From: Indu Bhagat Reply-To: Indu Bhagat Errors-To: binutils-bounces+patchwork=sourceware.org@sourceware.org Sender: "Binutils" The testsuite for SCFI contains target-specific tests. As all the tests are executed with --scfi command line option, the CFI annotations in the test .s files are skipped altogether by the GAS for processing. The CFI directives in the assembly files are added with the intention to aid maintainence only: CFI annotations in .s files help convey the expected EH Frame / SFrame data in a format-oblivious way. Some testcases are used to highlight those asm constructs that the SCFI machinery in GAS currently does not support: - Only AMD64 ABI is supported for now. Using --m32 with --scfi results in hard error. See scfi-unsupported-1.s. - Untraceable stack-pointer manipulation in function epilougue and prologue. See scfi-unsupported-2.s. - Using Dynamically Realigned Arguement Pointer (DRAP) register to realign the stack. For SCFI, the CFA must be only REG_SP or REG_FP based. See scfi-unsupported-drap-1.s Some testcases are used to highlight some diagnostics that the SCFI machinery in GAS currently issues, with an intent to help user correct inadvertent errors in their hand-written asm. An error is issued in a situation where GAS is not sure it will be able to synthesize valid CFI. - (#1) "Warning: SCFI: Asymetrical register restore" - (#2) "Error: SCFI: usage of REG_FP as scratch not supported" - (#3) "Error: SCFI: unsupported stack manipulation pattern" In case of (#2) and (#3), SCFI generation is skipped for the respective function. Above is a subset of the warnings/errors implemented in the code. gas/testsuite/: * gas/scfi/README: New file. * gas/scfi/x86_64/scfi-add-1.d: New test. * gas/scfi/x86_64/scfi-add-1.s: New test. * gas/scfi/x86_64/scfi-add-2.d: New test. * gas/scfi/x86_64/scfi-add-2.s: New test. * gas/scfi/x86_64/scfi-bp-sp-1.d: New test. * gas/scfi/x86_64/scfi-bp-sp-1.s: New test. * gas/scfi/x86_64/scfi-callee-saved-1.d: New test. * gas/scfi/x86_64/scfi-callee-saved-1.s: New test. * gas/scfi/x86_64/scfi-callee-saved-2.d: New test. * gas/scfi/x86_64/scfi-callee-saved-2.s: New test. * gas/scfi/x86_64/scfi-callee-saved-3.d: New test. * gas/scfi/x86_64/scfi-callee-saved-3.s: New test. * gas/scfi/x86_64/scfi-callee-saved-4.d: New test. * gas/scfi/x86_64/scfi-callee-saved-4.s: New test. * gas/scfi/x86_64/scfi-cfg-1.d: New test. * gas/scfi/x86_64/scfi-cfg-1.s: New test. * gas/scfi/x86_64/scfi-cfg-2.d: New test. * gas/scfi/x86_64/scfi-cfg-2.s: New test. * gas/scfi/x86_64/scfi-cofi-1.d: New test. * gas/scfi/x86_64/scfi-cofi-1.s: New test. * gas/scfi/x86_64/scfi-diag-1.l: New test. * gas/scfi/x86_64/scfi-diag-1.s: New test. * gas/scfi/x86_64/scfi-diag-2.l: New test. * gas/scfi/x86_64/scfi-diag-2.s: New test. * gas/scfi/x86_64/scfi-dyn-stack-1.d: New test. * gas/scfi/x86_64/scfi-dyn-stack-1.s: New test. * gas/scfi/x86_64/scfi-fp-diag-2.l: New test. * gas/scfi/x86_64/scfi-fp-diag-2.s: New test. * gas/scfi/x86_64/scfi-ignore-1.d: New test. * gas/scfi/x86_64/scfi-ignore-1.s: New test. * gas/scfi/x86_64/scfi-indirect-mov-1.d: New test. * gas/scfi/x86_64/scfi-indirect-mov-1.s: New test. * gas/scfi/x86_64/scfi-indirect-mov-2.d: New test. * gas/scfi/x86_64/scfi-indirect-mov-2.s: New test. * gas/scfi/x86_64/scfi-indirect-mov-3.d: New test. * gas/scfi/x86_64/scfi-indirect-mov-3.s: New test. * gas/scfi/x86_64/scfi-lea-1.d: New test. * gas/scfi/x86_64/scfi-lea-1.s: New test. * gas/scfi/x86_64/scfi-leave-1.d: New test. * gas/scfi/x86_64/scfi-leave-1.s: New test. * gas/scfi/x86_64/scfi-pushq-1.d: New test. * gas/scfi/x86_64/scfi-pushq-1.s: New test. * gas/scfi/x86_64/scfi-selfalign-func-1.d: New test. * gas/scfi/x86_64/scfi-selfalign-func-1.s: New test. * gas/scfi/x86_64/scfi-simple-1.d: New test. * gas/scfi/x86_64/scfi-simple-1.s: New test. * gas/scfi/x86_64/scfi-simple-2.d: New test. * gas/scfi/x86_64/scfi-simple-2.s: New test. * gas/scfi/x86_64/scfi-sub-1.d: New test. * gas/scfi/x86_64/scfi-sub-1.s: New test. * gas/scfi/x86_64/scfi-sub-2.d: New test. * gas/scfi/x86_64/scfi-sub-2.s: New test. * gas/scfi/x86_64/scfi-unsupported-1.l: New test. * gas/scfi/x86_64/scfi-unsupported-1.s: New test. * gas/scfi/x86_64/scfi-unsupported-2.l: New test. * gas/scfi/x86_64/scfi-unsupported-2.s: New test. * gas/scfi/x86_64/scfi-unsupported-cfg-1.l: New test. * gas/scfi/x86_64/scfi-unsupported-cfg-1.s: New test. * gas/scfi/x86_64/scfi-unsupported-drap-1.l: New test. * gas/scfi/x86_64/scfi-unsupported-drap-1.s: New test. * gas/scfi/x86_64/scfi-x86-64.exp: New test. --- gas/testsuite/gas/scfi/README | 11 +++ gas/testsuite/gas/scfi/x86_64/scfi-add-1.d | 25 +++++++ gas/testsuite/gas/scfi/x86_64/scfi-add-1.s | 13 ++++ gas/testsuite/gas/scfi/x86_64/scfi-add-2.d | 36 +++++++++ gas/testsuite/gas/scfi/x86_64/scfi-add-2.s | 43 +++++++++++ gas/testsuite/gas/scfi/x86_64/scfi-bp-sp-1.d | 31 ++++++++ gas/testsuite/gas/scfi/x86_64/scfi-bp-sp-1.s | 22 ++++++ .../gas/scfi/x86_64/scfi-callee-saved-1.d | 40 ++++++++++ .../gas/scfi/x86_64/scfi-callee-saved-1.s | 26 +++++++ .../gas/scfi/x86_64/scfi-callee-saved-2.d | 41 ++++++++++ .../gas/scfi/x86_64/scfi-callee-saved-2.s | 42 +++++++++++ .../gas/scfi/x86_64/scfi-callee-saved-3.d | 42 +++++++++++ .../gas/scfi/x86_64/scfi-callee-saved-3.s | 40 ++++++++++ .../gas/scfi/x86_64/scfi-callee-saved-4.d | 40 ++++++++++ .../gas/scfi/x86_64/scfi-callee-saved-4.s | 55 ++++++++++++++ gas/testsuite/gas/scfi/x86_64/scfi-cfg-1.d | 36 +++++++++ gas/testsuite/gas/scfi/x86_64/scfi-cfg-1.s | 47 ++++++++++++ gas/testsuite/gas/scfi/x86_64/scfi-cfg-2.d | 28 +++++++ gas/testsuite/gas/scfi/x86_64/scfi-cfg-2.s | 21 ++++++ gas/testsuite/gas/scfi/x86_64/scfi-cofi-1.d | 5 ++ gas/testsuite/gas/scfi/x86_64/scfi-cofi-1.s | 20 +++++ gas/testsuite/gas/scfi/x86_64/scfi-diag-1.l | 3 + gas/testsuite/gas/scfi/x86_64/scfi-diag-1.s | 23 ++++++ gas/testsuite/gas/scfi/x86_64/scfi-diag-2.l | 3 + gas/testsuite/gas/scfi/x86_64/scfi-diag-2.s | 28 +++++++ .../gas/scfi/x86_64/scfi-dyn-stack-1.d | 23 ++++++ .../gas/scfi/x86_64/scfi-dyn-stack-1.s | 50 +++++++++++++ .../gas/scfi/x86_64/scfi-fp-diag-2.l | 2 + .../gas/scfi/x86_64/scfi-fp-diag-2.s | 55 ++++++++++++++ gas/testsuite/gas/scfi/x86_64/scfi-ignore-1.d | 26 +++++++ gas/testsuite/gas/scfi/x86_64/scfi-ignore-1.s | 13 ++++ .../gas/scfi/x86_64/scfi-indirect-mov-1.d | 51 +++++++++++++ .../gas/scfi/x86_64/scfi-indirect-mov-1.s | 48 ++++++++++++ .../gas/scfi/x86_64/scfi-indirect-mov-2.d | 41 ++++++++++ .../gas/scfi/x86_64/scfi-indirect-mov-2.s | 38 ++++++++++ .../gas/scfi/x86_64/scfi-indirect-mov-3.d | 41 ++++++++++ .../gas/scfi/x86_64/scfi-indirect-mov-3.s | 38 ++++++++++ gas/testsuite/gas/scfi/x86_64/scfi-lea-1.d | 37 +++++++++ gas/testsuite/gas/scfi/x86_64/scfi-lea-1.s | 40 ++++++++++ gas/testsuite/gas/scfi/x86_64/scfi-leave-1.d | 36 +++++++++ gas/testsuite/gas/scfi/x86_64/scfi-leave-1.s | 26 +++++++ gas/testsuite/gas/scfi/x86_64/scfi-pushq-1.d | 35 +++++++++ gas/testsuite/gas/scfi/x86_64/scfi-pushq-1.s | 24 ++++++ .../gas/scfi/x86_64/scfi-selfalign-func-1.d | 31 ++++++++ .../gas/scfi/x86_64/scfi-selfalign-func-1.s | 36 +++++++++ gas/testsuite/gas/scfi/x86_64/scfi-simple-1.d | 26 +++++++ gas/testsuite/gas/scfi/x86_64/scfi-simple-1.s | 9 +++ gas/testsuite/gas/scfi/x86_64/scfi-simple-2.d | 30 ++++++++ gas/testsuite/gas/scfi/x86_64/scfi-simple-2.s | 16 ++++ gas/testsuite/gas/scfi/x86_64/scfi-sub-1.d | 25 +++++++ gas/testsuite/gas/scfi/x86_64/scfi-sub-1.s | 12 +++ gas/testsuite/gas/scfi/x86_64/scfi-sub-2.d | 31 ++++++++ gas/testsuite/gas/scfi/x86_64/scfi-sub-2.s | 23 ++++++ .../gas/scfi/x86_64/scfi-unsupported-1.l | 2 + .../gas/scfi/x86_64/scfi-unsupported-1.s | 10 +++ .../gas/scfi/x86_64/scfi-unsupported-2.l | 3 + .../gas/scfi/x86_64/scfi-unsupported-2.s | 14 ++++ .../gas/scfi/x86_64/scfi-unsupported-cfg-1.l | 2 + .../gas/scfi/x86_64/scfi-unsupported-cfg-1.s | 53 +++++++++++++ .../gas/scfi/x86_64/scfi-unsupported-drap-1.l | 3 + .../gas/scfi/x86_64/scfi-unsupported-drap-1.s | 75 +++++++++++++++++++ gas/testsuite/gas/scfi/x86_64/scfi-x86-64.exp | 59 +++++++++++++++ 62 files changed, 1805 insertions(+) create mode 100644 gas/testsuite/gas/scfi/README create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-add-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-add-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-add-2.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-add-2.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-bp-sp-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-bp-sp-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-2.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-2.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-3.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-3.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-4.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-4.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-cfg-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-cfg-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-cfg-2.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-cfg-2.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-cofi-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-cofi-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-diag-1.l create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-diag-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-diag-2.l create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-diag-2.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-fp-diag-2.l create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-fp-diag-2.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-ignore-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-ignore-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-2.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-2.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-3.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-3.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-lea-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-lea-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-leave-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-leave-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-pushq-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-pushq-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-selfalign-func-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-selfalign-func-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-simple-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-simple-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-simple-2.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-simple-2.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-sub-1.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-sub-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-sub-2.d create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-sub-2.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-unsupported-1.l create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-unsupported-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-unsupported-2.l create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-unsupported-2.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-unsupported-drap-1.l create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-unsupported-drap-1.s create mode 100644 gas/testsuite/gas/scfi/x86_64/scfi-x86-64.exp diff --git a/gas/testsuite/gas/scfi/README b/gas/testsuite/gas/scfi/README new file mode 100644 index 00000000000..c0b0e0d36c6 --- /dev/null +++ b/gas/testsuite/gas/scfi/README @@ -0,0 +1,11 @@ +Notes on how the SCFI testsuite is organized: + +The SCFI testsuite has target dependent components because most meaningul tests +will need an input which is assembly code. + +At this time, support for x86_64 is added. + +When adding more tests, please keep CFI annotations updated in the .s files, +even though the testcases are run with --scfi command line option (this means +that the CFI annotations are not processed by GAS). Adding CFI directives +makes the testcases clearer in terms of the expected unwind data. diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-add-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-add-1.d new file mode 100644 index 00000000000..4887ff4cc68 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-add-1.d @@ -0,0 +1,25 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for add insn +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0014 0+001c FDE cie=0+0000 pc=0+0000..0+0005 + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 0 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-add-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-add-1.s new file mode 100644 index 00000000000..99002c5e34e --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-add-1.s @@ -0,0 +1,13 @@ +# Testcase for add instruction. + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + addq $8, %rsp + .cfi_def_cfa_offset 0 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-add-2.d b/gas/testsuite/gas/scfi/x86_64/scfi-add-2.d new file mode 100644 index 00000000000..2393dd16764 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-add-2.d @@ -0,0 +1,36 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for add insn +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0024 0+001c FDE cie=0+0000 pc=0+0000..0+001d + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 3 to 0+0004 + DW_CFA_def_cfa_register: r6 \(rbp\) + DW_CFA_advance_loc: 2 to 0+0006 + DW_CFA_offset: r12 \(r12\) at cfa-24 + DW_CFA_advance_loc: 21 to 0+001b + DW_CFA_restore: r12 \(r12\) + DW_CFA_advance_loc: 1 to 0+001c + DW_CFA_def_cfa_register: r7 \(rsp\) + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-add-2.s b/gas/testsuite/gas/scfi/x86_64/scfi-add-2.s new file mode 100644 index 00000000000..cee6ce84d83 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-add-2.s @@ -0,0 +1,43 @@ + .section .rodata + .type simd_cmp_op, @object + .size simd_cmp_op, 8 +simd_cmp_op: + .long 2 + .zero 4 + +# Testcase for add instruction. +# add reg, reg instruction + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + pushq %r12 + .cfi_offset 12, -24 + mov %rsp, %r12 +# Stack manipulation is permitted if the base register for +# tracking CFA has been changed to FP. + addq %rdx, %rsp + addq %rsp, %rax +# Other kind of add instructions should not error out in the +# x86_64 -> ginsn translator + addq $simd_cmp_op+8, %rdx + mov %r12, %rsp +# Popping a callee-saved register. +# RSP must be traceable. + pop %r12 + .cfi_restore 12 + leave + .cfi_def_cfa_register 7 + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-bp-sp-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-bp-sp-1.d new file mode 100644 index 00000000000..b052948ab02 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-bp-sp-1.d @@ -0,0 +1,31 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for SP/FP based CFA switching +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+001c 0+001c FDE cie=0+0000 pc=0+0000..0+000c + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 3 to 0+0004 + DW_CFA_def_cfa_register: r6 \(rbp\) + DW_CFA_advance_loc: 6 to 0+000a + DW_CFA_def_cfa_register: r7 \(rsp\) + DW_CFA_advance_loc: 1 to 0+000b + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 8 + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-bp-sp-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-bp-sp-1.s new file mode 100644 index 00000000000..c9b949fdf8f --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-bp-sp-1.s @@ -0,0 +1,22 @@ +# Testcase for switching between sp/fp based CFA. + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + addq %rax, %rdi + mov %rbp, %rsp + .cfi_def_cfa_register 7 + pop %rbp + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-1.d new file mode 100644 index 00000000000..0acc5b4e542 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-1.d @@ -0,0 +1,40 @@ +#as: --scfi +#objdump: -Wf +#name: SCFI for callee-saved registers +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0002c 0+0001c FDE cie=0+0000 pc=0+0000..0+0007 + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_advance_loc: 1 to 0+0002 + DW_CFA_def_cfa_offset: 24 + DW_CFA_offset: r3 \(rbx\) at cfa-24 + DW_CFA_advance_loc: 1 to 0+0003 + DW_CFA_def_cfa_offset: 32 + DW_CFA_offset: r6 \(rbp\) at cfa-32 + DW_CFA_advance_loc: 1 to 0+0004 + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 24 + DW_CFA_advance_loc: 1 to 0+0005 + DW_CFA_restore: r3 \(rbx\) + DW_CFA_def_cfa_offset: 16 + DW_CFA_advance_loc: 1 to 0+0006 + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-1.s new file mode 100644 index 00000000000..c2430a6cd19 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-1.s @@ -0,0 +1,26 @@ + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rax + .cfi_def_cfa_offset 16 + push %rbx + .cfi_def_cfa_offset 24 + .cfi_offset 3, -24 + pushq %rbp + .cfi_def_cfa_offset 32 + .cfi_offset 6, -32 + popq %rbp + .cfi_def_cfa_offset 24 + .cfi_restore 6 + popq %rbx + .cfi_def_cfa_offset 16 + .cfi_restore 3 + popq %rax + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-2.d b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-2.d new file mode 100644 index 00000000000..860200cfada --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-2.d @@ -0,0 +1,41 @@ +#as: --scfi +#objdump: -Wf +#name: SCFI for callee-saved registers 2 +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +00000018 0+002c 0000001c FDE cie=00000000 pc=0+0000..0+0017 + DW_CFA_advance_loc: 2 to 0+0002 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r12 \(r12\) at cfa-16 + DW_CFA_advance_loc: 2 to 0+0004 + DW_CFA_def_cfa_offset: 24 + DW_CFA_offset: r13 \(r13\) at cfa-24 + DW_CFA_advance_loc: 9 to 0+000d + DW_CFA_def_cfa_offset: 32 + DW_CFA_advance_loc: 1 to 0+000e + DW_CFA_def_cfa_offset: 40 + DW_CFA_advance_loc: 4 to 0+0012 + DW_CFA_def_cfa_offset: 24 + DW_CFA_advance_loc: 2 to 0+0014 + DW_CFA_restore: r13 \(r13\) + DW_CFA_def_cfa_offset: 16 + DW_CFA_advance_loc: 2 to 0+0016 + DW_CFA_restore: r12 \(r12\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-2.s b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-2.s new file mode 100644 index 00000000000..7b10a2c1c6b --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-2.s @@ -0,0 +1,42 @@ +# Testcase for save reg ops for callee-saved registers +# These latter two pushq's of callee-saved regs must NOT generate +# .cfi_offset. + + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %r12 + .cfi_def_cfa_offset 16 + .cfi_offset 12, -16 + pushq %r13 + .cfi_def_cfa_offset 24 + .cfi_offset 13, -24 +# The function may use callee-saved registers for its use, and may even +# chose to spill them to stack if necessary. + addq %rax, %r13 + subq $8, %r13 +# These two pushq's of callee-saved regs must NOT generate +# .cfi_offset. + pushq %r13 + .cfi_def_cfa_offset 32 + pushq %rax + .cfi_def_cfa_offset 40 +# Adjust the REG_SP to get rid of local stack usage. + addq $16, %rsp + .cfi_def_cfa_offset 24 +# The SCFI machinery keeps track of where the callee-saved registers +# are on the stack. It generates a restore operation if the stack +# offsets match. + popq %r13 + .cfi_restore 13 + .cfi_def_cfa_offset 16 + popq %r12 + .cfi_restore 12 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-3.d b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-3.d new file mode 100644 index 00000000000..7f2c9819ffc --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-3.d @@ -0,0 +1,42 @@ +#as: -W --scfi +#objdump: -Wf +#name: SCFI for callee-saved registers 3 +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +00000018 0+002c 0000001c FDE cie=00000000 pc=0+0000..0+0016 + DW_CFA_advance_loc: 2 to 0+0002 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r12 \(r12\) at cfa-16 + DW_CFA_advance_loc: 2 to 0+0004 + DW_CFA_def_cfa_offset: 24 + DW_CFA_offset: r13 \(r13\) at cfa-24 + DW_CFA_advance_loc: 9 to 0+000d + DW_CFA_def_cfa_offset: 32 + DW_CFA_advance_loc: 1 to 0+000e + DW_CFA_def_cfa_offset: 40 + DW_CFA_advance_loc: 1 to 0+000f + DW_CFA_def_cfa_offset: 32 + DW_CFA_advance_loc: 2 to 0+0011 + DW_CFA_def_cfa_offset: 24 + DW_CFA_advance_loc: 2 to 0+0013 + DW_CFA_restore: r13 \(r13\) + DW_CFA_def_cfa_offset: 16 + DW_CFA_advance_loc: 2 to 0+0015 + DW_CFA_restore: r12 \(r12\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-3.s b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-3.s new file mode 100644 index 00000000000..a2bb53017f1 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-3.s @@ -0,0 +1,40 @@ +# Testcase for save reg ops for callee-saved registers + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %r12 + .cfi_def_cfa_offset 16 + .cfi_offset 12, -16 + pushq %r13 + .cfi_def_cfa_offset 24 + .cfi_offset 13, -24 +# The program may use callee-saved registers for its use, and may even +# chose to spill them to stack if necessary. + addq %rax, %r13 + subq $8, %r13 +# These two pushq's of callee-saved regs must NOT generate +# .cfi_offset. + pushq %r13 + .cfi_def_cfa_offset 32 + pushq %rax + .cfi_def_cfa_offset 40 + popq %rax + .cfi_def_cfa_offset 32 + popq %r13 + .cfi_def_cfa_offset 24 +# The SCFI machinery keeps track of where the callee-saved registers +# are on the stack. It generates a restore operation if the stack +# offsets match. + popq %r13 + .cfi_restore 13 + .cfi_def_cfa_offset 16 + popq %r12 + .cfi_restore 12 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-4.d b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-4.d new file mode 100644 index 00000000000..d6543fa8f6c --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-4.d @@ -0,0 +1,40 @@ +#as: -W --scfi +#objdump: -Wf +#name: SCFI for callee-saved registers 4 +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +00000018 0+002c 0000001c FDE cie=00000000 pc=0+0000..0+005e + DW_CFA_advance_loc: 5 to 0+0005 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 3 to 0+0008 + DW_CFA_def_cfa_register: r6 \(rbp\) + DW_CFA_advance_loc: 2 to 0+000a + DW_CFA_offset: r12 \(r12\) at cfa-24 + DW_CFA_advance_loc: 1 to 0+000b + DW_CFA_offset: r3 \(rbx\) at cfa-32 + DW_CFA_advance_loc1: 79 to 0+005a + DW_CFA_restore: r3 \(rbx\) + DW_CFA_advance_loc: 2 to 0+005c + DW_CFA_restore: r12 \(r12\) + DW_CFA_advance_loc: 1 to 0+005d + DW_CFA_def_cfa_register: r7 \(rsp\) + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-4.s b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-4.s new file mode 100644 index 00000000000..be29a3ccfa8 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-callee-saved-4.s @@ -0,0 +1,55 @@ + .type byte_insert_op1, @function +byte_insert_op1: +.LFB10: + .cfi_startproc + endbr64 + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + pushq %r12 + .cfi_offset 12, -24 + pushq %rbx + .cfi_offset 3, -32 + subq $24, %rsp + movl %edi, -20(%rbp) + movq %rsi, -32(%rbp) + movl %edx, -24(%rbp) + movq %rcx, -40(%rbp) +# The program may use callee-saved registers for its use, and may even +# chose to read them from stack if necessary. The following use should +# not be treated as reg restore for SCFI purposes (because rbx has been +# saved to -16(%rbp). + movq -40(%rbp), %rbx + movq -40(%rbp), %rax + leaq 3(%rax), %r12 + jmp .L563 +.L564: + subq $1, %rbx + subq $1, %r12 + movzbl (%rbx), %eax + movb %al, (%r12) +.L563: + cmpq -32(%rbp), %rbx + jne .L564 + movl -24(%rbp), %edx + movq -32(%rbp), %rcx + movl -20(%rbp), %eax + movq %rcx, %rsi + movl %eax, %edi + call byte_store_op1 + nop + addq $24, %rsp + popq %rbx + .cfi_restore 3 + popq %r12 + .cfi_restore 12 + popq %rbp + .cfi_def_cfa_register 7 + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE10: + .size byte_insert_op1, .-byte_insert_op1 diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-cfg-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-cfg-1.d new file mode 100644 index 00000000000..48d8aac43f3 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-cfg-1.d @@ -0,0 +1,36 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI in presence of control flow 1 +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0024 0000001c FDE cie=00000000 pc=0+0000..0+003a + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r3 \(rbx\) at cfa-16 + DW_CFA_advance_loc: 37 to 0+0026 + DW_CFA_remember_state + DW_CFA_advance_loc: 1 to 0+0027 + DW_CFA_restore: r3 \(rbx\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_advance_loc: 1 to 0+0028 + DW_CFA_restore_state + DW_CFA_advance_loc: 9 to 0+0031 + DW_CFA_restore: r3 \(rbx\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-cfg-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-cfg-1.s new file mode 100644 index 00000000000..9e72ed0ed2b --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-cfg-1.s @@ -0,0 +1,47 @@ +# Testcase with one dominator bb and two exit bbs +# Something like for: return ferror (f) || fclose (f) != 0; + .text + .section .rodata.str1.1,"aMS",@progbits,1 +.LC0: + .string "w" +.LC1: + .string "conftest.out" + .section .text.startup,"ax",@progbits + .p2align 4 + .globl main + .type main, @function +main: +.LFB11: + .cfi_startproc + pushq %rbx + .cfi_def_cfa_offset 16 + .cfi_offset 3, -16 + movl $.LC0, %esi + movl $.LC1, %edi + call fopen + movq %rax, %rdi + movq %rax, %rbx + call ferror + movl %eax, %edx + movl $1, %eax + testl %edx, %edx + je .L7 + .cfi_remember_state + popq %rbx + .cfi_restore 3 + .cfi_def_cfa_offset 8 + ret +.L7: + .cfi_restore_state + movq %rbx, %rdi + call fclose + popq %rbx + .cfi_restore 3 + .cfi_def_cfa_offset 8 + testl %eax, %eax + setne %al + movzbl %al, %eax + ret + .cfi_endproc +.LFE11: + .size main, .-main diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-cfg-2.d b/gas/testsuite/gas/scfi/x86_64/scfi-cfg-2.d new file mode 100644 index 00000000000..c37d6b7945c --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-cfg-2.d @@ -0,0 +1,28 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI in presence of control flow 2 +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0001c 0+001c FDE cie=00000000 pc=0000000000000000..0000000000000016 + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 3 to 0+0004 + DW_CFA_def_cfa_register: r6 \(rbp\) + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-cfg-2.s b/gas/testsuite/gas/scfi/x86_64/scfi-cfg-2.s new file mode 100644 index 00000000000..adf1df08bc4 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-cfg-2.s @@ -0,0 +1,21 @@ +# Testcase for CFG creation of ginsns +# This testcase has no return instruction at the end. + .text + .globl main + .type main, @function +main: +.LFB7: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + call foo + shrl $31, %eax + movzbl %al, %eax + movl %eax, %edi + call exit + .cfi_endproc +.LFE7: + .size main, .-main diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-cofi-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-cofi-1.d new file mode 100644 index 00000000000..af4fa429339 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-cofi-1.d @@ -0,0 +1,5 @@ +#as: --scfi -W +#objdump: -Wf +#name: Synthesize CFI for add insn + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-cofi-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-cofi-1.s new file mode 100644 index 00000000000..88ed973ef71 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-cofi-1.s @@ -0,0 +1,20 @@ +# Testcase with a variety of "change of flow instructions" +# +# Must be run with -W so it remains warning free. +# +# This test does not have much going on wrt synthesis of CFI; +# it just aims to ensure x8_64 -> ginsn decoding must behave +# gracefully for these "change of flow instructions" + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + addq %rdx, %rax + notrack jmp *%rax + call *%r8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-diag-1.l b/gas/testsuite/gas/scfi/x86_64/scfi-diag-1.l new file mode 100644 index 00000000000..0436a25cdcf --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-diag-1.l @@ -0,0 +1,3 @@ +.*Assembler messages: +.*14: Error: SCFI: usage of REG_FP as scratch not supported +.*22: Warning: SCFI: forward pass failed for func 'foo' diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-diag-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-diag-1.s new file mode 100644 index 00000000000..c09ec0da1c4 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-diag-1.s @@ -0,0 +1,23 @@ +# Testcase for REG_FP based CFA +# and using REG_FP as scratch. + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 +# The following add causes REG_FP to become untraceable + addq %rax, %rbp + .cfi_def_cfa_register 7 + pop %rbp + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-diag-2.l b/gas/testsuite/gas/scfi/x86_64/scfi-diag-2.l new file mode 100644 index 00000000000..a2cd4d38a71 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-diag-2.l @@ -0,0 +1,3 @@ +.*Assembler messages: +.*21: Warning: SCFI: asymetrical register restore +.*22: Warning: SCFI: asymetrical register restore diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-diag-2.s b/gas/testsuite/gas/scfi/x86_64/scfi-diag-2.s new file mode 100644 index 00000000000..f58915d0a72 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-diag-2.s @@ -0,0 +1,28 @@ +# Testcase for a diagnostic around assymetrical restore +.type foo, @function +foo: +.LFB10: + .cfi_startproc + endbr64 + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + pushq %r12 + pushq %rbx + subq $24, %rsp + .cfi_offset 12, -24 + .cfi_offset 3, -32 + addq $24, %rsp +# Note that the order of r12 and rbx restore does not match +# order of the corresponding save(s). +# The SCFI machinery warns the user. + popq %r12 + popq %rbx + popq %rbp + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE10: + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.d new file mode 100644 index 00000000000..b1ea9f20fd8 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.d @@ -0,0 +1,23 @@ +#as: --scfi --gsframe +#objdump: --sframe +#name: SCFI for dynamic alloc stack +#... + +Contents of the SFrame section .sframe: + Header : + + Version: SFRAME_VERSION_2 + Flags: NONE + Num FDEs: 1 + Num FREs: 4 + + Function Index : + + func idx \[0\]: pc = 0x0, size = 87 bytes + STARTPC + CFA + FP + RA + 0+0000 + sp\+8 + u + u + 0+0001 + sp\+16 + c-16 + u + 0+0004 + fp\+16 + c-16 + u + 0+0056 + sp\+8 + u + u + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.s new file mode 100644 index 00000000000..12f1cd78994 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-dyn-stack-1.s @@ -0,0 +1,50 @@ + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + pushq %r13 + pushq %r12 + pushq %rbx + subq $8, %rsp + .cfi_offset 13, -24 + .cfi_offset 12, -32 + .cfi_offset 3, -40 + call read_user + testl %eax, %eax + jle .L2 + cltq + xorl %ebx, %ebx + leaq 0(,%rax,4), %r13 + .p2align 4,,10 + .p2align 3 +.L3: + leaq 15(%rbx), %rax + movq %rsp, %r12 + addq $4, %rbx + andq $-16, %rax + subq %rax, %rsp + movq %rsp, %rdi + call foo + movq %r12, %rsp + cmpq %r13, %rbx + jne .L3 +.L2: + leaq -24(%rbp), %rsp + xorl %eax, %eax + popq %rbx + popq %r12 + popq %r13 + popq %rbp + .cfi_restore 6 + .cfi_def_cfa_register 7 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-fp-diag-2.l b/gas/testsuite/gas/scfi/x86_64/scfi-fp-diag-2.l new file mode 100644 index 00000000000..6147b95adbc --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-fp-diag-2.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*28: Warning: SCFI: asymetrical register restore diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-fp-diag-2.s b/gas/testsuite/gas/scfi/x86_64/scfi-fp-diag-2.s new file mode 100644 index 00000000000..fd46fe3f65c --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-fp-diag-2.s @@ -0,0 +1,55 @@ +# Testcase for a diagnostic around assymetrical restore +# Testcase inspired by byte_insert_op1 in libiberty +# False positive for the diagnostic +.type foo, @function +foo: +.LFB10: + .cfi_startproc + endbr64 + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + pushq %r12 + pushq %rbx + subq $24, %rsp + .cfi_offset 12, -24 + .cfi_offset 3, -32 + movl %edi, -20(%rbp) + movq %rsi, -32(%rbp) + movl %edx, -24(%rbp) + movq %rcx, -40(%rbp) +# The assembler cannot differentiate that the following +# mov to %rbx is not a true restore operation, but simply +# %rbx register usage as a scratch reg of some sort. +# The assembler merely warns of a possible assymetric restore operation +# In this case, its noise for the user unfortunately. + movq -40(%rbp), %rbx + movq -40(%rbp), %rax + leaq 3(%rax), %r12 + jmp .L563 +.L564: + subq $1, %rbx + subq $1, %r12 + movzbl (%rbx), %eax + movb %al, (%r12) +.L563: + cmpq -32(%rbp), %rbx + jne .L564 + movl -24(%rbp), %edx + movq -32(%rbp), %rcx + movl -20(%rbp), %eax + movq %rcx, %rsi + movl %eax, %edi + call byte_store_op1 + nop + addq $24, %rsp + popq %rbx + popq %r12 + popq %rbp + .cfi_def_cfa 7, 8 + ret + .cfi_endproc +.LFE10: + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-ignore-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-ignore-1.d new file mode 100644 index 00000000000..874bcd81ec0 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-ignore-1.d @@ -0,0 +1,26 @@ +#as: --scfi +#objdump: -Wf +#name: Ignore user specified CFI directives +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0014 0+001c FDE cie=0+0000 pc=0+0000..0+0002 + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_nop + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-ignore-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-ignore-1.s new file mode 100644 index 00000000000..68b731c58ba --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-ignore-1.s @@ -0,0 +1,13 @@ + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-1.d new file mode 100644 index 00000000000..3fda9138692 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-1.d @@ -0,0 +1,51 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for indirect mem op to stack +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0034 0+001c FDE cie=00000000 pc=0+0000..0+005b + DW_CFA_advance_loc: 4 to 0+0004 + DW_CFA_def_cfa_offset: 64 + DW_CFA_advance_loc: 4 to 0+0008 + DW_CFA_offset: r3 \(rbx\) at cfa-64 + DW_CFA_advance_loc: 5 to 0+000d + DW_CFA_offset: r6 \(rbp\) at cfa-56 + DW_CFA_advance_loc: 5 to 0+0012 + DW_CFA_offset: r12 \(r12\) at cfa-48 + DW_CFA_advance_loc: 5 to 0+0017 + DW_CFA_offset: r13 \(r13\) at cfa-40 + DW_CFA_advance_loc: 5 to 0+001c + DW_CFA_offset: r14 \(r14\) at cfa-32 + DW_CFA_advance_loc: 5 to 0+0021 + DW_CFA_offset: r15 \(r15\) at cfa-24 + DW_CFA_advance_loc: 29 to 0+003e + DW_CFA_restore: r15 \(r15\) + DW_CFA_advance_loc: 5 to 0+0043 + DW_CFA_restore: r14 \(r14\) + DW_CFA_advance_loc: 5 to 0+0048 + DW_CFA_restore: r13 \(r13\) + DW_CFA_advance_loc: 5 to 0+004d + DW_CFA_restore: r12 \(r12\) + DW_CFA_advance_loc: 5 to 0+0052 + DW_CFA_restore: r6 \(rbp\) + DW_CFA_advance_loc: 4 to 0+0056 + DW_CFA_restore: r3 \(rbx\) + DW_CFA_advance_loc: 4 to 0+005a + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-1.s new file mode 100644 index 00000000000..e3b5ab30ff1 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-1.s @@ -0,0 +1,48 @@ +# An example of static stack allocation by hand + .type foo, @function +foo: + .cfi_startproc + /* Allocate space for 7 registers. */ + subq $56,%rsp + .cfi_adjust_cfa_offset 56 + movq %rbx,(%rsp) + .cfi_rel_offset 3, 0 + movq %rbp,8(%rsp) + .cfi_rel_offset 6, 8 + movq %r12,16(%rsp) + .cfi_rel_offset 12, 16 + movq %r13,24(%rsp) + .cfi_rel_offset 13, 24 + movq %r14,32(%rsp) + .cfi_rel_offset 14, 32 + movq %r15,40(%rsp) + .cfi_rel_offset 15, 40 + movq %r9,48(%rsp) + + /* Setup parameter for __foo_internal. */ + /* selfpc is the return address on the stack. */ + movq 56(%rsp),%rsi + /* Get frompc via the frame pointer. */ + movq 8(%rbp),%rdi + call __foo_internal + /* Pop the saved registers. Please note that `foo' has no + return value. */ + movq 48(%rsp),%r9 + + movq 40(%rsp),%r15 + .cfi_restore 15 + movq 32(%rsp),%r14 + .cfi_restore 14 + movq 24(%rsp),%r13 + .cfi_restore 13 + movq 16(%rsp),%r12 + .cfi_restore 12 + movq 8(%rsp),%rbp + .cfi_restore 6 + movq (%rsp),%rbx + .cfi_restore 3 + addq $56,%rsp + .cfi_adjust_cfa_offset -56 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-2.d b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-2.d new file mode 100644 index 00000000000..23e09b4b012 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-2.d @@ -0,0 +1,41 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for indirect mem op to stack +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+002c 0+001c FDE cie=00000000 pc=0+0000..0+0026 + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 3 to 0+0004 + DW_CFA_def_cfa_register: r6 \(rbp\) + DW_CFA_advance_loc: 8 to 0+000c + DW_CFA_offset: r3 \(rbx\) at cfa-32 + DW_CFA_advance_loc: 4 to 0+0010 + DW_CFA_offset: r12 \(r12\) at cfa-24 + DW_CFA_advance_loc: 9 to 0+0019 + DW_CFA_restore: r3 \(rbx\) + DW_CFA_advance_loc: 4 to 0+001d + DW_CFA_restore: r12 \(r12\) + DW_CFA_advance_loc: 7 to 0+0024 + DW_CFA_def_cfa_register: r7 \(rsp\) + DW_CFA_advance_loc: 1 to 0+0025 + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-2.s b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-2.s new file mode 100644 index 00000000000..bed2050241c --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-2.s @@ -0,0 +1,38 @@ +# Testcase for movq instructions + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + + subq $16,%rsp + +# store rbx at %rsp; rsp = rbp - 16; + movq %rbx, -16(%rbp) + .cfi_rel_offset 3, -16 +# store r12 at %rsp + 8; rsp = rbp -16; + movq %r12, -8(%rbp) + .cfi_rel_offset 12, -8 + + call bar + + movq -16(%rbp), %rbx + .cfi_restore 3 + movq -8(%rbp), %r12 + .cfi_restore 12 + + addq $16,%rsp + + mov %rbp, %rsp + .cfi_def_cfa_register 7 + pop %rbp + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-3.d b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-3.d new file mode 100644 index 00000000000..108e5478601 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-3.d @@ -0,0 +1,41 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for indirect mem op to stack +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+002c 0+001c FDE cie=00000000 pc=0+0000..0+0028 + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 3 to 0+0004 + DW_CFA_def_cfa_register: r6 \(rbp\) + DW_CFA_advance_loc: 8 to 0+000c + DW_CFA_offset: r3 \(rbx\) at cfa-32 + DW_CFA_advance_loc: 5 to 0+0011 + DW_CFA_offset: r12 \(r12\) at cfa-24 + DW_CFA_advance_loc: 9 to 0+001a + DW_CFA_restore: r3 \(rbx\) + DW_CFA_advance_loc: 5 to 0+001f + DW_CFA_restore: r12 \(r12\) + DW_CFA_advance_loc: 7 to 0+0026 + DW_CFA_def_cfa_register: r7 \(rsp\) + DW_CFA_advance_loc: 1 to 0+0027 + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-3.s b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-3.s new file mode 100644 index 00000000000..0eb90bc34e3 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-indirect-mov-3.s @@ -0,0 +1,38 @@ +# Testcase for movq instructions + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + + subq $16,%rsp + +# store rbx at %rsp; rsp = rbp - 16; rsp = CFA - 32 + movq %rbx, (%rsp) + .cfi_rel_offset 3, -16 +# store r12 at %rsp + 8; rsp = CFA - 32 + movq %r12, 8(%rsp) + .cfi_rel_offset 12, -8 + + call bar + + movq (%rsp), %rbx + .cfi_restore 3 + movq 8(%rsp), %r12 + .cfi_restore 12 + + addq $16,%rsp + + mov %rbp, %rsp + .cfi_def_cfa_register 7 + pop %rbp + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-lea-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-lea-1.d new file mode 100644 index 00000000000..3f7ec447a3c --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-lea-1.d @@ -0,0 +1,37 @@ +#as: --scfi -O2 +#objdump: -Wf +#name: Synthesize CFI for various lea instructions (-O2) +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0024 0+001c FDE cie=00000000 pc=0+0000..0+0029 + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 3 to 0+0004 + DW_CFA_def_cfa_register: r6 \(rbp\) + DW_CFA_advance_loc: 2 to 0+0006 + DW_CFA_offset: r13 \(r13\) at cfa-24 + DW_CFA_advance_loc: 33 to 0+0027 + DW_CFA_restore: r13 \(r13\) + DW_CFA_advance_loc: 1 to 0+0028 + DW_CFA_def_cfa_register: r7 \(rsp\) + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-lea-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-lea-1.s new file mode 100644 index 00000000000..8fb8fe794d6 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-lea-1.s @@ -0,0 +1,40 @@ +## Testcase with a variety of lea. +## This test is run with -O2 by default to check +## SCFI in wake of certain target optimizations. + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 +# This lea gets transformed to mov %rsp, %rbp when -O2. +# The SCFI machinery must see it as such. + lea (%rsp), %rbp + .cfi_def_cfa_register 6 + push %r13 + .cfi_offset 13, -24 + subq $8, %rsp + testl %eax, %eax + jle .L2 +.L3: + movq %rsp, %r12 + lea -0x2(%r13),%rax + lea 0x8(%r12,%rdx,4),%r8 + movq %r12, %rsp + jne .L3 +.L2: + leaq -8(%rbp), %rsp + xorl %eax, %eax + popq %r13 + .cfi_restore 13 + popq %rbp + .cfi_def_cfa_register 7 + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-leave-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-leave-1.d new file mode 100644 index 00000000000..ba98d931a02 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-leave-1.d @@ -0,0 +1,36 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for leave insn +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0024 0+001c FDE cie=0+0000 pc=0+0000..0+000a + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 3 to 0+0004 + DW_CFA_def_cfa_register: r6 \(rbp\) + DW_CFA_advance_loc: 1 to 0+0005 + DW_CFA_offset: r3 \(rbx\) at cfa-24 + DW_CFA_advance_loc: 3 to 0+0008 + DW_CFA_restore: r3 \(rbx\) + DW_CFA_advance_loc: 1 to 0+0009 + DW_CFA_def_cfa_register: r7 \(rsp\) + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-leave-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-leave-1.s new file mode 100644 index 00000000000..0466ab15708 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-leave-1.s @@ -0,0 +1,26 @@ +# Testcase for leave insn + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + push %rbx + .cfi_offset 3, -24 + push %rdi + pop %rdi + pop %rbx + .cfi_restore 3 + leave + .cfi_def_cfa_register 7 + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-pushq-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-pushq-1.d new file mode 100644 index 00000000000..dc76b2eb6c3 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-pushq-1.d @@ -0,0 +1,35 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for pushq insns +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0024 0+001c FDE cie=0+0000 pc=0+0000..0+000c + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_advance_loc: 3 to 0+0004 + DW_CFA_def_cfa_offset: 24 + DW_CFA_advance_loc: 2 to 0+0006 + DW_CFA_def_cfa_offset: 32 + DW_CFA_advance_loc: 2 to 0+0008 + DW_CFA_def_cfa_offset: 40 + DW_CFA_advance_loc: 2 to 0+0000a + DW_CFA_def_cfa_offset: 48 + DW_CFA_advance_loc: 1 to 0+0000b + DW_CFA_def_cfa_offset: 56 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-pushq-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-pushq-1.s new file mode 100644 index 00000000000..b896a295b56 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-pushq-1.s @@ -0,0 +1,24 @@ +## Testcase with a variety of pushq. +## all push insns valid in 64-bit mode must be processed for SCFI. + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rax + .cfi_def_cfa_offset 16 + pushq 16(%rax) + .cfi_def_cfa_offset 24 + pushq $36 + .cfi_def_cfa_offset 32 + pushq %fs + .cfi_def_cfa_offset 40 + pushq %gs + .cfi_def_cfa_offset 48 + pushf + .cfi_def_cfa_offset 56 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-selfalign-func-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-selfalign-func-1.d new file mode 100644 index 00000000000..f54b0fbb6bf --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-selfalign-func-1.d @@ -0,0 +1,31 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for self-aligning func +#... +Contents of the .eh_frame section: + +0+0000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+001c 0000001c FDE cie=00000000 pc=0+0000..0+002f + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 3 to 0+0004 + DW_CFA_def_cfa_register: r6 \(rbp\) + DW_CFA_advance_loc: 42 to 0+002e + DW_CFA_def_cfa_register: r7 \(rsp\) + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-selfalign-func-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-selfalign-func-1.s new file mode 100644 index 00000000000..fd2b691dc9e --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-selfalign-func-1.s @@ -0,0 +1,36 @@ +# If it is known that the caller of self_aligning_foo may have had +# the stack pointer unaligned to 16-bytes boundary, such self-aligning +# functions may be used by asm programmers. + .globl self_aligning_foo + .type self_aligning_foo, @function +self_aligning_foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 +# The following 'and' op aligns the stack pointer. +# At the same time, it causes REG_SP to become non-traceable +# for SCFI purposes. But no warning is issued as no further stack +# size tracking is needed for SCFI purposes. + andq $-16, %rsp + subq $32, %rsp + movl %edi, 12(%rsp) + movl %esi, 8(%rsp) + movl $0, %eax + call vector_using_function + movaps %xmm0, 16(%rsp) + movl 12(%rsp), %edx + movl 8(%rsp), %eax + addl %edx, %eax + leave +# GCC typically generates a '.cfi_def_cfa 7, 8' for leave +# insn. The SCFI however, will generate the following: + .cfi_def_cfa_register 7 + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size self_aligning_foo, .-self_aligning_foo diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-simple-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-simple-1.d new file mode 100644 index 00000000000..d33932ab525 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-simple-1.d @@ -0,0 +1,26 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for push to stack +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0014 0+001c FDE cie=0+0000 pc=0+0000..0+0002 + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_nop + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-simple-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-simple-1.s new file mode 100644 index 00000000000..56f8343a878 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-simple-1.s @@ -0,0 +1,9 @@ + .text + .globl foo + .type foo, @function +foo: + pushq %rbp + ret +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-simple-2.d b/gas/testsuite/gas/scfi/x86_64/scfi-simple-2.d new file mode 100644 index 00000000000..b592bb5461f --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-simple-2.d @@ -0,0 +1,30 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for push to stack +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0001c 0+0001c FDE cie=0+0000 pc=0+0000..0+0003 + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 1 to 0+0002 + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-simple-2.s b/gas/testsuite/gas/scfi/x86_64/scfi-simple-2.s new file mode 100644 index 00000000000..e778cef517b --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-simple-2.s @@ -0,0 +1,16 @@ + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + popq %rbp + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-sub-1.d b/gas/testsuite/gas/scfi/x86_64/scfi-sub-1.d new file mode 100644 index 00000000000..599c66dd907 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-sub-1.d @@ -0,0 +1,25 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for sub insn +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+0014 0+001c FDE cie=0+0000 pc=0+0000..0+0008 + DW_CFA_advance_loc: 7 to 0+0007 + DW_CFA_def_cfa_offset: 120016 + DW_CFA_nop +#... + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-sub-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-sub-1.s new file mode 100644 index 00000000000..741a0abf69f --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-sub-1.s @@ -0,0 +1,12 @@ +# Testcase for sub instruction. + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + subq $120008, %rsp + .cfi_def_cfa_offset 120016 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-sub-2.d b/gas/testsuite/gas/scfi/x86_64/scfi-sub-2.d new file mode 100644 index 00000000000..0a256108f71 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-sub-2.d @@ -0,0 +1,31 @@ +#as: --scfi +#objdump: -Wf +#name: Synthesize CFI for sub insn +#... +Contents of the .eh_frame section: + +00000000 0+0014 0+0000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: [01][abc] + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+0018 0+001c 0+001c FDE cie=0+0000 pc=0+0000..0+000c + DW_CFA_advance_loc: 1 to 0+0001 + DW_CFA_def_cfa_offset: 16 + DW_CFA_offset: r6 \(rbp\) at cfa-16 + DW_CFA_advance_loc: 3 to 0+0004 + DW_CFA_def_cfa_register: r6 \(rbp\) + DW_CFA_advance_loc: 7 to 0+000b + DW_CFA_def_cfa_register: r7 \(rsp\) + DW_CFA_restore: r6 \(rbp\) + DW_CFA_def_cfa_offset: 8 + DW_CFA_nop + +#pass diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-sub-2.s b/gas/testsuite/gas/scfi/x86_64/scfi-sub-2.s new file mode 100644 index 00000000000..2af7b1c9a92 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-sub-2.s @@ -0,0 +1,23 @@ +# Testcase for sub reg, reg instruction. + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + subq %rax, %rsp +# SCFI: Stack-pointer manipulation after switching +# to RBP based tracking is OK. + addq %rax, %rsp + leave + .cfi_def_cfa_register 7 + .cfi_restore 6 + .cfi_def_cfa_offset 8 + ret + .cfi_endproc +.LFE0: + .size foo, .-foo diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-1.l b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-1.l new file mode 100644 index 00000000000..c856c08c2ae --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-1.l @@ -0,0 +1,2 @@ +Assembler messages: +Fatal error: Synthesizing CFI is not supported for this ABI diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-1.s new file mode 100644 index 00000000000..87d2a4971a1 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-1.s @@ -0,0 +1,10 @@ +# Testcase run with --m32 (Not supported). + .text + .globl foo + .type foo, @function +foo: + pushq %rbp + ret +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-2.l b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-2.l new file mode 100644 index 00000000000..69c71fb9d7e --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-2.l @@ -0,0 +1,3 @@ +.*Assembler messages: +.*8: Error: SCFI: unsupported stack manipulation pattern +.*13: Warning: SCFI: forward pass failed for func 'foo' diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-2.s b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-2.s new file mode 100644 index 00000000000..22e9d88ea58 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-2.s @@ -0,0 +1,14 @@ + .text + .globl foo + .type foo, @function +foo: + addq %rdx, %rax +# Stack manipulation without switching to RBP +# based tracking is not supported for SCFI. + addq %rax, %rsp + push %rdi + leave + ret +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l new file mode 100644 index 00000000000..57c55a661e8 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l @@ -0,0 +1,2 @@ +.*Assembler messages: +.*52: Warning: Untraceable control flow for func 'foo' diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.s new file mode 100644 index 00000000000..7d241f880d7 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.s @@ -0,0 +1,53 @@ +# Testcase with an indirect jump +# Indirect jumps, when present, make the list of ginsn an invalid +# candidate for CFG creation. Hence, no SCFI can be generated either. +# +# The testcase is rather long to showcase a simple concept. The reason of +# such a long testcase is to discuss if it is important to deal with these +# patterns. It may be possible to deal with this, if we allow some special +# directives for helping the assembler with the indirect jump (jump table). + .text + .globl foo + .type foo, @function +foo: + pushq %rbp + movq %rsp, %rbp + movl %edi, -4(%rbp) + cmpl $5, -4(%rbp) + ja .L2 + movl -4(%rbp), %eax + movq .L4(,%rax,8), %rax + jmp *%rax +.L4: + .quad .L9 + .quad .L8 + .quad .L7 + .quad .L6 + .quad .L5 + .quad .L3 +.L9: + movl $43, %eax + jmp .L1 +.L8: + movl $42, %eax + jmp .L1 +.L7: + movl $45, %eax + jmp .L1 +.L6: + movl $47, %eax + jmp .L1 +.L5: + movl $37, %eax + jmp .L1 +.L3: + movl $63, %eax + jmp .L1 +.L2: +.L1: + popq %rbp + ret + .cfi_endproc +.LFE0: + .size foo, .-foo + diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-drap-1.l b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-drap-1.l new file mode 100644 index 00000000000..95ffed5f290 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-drap-1.l @@ -0,0 +1,3 @@ +.*Assembler messages: +.*19: Error: SCFI: unsupported stack manipulation pattern +.*75: Warning: SCFI: forward pass failed for func 'drap_foo' diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-drap-1.s b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-drap-1.s new file mode 100644 index 00000000000..c23828b8f9b --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-drap-1.s @@ -0,0 +1,75 @@ +# Testcase with Dynamically Realigned Argument Pointer (DRAP) +# register usage. +# +# There are two reasons why this cannot be supported with the current +# SCFI machinery +# 1. Not allowed: REG_CFA is r10 based for the few insns after +# 'leaq 8(%rsp), %r10'. +# 2. Untraceable stack size after 'andq $-16, %rsp' +# Both of these shortcomings may be worked out. FIXME DISCUSS Keep the rather +# long testcase until then. + .text + .globl drap_foo + .type drap_foo, @function +drap_foo: +.LFB0: + .cfi_startproc + leaq 8(%rsp), %r10 + .cfi_def_cfa 10, 0 + andq $-16, %rsp + pushq -8(%r10) + .cfi_def_cfa 7, 8 + pushq %rbp + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + pushq %r15 + pushq %r14 + pushq %r13 + pushq %r12 + pushq %r10 + .cfi_offset 15, -24 + .cfi_offset 14, -32 + .cfi_offset 13, -40 + .cfi_offset 12, -48 + pushq %rbx + .cfi_offset 3, -64 + subq $32, %rsp + movq $0, (%rdx) + cmpq $0, (%rdi) + movq $0, -56(%rbp) + je .L21 + movq %rdi, %rbx + movq %rsi, %rdi + movq %rsi, %r12 + call func2@PLT + movq (%rbx), %rdi + leaq -56(%rbp), %rdx + movslq %eax, %rsi + call func1@PLT + testl %eax, %eax + je .L21 + movq -56(%rbp), %r13 +.L21: + addq $32, %rsp + xorl %eax, %eax + popq %rbx + .cfi_restore 3 + popq %r10 + popq %r12 + .cfi_restore 12 + popq %r13 + .cfi_restore 13 + popq %r14 + .cfi_restore 14 + popq %r15 + .cfi_restore 15 + popq %rbp + .cfi_restore 6 + .cfi_def_cfa_register 7 + .cfi_def_cfa_offset 8 + leaq -8(%r10), %rsp + ret + .cfi_endproc +.LFE0: + .size drap_foo, .-drap_foo diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-x86-64.exp b/gas/testsuite/gas/scfi/x86_64/scfi-x86-64.exp new file mode 100644 index 00000000000..1d887d512e2 --- /dev/null +++ b/gas/testsuite/gas/scfi/x86_64/scfi-x86-64.exp @@ -0,0 +1,59 @@ +# Copyright (C) 2022-2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + +if { ![is_elf_format] } then { + return +} + +# common tests +if { ([istarget "x86_64-*-*"]) } then { + + global ASFLAGS + set old_ASFLAGS "$ASFLAGS" + + run_list_test "scfi-diag-1" "--scfi" + run_list_test "scfi-fp-diag-2" "--scfi" + run_list_test "scfi-diag-2" "--scfi" + + run_list_test "scfi-unsupported-1" "--32 --scfi" + run_list_test "scfi-unsupported-2" "--scfi" + run_list_test "scfi-unsupported-drap-1" "--scfi" + run_list_test "scfi-unsupported-cfg-1" "--scfi" + + run_dump_test "scfi-add-1" + run_dump_test "scfi-add-2" + run_dump_test "scfi-cfg-1" + run_dump_test "scfi-cfg-2" + run_dump_test "scfi-cofi-1" + run_dump_test "scfi-sub-1" + run_dump_test "scfi-sub-2" + run_dump_test "scfi-ignore-1" + run_dump_test "scfi-simple-1" + run_dump_test "scfi-simple-2" + run_dump_test "scfi-pushq-1" + run_dump_test "scfi-lea-1" + run_dump_test "scfi-leave-1" + run_dump_test "scfi-bp-sp-1" + run_dump_test "scfi-callee-saved-1" + run_dump_test "scfi-callee-saved-2" + run_dump_test "scfi-callee-saved-3" + run_dump_test "scfi-callee-saved-4" + run_dump_test "scfi-dyn-stack-1" + run_dump_test "scfi-indirect-mov-1" + run_dump_test "scfi-indirect-mov-2" + run_dump_test "scfi-indirect-mov-3" + run_dump_test "scfi-selfalign-func-1" +}