From patchwork Fri Nov 12 15:04:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinath Parvathaneni X-Patchwork-Id: 47533 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 67D313858022 for ; Fri, 12 Nov 2021 15:11:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 67D313858022 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1636729900; bh=Mgzu/o+V5CwDI/t3UxRAjEd3kEvT1P5DkxR8oDR2S6M=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=SBm1CEA5pmDCpvAwcBr9oj7P/Vs5/eEtGBUrXnXo4XsHyYl/B2bfr3PD6UXlSWM9k QhHl7EJpFtHLQR5yocEYEbw6QfjxZQV7HJFFtmBU8fNGV2JMnSWwZhaBzKiKyfX+L+ 3DU4JNRyK2KJiTnOJQ+QuAq2i1hZl65YQzPlI174= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-eopbgr150048.outbound.protection.outlook.com [40.107.15.48]) by sourceware.org (Postfix) with ESMTPS id D3BF4385840F for ; Fri, 12 Nov 2021 15:11:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D3BF4385840F Received: from DB9PR06CA0006.eurprd06.prod.outlook.com (2603:10a6:10:1db::11) by AS4PR08MB7501.eurprd08.prod.outlook.com (2603:10a6:20b:4e5::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.25; Fri, 12 Nov 2021 15:11:02 +0000 Received: from DB5EUR03FT030.eop-EUR03.prod.protection.outlook.com (2603:10a6:10:1db:cafe::38) by DB9PR06CA0006.outlook.office365.com (2603:10a6:10:1db::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.15 via Frontend Transport; Fri, 12 Nov 2021 15:11:02 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DB5EUR03FT030.mail.protection.outlook.com (10.152.20.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.15 via Frontend Transport; Fri, 12 Nov 2021 15:11:02 +0000 Received: ("Tessian outbound 892d2780d3aa:v109"); Fri, 12 Nov 2021 15:11:02 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 48d13c329eab874c X-CR-MTA-TID: 64aa7808 Received: from ab582d87bc21.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id CF9BEBA6-87BB-4B0E-B8BA-06354397656E.1; Fri, 12 Nov 2021 15:10:42 +0000 Received: from EUR05-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id ab582d87bc21.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 12 Nov 2021 15:10:42 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=amRnarGnhN/7NNnM2sW3HvPFl3KVIo5xpQgVBxzwXwI/DBoPOsPJCDKZydtgI/XTnH1hS15Bjvq/kORQCsmoRNei2dQweHMQjbF5RqHhY88ZwHOYeaZfgntbg+g02eClRZ+P+sM715Q9wcy+9S7i6Mz1Sk+01+Ifu6HsuTl9g4DA728djU3MXG86lIfOUDZl9Y1hUygXl1WG7xAhTle2yZHl1QpYTHSrsslurGolewJ2rCUdpDOjNdlxeeTjHdkVa11ccqkcNF2Hg40zrCy+G+5Xikl1HcHvNnMeWHeG1SV9KG29kWJQnEx42ZtLZCXKWxIFdSF7cAEU3nXX1mlHww== 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=Mgzu/o+V5CwDI/t3UxRAjEd3kEvT1P5DkxR8oDR2S6M=; b=SuR8PEaO2PUzwB/THHP84q5LdoaynSon7u3dckb8bm7O2LgqXnRyb/9P9c9GAjTZSzUq3bzZS4VY/Zvb6cCCkafz2QqhEdA4pTDW7duYNHxX6YhJIOLGqUcpZlStUzJ4g4+N9MEmjyr1uB4Yo9VX3hMFstRIVWd04WDwUpxnmaVE8GTynJPL3KmpsUg6G+m9u0AsZcKKS4ytVavxb830KDUb135fGLrFNDLC2HX26jnn+OfTbjtUcpes0tlemayEyUfrjEBoVgG/lStPqgFj81AKda4NmdYNVyOoZSNFawfEIM1ORykaRp7VYbL7Ysk2cDvcC1gktm/d7cOQSaI4FQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; Received: from VE1PR08MB4893.eurprd08.prod.outlook.com (2603:10a6:802:aa::13) by VI1PR08MB2670.eurprd08.prod.outlook.com (2603:10a6:802:25::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4669.15; Fri, 12 Nov 2021 15:10:35 +0000 Received: from VE1PR08MB4893.eurprd08.prod.outlook.com ([fe80::b5b1:c314:715e:db3f]) by VE1PR08MB4893.eurprd08.prod.outlook.com ([fe80::b5b1:c314:715e:db3f%6]) with mapi id 15.20.4669.016; Fri, 12 Nov 2021 15:10:35 +0000 Date: Fri, 12 Nov 2021 15:04:06 +0000 To: gcc-patches@gcc.gnu.org Subject: [PATCH][GCC] arm: Add support for dwarf debug directives and pseudo hard-register for PAC feature. X-ClientProxiedBy: LO2P265CA0501.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:13b::8) To VE1PR08MB4893.eurprd08.prod.outlook.com (2603:10a6:802:aa::13) Message-ID: MIME-Version: 1.0 Received: from e120703-lin.cambridge.arm.com (217.140.106.53) by LO2P265CA0501.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:13b::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.15 via Frontend Transport; Fri, 12 Nov 2021 15:10:35 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f118b2fd-8768-4404-14f5-08d9a5eea45b X-MS-TrafficTypeDiagnostic: VI1PR08MB2670:|AS4PR08MB7501: X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Oob-TLC-OOBClassifiers: OLM:9508;OLM:9508; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: +WDxdnsgMZjDJRZ/8pIouVpv0l60YPTI6cMD5BS/gcwuoSjMQ9igs74HSAp8IOWCcIBcG4RGi78vN5PQ/gadgRJxYEocJgnVla/tQhomFlLOxJg4j9J5QAty1SDzC7kFhw9J7Mzt6mZHTFLiBXFUdGNiSArb0ODXHgKqsru73EHPixyEr7pU7drgleZd/UdNoaYil5ij9G5axFQlkCtJmjXpZhnpc1lb+eXXHMsg8B1V2IP9m0UF+bbWtkun+YsRF3GHmPgoYeBzkxFVww7O8L5CDXYSurdMZ+lcjmA/wvsln3DrQ9oqSMReRHzF6oszyr+YwKNMfawllX2uTMlp2/JJRkaHqhjYz7DV5UedHniubKe3HamfLoopLg1GjLytNP8w/oiEcPUeTrFpDCwsr09e1bKPT2mjeuF7PNfYZ3AZ+Y/lS8KX1IvztjOTdHffUTSCtGChvLJTeuHySf7tRa+6VKMSmVojdXT3uQeUesJdNHu27Dm3ME+ZT75alv1D3x1Bv1QTwDnHW1cCNRbSsFmgvY3oQFbqs8yK7VjhxuJrPXj7ghj2k3bYzUhBLl1Gdnv6GBb7Nqry/GF50hwsXxjexKEEwgTDQwg9kGl3CEU5YYc04Q0D8+fh/MxXsIU3JHzk93zpfdooQH6XgoLnf461s+jCcNq3zEmUkWTUis8or2QLeVjtY+vSbfSMZiXkF84zdrAO+RUrkpj2OBiHttCp6OpLhbJYCJ3yOyJRSIGPOJX2roEeF1Qm0QW01ytXa1w1xado3zuM5sGYmLAeEKIJECrAXwp8esRuyGCMu7rojaCgUr3t1jrqTcJPPGyQ X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VE1PR08MB4893.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(66946007)(66476007)(66556008)(6486002)(956004)(316002)(6666004)(4326008)(4001150100001)(52116002)(6512007)(44832011)(52536014)(186003)(33964004)(26005)(33656002)(83380400001)(235185007)(38100700002)(966005)(2906002)(508600001)(6916009)(8676002)(8936002)(38350700002)(86362001)(9686003)(5660300002); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB2670 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5EUR03FT030.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: 0290b76d-3f35-4ca6-bb86-08d9a5ee93f9 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: b93/m7cvgI7m4rP+kJYEJ/vbHFTJmMKaQe+jAJnypeKI0YtG6Cr2OgoPh72KHaOTAgbU9zgXg32dvLdR7xYqCe96/Dha7MuKG0S6SA5u45t17eLYsEyJEztCAn2SFIzmX4c7dcKTYBsw3l23EqktUhXAeeqmxUHJNT8mTI9dz9HtnQ66GUjkTlurpQkTcTHbBcCSNg25PWZ+GDCtEma8OCCrCxI0qlGy/qvEirJAIW4ImfAQvt8GIF/XSO/kW2r9Xqepa/7NePYQR6V/ovG+JnsjJVLF6JGk0vQZD1PGAGaD2RFr6R+2LzjM9lBej/On+ib0H/cL3gX7kUF1IOf+9S/a10moQMpdgqQwr7kIQKVXjoZ4qB19hvL49ZmrgF7pY+88vBTU4H9Yg3T27YoUZD6ED6WaZbMRxvL+rBM4IgRg7RmVg4YiNKNA30tQqK2lS2v8WS7s/796Z+Jf0FhoeP7Z2rusHesWDqKA5qmrwBypqvj5t30Ex/cc+ozXEul97Qs/l/vctXym6wAZT9Fqs0pogKX7syVDvRsqZRDlUsBRhcSrZfLWbVzUBSyWCBD2mCt/eCpu7xlgVTU/iRdwp/ewWXlVU76nZy5TwIZF/c1jCYr6Oui0N3sA+J7Ffm9k2hP+STR72IJT/Y1ceEFQDMoB5egZR0GMs41dslPhEMIQgjHCdAoHVAm0PayUQehqT21wrejzbgUPuuUar35TdZbm2orjJjCm5Eheug+1k1zHHK68aVphnwLaSM5U6OwxM0zE6w+KSx7BqY3itNzFtQOCO4rIfQq4zcRaDwGXctT0BlhCvAed1N0h3paAHi/a X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFS:(4636009)(46966006)(36840700001)(9686003)(83380400001)(6916009)(5660300002)(8676002)(508600001)(47076005)(36860700001)(186003)(52536014)(6666004)(26005)(82310400003)(6512007)(356005)(966005)(2906002)(86362001)(44832011)(336012)(235185007)(33964004)(4001150100001)(81166007)(8936002)(316002)(33656002)(70206006)(4326008)(70586007)(6486002)(956004); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Nov 2021 15:11:02.7787 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f118b2fd-8768-4404-14f5-08d9a5eea45b X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-AuthSource: DB5EUR03FT030.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR08MB7501 X-Spam-Status: No, score=-14.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, KAM_LOTSOFHASH, KAM_SHORT, MSGID_FROM_MTA_HEADER, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Srinath Parvathaneni via Gcc-patches From: Srinath Parvathaneni Reply-To: Srinath Parvathaneni Cc: Tejas.Belagod@arm.com, Richard.Earnshaw@arm.com Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hello, This patch teaches the DWARF support in gcc about RA_AUTH_CODE pseudo hard-register and also .save {ra_auth_code} and .cfi_offset ra_auth_code dwarf directives for the PAC feature in Armv8.1-M architecture. RA_AUTH_CODE register number is 107 and it's dwarf register number is 143. When compiled with "arm-none-eabi-gcc -O2 -mthumb -march=armv8.1-m.main+pacbti -S -fasynchronous-unwind-tables -g" command line options, the directives supported in this patch looks like below: ... push {ip} .save {ra_auth_code} .cfi_def_cfa_offset 8 .cfi_offset 143, -8 ... This patch can be committed after the patch at https://gcc.gnu.org/pipermail/gcc-patches/2021-November/583407.html is committed. Regression tested on arm-none-eabi target and found no regressions. Ok for master? Regards, Srinath. gcc/ChangeLog: 2021-11-12 Srinath Parvathaneni * config/arm/aout.h (ra_auth_code): Add to enum. * config/arm/arm.c (emit_multi_reg_push): Add RA_AUTH_CODE register to dwarf frame expression instead of IP_REGNUM. (arm_expand_prologue): Mark as frame related insn. (arm_regno_class): Check for pac pseudo reigster. (arm_dbx_register_number): Assign ra_auth_code register number in dwarf. (arm_unwind_emit_sequence): Print .save directive with ra_auth_code register. (arm_conditional_register_usage): Mark ra_auth_code in fixed reigsters. * config/arm/arm.h (FIRST_PSEUDO_REGISTER): Modify. (IS_PAC_Pseudo_REGNUM): Define. (enum reg_class): Add PAC_REG entry. * config/arm/arm.md (RA_AUTH_CODE): Define. gcc/testsuite/ChangeLog: 2021-11-12 Srinath Parvathaneni * gcc.target/arm/pac-6.c: New test. ############### Attachment also inlined for ease of reply ############### diff --git a/gcc/config/arm/aout.h b/gcc/config/arm/aout.h index 25a2812a663742893b928398b0d3948e97f1905b..c69e299e012f46c8d0711830125dbf2f6b2e93d7 100644 --- a/gcc/config/arm/aout.h +++ b/gcc/config/arm/aout.h @@ -74,7 +74,8 @@ "wr8", "wr9", "wr10", "wr11", \ "wr12", "wr13", "wr14", "wr15", \ "wcgr0", "wcgr1", "wcgr2", "wcgr3", \ - "cc", "vfpcc", "sfp", "afp", "apsrq", "apsrge", "p0" \ + "cc", "vfpcc", "sfp", "afp", "apsrq", "apsrge", "p0", \ + "ra_auth_code" \ } #endif diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index 8e6ef41f6b065217d1af3f4f1cb85b2d8fbd0dc0..f31944e85c9ab83501f156d138e2aea1bcb5b79d 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -815,7 +815,8 @@ extern const int arm_arch_cde_coproc_bits[]; s16-s31 S VFP variable (aka d8-d15). vfpcc Not a real register. Represents the VFP condition code flags. - vpr Used to represent MVE VPR predication. */ + vpr Used to represent MVE VPR predication. + ra_auth_code Pseudo register to save PAC. */ /* The stack backtrace structure is as follows: fp points to here: | save code pointer | [fp] @@ -856,7 +857,7 @@ extern const int arm_arch_cde_coproc_bits[]; 1,1,1,1,1,1,1,1, \ 1,1,1,1, \ /* Specials. */ \ - 1,1,1,1,1,1,1 \ + 1,1,1,1,1,1,1,1 \ } /* 1 for registers not available across function calls. @@ -886,7 +887,7 @@ extern const int arm_arch_cde_coproc_bits[]; 1,1,1,1,1,1,1,1, \ 1,1,1,1, \ /* Specials. */ \ - 1,1,1,1,1,1,1 \ + 1,1,1,1,1,1,1,1 \ } #ifndef SUBTARGET_CONDITIONAL_REGISTER_USAGE @@ -1062,10 +1063,10 @@ extern const int arm_arch_cde_coproc_bits[]; && (LAST_VFP_REGNUM - (REGNUM) >= 2 * (N) - 1)) /* The number of hard registers is 16 ARM + 1 CC + 1 SFP + 1 AFP - + 1 APSRQ + 1 APSRGE + 1 VPR. */ + + 1 APSRQ + 1 APSRGE + 1 VPR + 1 Pseudo register to save PAC. */ /* Intel Wireless MMX Technology registers add 16 + 4 more. */ /* VFP (VFP3) adds 32 (64) + 1 VFPCC. */ -#define FIRST_PSEUDO_REGISTER 107 +#define FIRST_PSEUDO_REGISTER 108 #define DBX_REGISTER_NUMBER(REGNO) arm_dbx_register_number (REGNO) @@ -1248,12 +1249,15 @@ extern int arm_regs_in_sequence[]; CC_REGNUM, VFPCC_REGNUM, \ FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, \ SP_REGNUM, PC_REGNUM, APSRQ_REGNUM, \ - APSRGE_REGNUM, VPR_REGNUM \ + APSRGE_REGNUM, VPR_REGNUM, RA_AUTH_CODE \ } #define IS_VPR_REGNUM(REGNUM) \ ((REGNUM) == VPR_REGNUM) +#define IS_PAC_Pseudo_REGNUM(REGNUM) \ + ((REGNUM) == RA_AUTH_CODE) + /* Use different register alloc ordering for Thumb. */ #define ADJUST_REG_ALLOC_ORDER arm_order_regs_for_local_alloc () @@ -1292,6 +1296,7 @@ enum reg_class SFP_REG, AFP_REG, VPR_REG, + PAC_REG, ALL_REGS, LIM_REG_CLASSES }; @@ -1321,6 +1326,7 @@ enum reg_class "SFP_REG", \ "AFP_REG", \ "VPR_REG", \ + "PAC_REG", \ "ALL_REGS" \ } @@ -1349,6 +1355,7 @@ enum reg_class { 0x00000000, 0x00000000, 0x00000000, 0x00000040 }, /* SFP_REG */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000080 }, /* AFP_REG */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000400 }, /* VPR_REG. */ \ + { 0x00000000, 0x00000000, 0x00000000, 0x00000800 }, /* PAC_REG. */ \ { 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F } /* ALL_REGS. */ \ } diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index a3e34747ba52840bd82f76df4a3f05704bd42ec1..966c49a3bf21de909dbab5abcac5d1d3b2af4262 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -22000,7 +22000,9 @@ emit_multi_reg_push (unsigned long mask, unsigned long dwarf_regs_mask) { if (mask & (1 << i)) { - reg = gen_rtx_REG (SImode, i); + rtx reg1 = reg = gen_rtx_REG (SImode, i); + if (arm_pac_enabled_for_curr_function_p () && i == IP_REGNUM) + reg1 = gen_rtx_REG (SImode, RA_AUTH_CODE); XVECEXP (par, 0, 0) = gen_rtx_SET (gen_frame_mem @@ -22018,7 +22020,7 @@ emit_multi_reg_push (unsigned long mask, unsigned long dwarf_regs_mask) if (dwarf_regs_mask & (1 << i)) { tmp = gen_rtx_SET (gen_frame_mem (SImode, stack_pointer_rtx), - reg); + reg1); RTX_FRAME_RELATED_P (tmp) = 1; XVECEXP (dwarf, 0, dwarf_par_index++) = tmp; } @@ -23505,7 +23507,10 @@ arm_expand_prologue (void) saved_regs += arm_save_coproc_regs (); if (arm_pac_enabled_for_curr_function_p ()) - emit_multi_reg_push (1 << IP_REGNUM, 1 << IP_REGNUM); + { + insn = emit_multi_reg_push (1 << IP_REGNUM, 1 << IP_REGNUM); + RTX_FRAME_RELATED_P (insn) = 1; + } if (frame_pointer_needed && TARGET_ARM) { @@ -25435,6 +25440,9 @@ arm_regno_class (int regno) if (IS_VPR_REGNUM (regno)) return VPR_REG; + if (IS_PAC_Pseudo_REGNUM (regno)) + return PAC_REG; + if (TARGET_THUMB1) { if (regno == STACK_POINTER_REGNUM) @@ -29429,6 +29437,9 @@ arm_dbx_register_number (unsigned int regno) if (IS_IWMMXT_REGNUM (regno)) return 112 + regno - FIRST_IWMMXT_REGNUM; + if (IS_PAC_Pseudo_REGNUM (regno)) + return 143; + return DWARF_FRAME_REGISTERS; } @@ -29550,6 +29561,11 @@ arm_unwind_emit_sequence (FILE * out_file, rtx p) reg_size = 8; fprintf (out_file, "\t.vsave {"); } + else if (IS_PAC_Pseudo_REGNUM (reg)) + { + reg_size = 4; + fprintf (out_file, "\t.save {"); + } else /* Unknown register type. */ gcc_unreachable (); @@ -29579,6 +29595,8 @@ arm_unwind_emit_sequence (FILE * out_file, rtx p) double precision register names. */ if (IS_VFP_REGNUM (reg)) asm_fprintf (out_file, "d%d", (reg - FIRST_VFP_REGNUM) / 2); + else if (IS_PAC_Pseudo_REGNUM (reg)) + asm_fprintf (asm_out_file, "ra_auth_code"); else asm_fprintf (out_file, "%r", reg); @@ -30447,7 +30465,10 @@ arm_conditional_register_usage (void) } if (TARGET_HAVE_PACBTI) - call_used_regs[IP_REGNUM] = 1; + { + call_used_regs[IP_REGNUM] = 1; + fixed_regs[RA_AUTH_CODE] = 0; + } /* The Q and GE bits are only accessed via special ACLE patterns. */ CLEAR_HARD_REG_BIT (operand_reg_set, APSRQ_REGNUM); diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 564170dc4500c2c5d961c9a19dd86a31416dc965..f27dc3f9041d8b32e7ad750c39143a6764156fe9 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -42,6 +42,7 @@ (APSRQ_REGNUM 104) ; Q bit pseudo register (APSRGE_REGNUM 105) ; GE bits pseudo register (VPR_REGNUM 106) ; Vector Predication Register - MVE register. + (RA_AUTH_CODE 107) ; Pseudo register to save PAC. ] ) ;; 3rd operand to select_dominance_cc_mode diff --git a/gcc/testsuite/gcc.target/arm/pac-6.c b/gcc/testsuite/gcc.target/arm/pac-6.c new file mode 100644 index 0000000000000000000000000000000000000000..25d6ae520aa1cece6a572c1d643fd640053106d5 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pac-6.c @@ -0,0 +1,31 @@ +/* Check that GCC does .save and .cfi_offset directives with RA_AUTH_CODE pseudo hard-register. */ +/* { dg-do compile } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main -mbranch-protection=pac-ret+leaf -mthumb -mfloat-abi=softfp --save-temps -O2 -fasynchronous-unwind-tables -g" } */ + +#include +#define ARM_UNWIND_INFO + +struct name { + int a; + char b; +} list; + +void func (struct name list); + +int main() +{ + list.a = 10; + list.b = 'c'; + func (list); + return 0; +} + +void func (struct name list) +{ + printf ("list.d = %d\n", list.a); + printf ("list.b = %c\n", list.b); +} + +/* { dg-final { scan-assembler "\.save \{ra_auth_code\}" } } */ +/* { dg-final { scan-assembler "\.cfi_offset 143, \-8" } } */ diff --git a/gcc/config/arm/aout.h b/gcc/config/arm/aout.h index 25a2812a663742893b928398b0d3948e97f1905b..c69e299e012f46c8d0711830125dbf2f6b2e93d7 100644 --- a/gcc/config/arm/aout.h +++ b/gcc/config/arm/aout.h @@ -74,7 +74,8 @@ "wr8", "wr9", "wr10", "wr11", \ "wr12", "wr13", "wr14", "wr15", \ "wcgr0", "wcgr1", "wcgr2", "wcgr3", \ - "cc", "vfpcc", "sfp", "afp", "apsrq", "apsrge", "p0" \ + "cc", "vfpcc", "sfp", "afp", "apsrq", "apsrge", "p0", \ + "ra_auth_code" \ } #endif diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index 8e6ef41f6b065217d1af3f4f1cb85b2d8fbd0dc0..f31944e85c9ab83501f156d138e2aea1bcb5b79d 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -815,7 +815,8 @@ extern const int arm_arch_cde_coproc_bits[]; s16-s31 S VFP variable (aka d8-d15). vfpcc Not a real register. Represents the VFP condition code flags. - vpr Used to represent MVE VPR predication. */ + vpr Used to represent MVE VPR predication. + ra_auth_code Pseudo register to save PAC. */ /* The stack backtrace structure is as follows: fp points to here: | save code pointer | [fp] @@ -856,7 +857,7 @@ extern const int arm_arch_cde_coproc_bits[]; 1,1,1,1,1,1,1,1, \ 1,1,1,1, \ /* Specials. */ \ - 1,1,1,1,1,1,1 \ + 1,1,1,1,1,1,1,1 \ } /* 1 for registers not available across function calls. @@ -886,7 +887,7 @@ extern const int arm_arch_cde_coproc_bits[]; 1,1,1,1,1,1,1,1, \ 1,1,1,1, \ /* Specials. */ \ - 1,1,1,1,1,1,1 \ + 1,1,1,1,1,1,1,1 \ } #ifndef SUBTARGET_CONDITIONAL_REGISTER_USAGE @@ -1062,10 +1063,10 @@ extern const int arm_arch_cde_coproc_bits[]; && (LAST_VFP_REGNUM - (REGNUM) >= 2 * (N) - 1)) /* The number of hard registers is 16 ARM + 1 CC + 1 SFP + 1 AFP - + 1 APSRQ + 1 APSRGE + 1 VPR. */ + + 1 APSRQ + 1 APSRGE + 1 VPR + 1 Pseudo register to save PAC. */ /* Intel Wireless MMX Technology registers add 16 + 4 more. */ /* VFP (VFP3) adds 32 (64) + 1 VFPCC. */ -#define FIRST_PSEUDO_REGISTER 107 +#define FIRST_PSEUDO_REGISTER 108 #define DBX_REGISTER_NUMBER(REGNO) arm_dbx_register_number (REGNO) @@ -1248,12 +1249,15 @@ extern int arm_regs_in_sequence[]; CC_REGNUM, VFPCC_REGNUM, \ FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, \ SP_REGNUM, PC_REGNUM, APSRQ_REGNUM, \ - APSRGE_REGNUM, VPR_REGNUM \ + APSRGE_REGNUM, VPR_REGNUM, RA_AUTH_CODE \ } #define IS_VPR_REGNUM(REGNUM) \ ((REGNUM) == VPR_REGNUM) +#define IS_PAC_Pseudo_REGNUM(REGNUM) \ + ((REGNUM) == RA_AUTH_CODE) + /* Use different register alloc ordering for Thumb. */ #define ADJUST_REG_ALLOC_ORDER arm_order_regs_for_local_alloc () @@ -1292,6 +1296,7 @@ enum reg_class SFP_REG, AFP_REG, VPR_REG, + PAC_REG, ALL_REGS, LIM_REG_CLASSES }; @@ -1321,6 +1326,7 @@ enum reg_class "SFP_REG", \ "AFP_REG", \ "VPR_REG", \ + "PAC_REG", \ "ALL_REGS" \ } @@ -1349,6 +1355,7 @@ enum reg_class { 0x00000000, 0x00000000, 0x00000000, 0x00000040 }, /* SFP_REG */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000080 }, /* AFP_REG */ \ { 0x00000000, 0x00000000, 0x00000000, 0x00000400 }, /* VPR_REG. */ \ + { 0x00000000, 0x00000000, 0x00000000, 0x00000800 }, /* PAC_REG. */ \ { 0xFFFF7FFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F } /* ALL_REGS. */ \ } diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index a3e34747ba52840bd82f76df4a3f05704bd42ec1..966c49a3bf21de909dbab5abcac5d1d3b2af4262 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -22000,7 +22000,9 @@ emit_multi_reg_push (unsigned long mask, unsigned long dwarf_regs_mask) { if (mask & (1 << i)) { - reg = gen_rtx_REG (SImode, i); + rtx reg1 = reg = gen_rtx_REG (SImode, i); + if (arm_pac_enabled_for_curr_function_p () && i == IP_REGNUM) + reg1 = gen_rtx_REG (SImode, RA_AUTH_CODE); XVECEXP (par, 0, 0) = gen_rtx_SET (gen_frame_mem @@ -22018,7 +22020,7 @@ emit_multi_reg_push (unsigned long mask, unsigned long dwarf_regs_mask) if (dwarf_regs_mask & (1 << i)) { tmp = gen_rtx_SET (gen_frame_mem (SImode, stack_pointer_rtx), - reg); + reg1); RTX_FRAME_RELATED_P (tmp) = 1; XVECEXP (dwarf, 0, dwarf_par_index++) = tmp; } @@ -23505,7 +23507,10 @@ arm_expand_prologue (void) saved_regs += arm_save_coproc_regs (); if (arm_pac_enabled_for_curr_function_p ()) - emit_multi_reg_push (1 << IP_REGNUM, 1 << IP_REGNUM); + { + insn = emit_multi_reg_push (1 << IP_REGNUM, 1 << IP_REGNUM); + RTX_FRAME_RELATED_P (insn) = 1; + } if (frame_pointer_needed && TARGET_ARM) { @@ -25435,6 +25440,9 @@ arm_regno_class (int regno) if (IS_VPR_REGNUM (regno)) return VPR_REG; + if (IS_PAC_Pseudo_REGNUM (regno)) + return PAC_REG; + if (TARGET_THUMB1) { if (regno == STACK_POINTER_REGNUM) @@ -29429,6 +29437,9 @@ arm_dbx_register_number (unsigned int regno) if (IS_IWMMXT_REGNUM (regno)) return 112 + regno - FIRST_IWMMXT_REGNUM; + if (IS_PAC_Pseudo_REGNUM (regno)) + return 143; + return DWARF_FRAME_REGISTERS; } @@ -29550,6 +29561,11 @@ arm_unwind_emit_sequence (FILE * out_file, rtx p) reg_size = 8; fprintf (out_file, "\t.vsave {"); } + else if (IS_PAC_Pseudo_REGNUM (reg)) + { + reg_size = 4; + fprintf (out_file, "\t.save {"); + } else /* Unknown register type. */ gcc_unreachable (); @@ -29579,6 +29595,8 @@ arm_unwind_emit_sequence (FILE * out_file, rtx p) double precision register names. */ if (IS_VFP_REGNUM (reg)) asm_fprintf (out_file, "d%d", (reg - FIRST_VFP_REGNUM) / 2); + else if (IS_PAC_Pseudo_REGNUM (reg)) + asm_fprintf (asm_out_file, "ra_auth_code"); else asm_fprintf (out_file, "%r", reg); @@ -30447,7 +30465,10 @@ arm_conditional_register_usage (void) } if (TARGET_HAVE_PACBTI) - call_used_regs[IP_REGNUM] = 1; + { + call_used_regs[IP_REGNUM] = 1; + fixed_regs[RA_AUTH_CODE] = 0; + } /* The Q and GE bits are only accessed via special ACLE patterns. */ CLEAR_HARD_REG_BIT (operand_reg_set, APSRQ_REGNUM); diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 564170dc4500c2c5d961c9a19dd86a31416dc965..f27dc3f9041d8b32e7ad750c39143a6764156fe9 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -42,6 +42,7 @@ (APSRQ_REGNUM 104) ; Q bit pseudo register (APSRGE_REGNUM 105) ; GE bits pseudo register (VPR_REGNUM 106) ; Vector Predication Register - MVE register. + (RA_AUTH_CODE 107) ; Pseudo register to save PAC. ] ) ;; 3rd operand to select_dominance_cc_mode diff --git a/gcc/testsuite/gcc.target/arm/pac-6.c b/gcc/testsuite/gcc.target/arm/pac-6.c new file mode 100644 index 0000000000000000000000000000000000000000..25d6ae520aa1cece6a572c1d643fd640053106d5 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pac-6.c @@ -0,0 +1,31 @@ +/* Check that GCC does .save and .cfi_offset directives with RA_AUTH_CODE pseudo hard-register. */ +/* { dg-do compile } */ +/* { dg-skip-if "avoid conflicting multilib options" { *-*-* } { "-marm" "-mcpu=*" } } */ +/* { dg-options "-march=armv8.1-m.main -mbranch-protection=pac-ret+leaf -mthumb -mfloat-abi=softfp --save-temps -O2 -fasynchronous-unwind-tables -g" } */ + +#include +#define ARM_UNWIND_INFO + +struct name { + int a; + char b; +} list; + +void func (struct name list); + +int main() +{ + list.a = 10; + list.b = 'c'; + func (list); + return 0; +} + +void func (struct name list) +{ + printf ("list.d = %d\n", list.a); + printf ("list.b = %c\n", list.b); +} + +/* { dg-final { scan-assembler "\.save \{ra_auth_code\}" } } */ +/* { dg-final { scan-assembler "\.cfi_offset 143, \-8" } } */