From patchwork Fri Nov 11 18:35:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiong Wang X-Patchwork-Id: 81888 Delivered-To: patch@linaro.org Received: by 10.140.97.165 with SMTP id m34csp1405385qge; Fri, 11 Nov 2016 10:35:55 -0800 (PST) X-Received: by 10.36.51.76 with SMTP id k73mr24856138itk.22.1478889355035; Fri, 11 Nov 2016 10:35:55 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id uc4si9636108pac.210.2016.11.11.10.35.54 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Nov 2016 10:35:55 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-441179-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-441179-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-441179-patch=linaro.org@gcc.gnu.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :subject:to:references:cc:message-id:date:mime-version :in-reply-to:content-type; q=dns; s=default; b=vEnzVtQ3wc+ukSrK9 Ri8NBkwtzfc3N568NnA5dOfWpC0A7wPBb7wl1clnl7aONPO2BSUC5vcET5995V4n wXgeFs3YuBBmz/k7frLJGqi0VDUJi7Q30yWzN4lAG6VeW/iO7V1Qzrrda91/E965 Y81qCzSzFNcK4n1d9jIlVLujNM= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :subject:to:references:cc:message-id:date:mime-version :in-reply-to:content-type; s=default; bh=+s1nZ7EUWSsYnQ50vpw8Ks0 BF6Q=; b=LQiZGHBfndY43Mfnt3eTq3PKU03SdKnG1Qzr6sKIxiemGhjvx8/yfsi hvQsJhjYLgwCiKFs1Y2kQRX8I1o8+4v/n+Fxb2mpSUQNp7j+jZczVK/R1K5AmJ62 V8p/fFA/c+/z8WaqDD66ySfvPgUNuHiHVUKzTIjxCamQHpzDHxUo= Received: (qmail 7459 invoked by alias); 11 Nov 2016 18:35:40 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 6934 invoked by uid 89); 11 Nov 2016 18:35:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.8 required=5.0 tests=BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=arg0, fcode, Builtins, backed X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 11 Nov 2016 18:35:29 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E6F8216; Fri, 11 Nov 2016 10:35:27 -0800 (PST) Received: from [10.2.206.198] (e104437-lin.cambridge.arm.com [10.2.206.198]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 54DD03F24D; Fri, 11 Nov 2016 10:35:27 -0800 (PST) From: Jiong Wang Subject: [6/9][AArch64] Add builtins support for pac/aut/xpac To: gcc-patches References: <72418e98-a400-c503-e8ce-c3fbe1ecc4a7@foss.arm.com> <64dd1b38-ff0a-5df0-1d3c-2fbf083e2697@foss.arm.com> <532363d6-0b33-491f-264d-9cd627713bf6@foss.arm.com> Cc: "Richard Earnshaw (lists)" , James Greenhalgh Message-ID: <0d2340f4-de89-8618-ed97-e19a0eb10981@foss.arm.com> Date: Fri, 11 Nov 2016 18:35:25 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: X-IsSubscribed: yes This patch implements a few ARMv8.3-A new builtins for pointer sign and authentication instructions. Currently, these builtins are supposed to be used by libgcc EH unwinder only. They are not public interface to external user. OK to install? gcc/ 2016-11-11 Jiong Wang * config/aarch64/aarch64-builtins.c (enum aarch64_builtins): New entries for AARCH64_PAUTH_BUILTIN_PACI1716, AARCH64_PAUTH_BUILTIN_AUTIA1716, AARCH64_PAUTH_BUILTIN_AUTIB1716, AARCH64_PAUTH_BUILTIN_XPACLRI. (aarch64_init_v8_3_builtins): New. (aarch64_init_builtins): Call aarch64_init_builtins. (arch64_expand_builtin): Expand new builtins. diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c index 9136910cd324a391de929ea9d1a13419dbcfb8bc..20679a5d3f6138f4c55b84f3aff5dfd0341e6787 100644 --- a/gcc/config/aarch64/aarch64-builtins.c +++ b/gcc/config/aarch64/aarch64-builtins.c @@ -353,6 +353,11 @@ enum aarch64_builtins AARCH64_CRC32_BUILTIN_BASE, AARCH64_CRC32_BUILTINS AARCH64_CRC32_BUILTIN_MAX, + /* ARMv8.3-A Pointer Authentication Builtins. */ + AARCH64_PAUTH_BUILTIN_AUTIA1716, + AARCH64_PAUTH_BUILTIN_AUTIB1716, + AARCH64_PAUTH_BUILTIN_XPACLRI, + AARCH64_PAUTH_BUILTIN_PACI1716, AARCH64_BUILTIN_MAX }; @@ -900,6 +905,37 @@ aarch64_init_fp16_types (void) aarch64_fp16_ptr_type_node = build_pointer_type (aarch64_fp16_type_node); } +/* Pointer authentication builtins that will become NOP on legacy platform. + Currently, these builtins are for internal use only (libgcc EH unwinder). */ + +void +aarch64_init_pauth_hint_builtins (void) +{ + /* Pointer Authentication builtins. */ + tree ftype_pointer_auth + = build_function_type_list (ptr_type_node, ptr_type_node, + unsigned_intDI_type_node, NULL_TREE); + tree ftype_pointer_strip + = build_function_type_list (ptr_type_node, ptr_type_node, NULL_TREE); + + aarch64_builtin_decls[AARCH64_PAUTH_BUILTIN_AUTIA1716] + = add_builtin_function ("__builtin_aarch64_autia1716", ftype_pointer_auth, + AARCH64_PAUTH_BUILTIN_AUTIA1716, BUILT_IN_MD, NULL, + NULL_TREE); + aarch64_builtin_decls[AARCH64_PAUTH_BUILTIN_AUTIB1716] + = add_builtin_function ("__builtin_aarch64_autib1716", ftype_pointer_auth, + AARCH64_PAUTH_BUILTIN_AUTIB1716, BUILT_IN_MD, NULL, + NULL_TREE); + aarch64_builtin_decls[AARCH64_PAUTH_BUILTIN_XPACLRI] + = add_builtin_function ("__builtin_aarch64_xpaclri", ftype_pointer_strip, + AARCH64_PAUTH_BUILTIN_XPACLRI, BUILT_IN_MD, NULL, + NULL_TREE); + aarch64_builtin_decls[AARCH64_PAUTH_BUILTIN_PACI1716] + = add_builtin_function ("__builtin_aarch64_paci1716", ftype_pointer_auth, + AARCH64_PAUTH_BUILTIN_PACI1716, BUILT_IN_MD, NULL, + NULL_TREE); +} + void aarch64_init_builtins (void) { @@ -928,6 +964,10 @@ aarch64_init_builtins (void) aarch64_init_crc32_builtins (); aarch64_init_builtin_rsqrt (); + +/* Initialize pointer authentication builtins which are backed by instructions + in NOP encoding space. */ + aarch64_init_pauth_hint_builtins (); } tree @@ -1270,6 +1310,76 @@ aarch64_expand_builtin (tree exp, } emit_insn (pat); return target; + case AARCH64_PAUTH_BUILTIN_AUTIA1716: + case AARCH64_PAUTH_BUILTIN_AUTIB1716: + case AARCH64_PAUTH_BUILTIN_PACI1716: + case AARCH64_PAUTH_BUILTIN_XPACLRI: + arg0 = CALL_EXPR_ARG (exp, 0); + op0 = force_reg (Pmode, expand_normal (arg0)); + + if (!target) + target = gen_reg_rtx (Pmode); + else + target = force_reg (Pmode, target); + + emit_move_insn (target, op0); + + if (fcode == AARCH64_PAUTH_BUILTIN_XPACLRI) + { + rtx lr_reg = gen_rtx_REG (Pmode, R30_REGNUM); + icode = CODE_FOR_strip_lr_sign; + emit_move_insn (lr_reg, op0); + emit_insn (GEN_FCN (icode) (const0_rtx)); + emit_move_insn (target, lr_reg); + } + else + { + tree arg1 = CALL_EXPR_ARG (exp, 1); + rtx op1 = expand_normal (arg1); + bool sign_op_p = (fcode == AARCH64_PAUTH_BUILTIN_PACI1716); + + bool x1716_op_p = (fcode == AARCH64_PAUTH_BUILTIN_AUTIA1716 + || fcode == AARCH64_PAUTH_BUILTIN_AUTIB1716 + || fcode == AARCH64_PAUTH_BUILTIN_PACI1716); + + bool a_key_p = (fcode == AARCH64_PAUTH_BUILTIN_AUTIA1716 + || (aarch64_pauth_key == AARCH64_PAUTH_IKEY_A + && fcode == AARCH64_PAUTH_BUILTIN_PACI1716)); + HOST_WIDE_INT key_index = + a_key_p ? AARCH64_PAUTH_IKEY_A : AARCH64_PAUTH_IKEY_B; + + if (sign_op_p) + { + if (x1716_op_p) + icode = CODE_FOR_sign_reg1716; + else + icode = CODE_FOR_sign_reg; + } + else + { + if (x1716_op_p) + icode = CODE_FOR_auth_reg1716; + else + icode = CODE_FOR_auth_reg;; + } + + op1 = force_reg (Pmode, op1); + + if (x1716_op_p) + { + rtx x16_reg = gen_rtx_REG (Pmode, R16_REGNUM); + rtx x17_reg = gen_rtx_REG (Pmode, R17_REGNUM); + emit_move_insn (x17_reg, op0); + emit_move_insn (x16_reg, op1); + emit_insn (GEN_FCN (icode) (GEN_INT (key_index), const0_rtx)); + emit_move_insn (target, x17_reg); + } + else + emit_insn (GEN_FCN (icode) (target, target, op1, + GEN_INT (key_index), const0_rtx)); + } + + return target; } if (fcode >= AARCH64_SIMD_BUILTIN_BASE && fcode <= AARCH64_SIMD_BUILTIN_MAX)