From patchwork Mon May 8 22:55:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 759840 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wMHsV0z7zz9s78 for ; Tue, 9 May 2017 08:55:39 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="IHZ+sS1Z"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; q=dns; s=default; b=y6khdTRq7wzG Gk+Y04+C6fpw3vOlJW318g3bXPD5L8hWdY8ascsugas5MDrE9o4bJmw28FHotUab zkKcTzKZHVL/nyp0DCGZK4lUlbCxfgqm8pRn5kzIzjWtjFVyvo2U2UufE+mYp6zl 0gRYfjV90LpePUK7Esp4FjJ3sTMhoM8= 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 :to:cc:subject:date:message-id; s=default; bh=zBdqM2tlYMet4AAv04 uZRvXWqos=; b=IHZ+sS1ZZfJ7137rWGwKN9cm0cshNxTXaTjldZ1ihzVQqTnOFI INZkJC5GWmM6FN0QOhbMwXr9/WC936nhAcXdfR22aauQvfGP2HALy+mAJuIxCf5j buHKfF/DEbN6++lRw3whjfoD+7wMRkq4LgbQAZA5u6lKvkZ/vtsH7+1X4= Received: (qmail 127442 invoked by alias); 8 May 2017 22:55:28 -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 127429 invoked by uid 89); 8 May 2017 22:55:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.6 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, FROM_LOCAL_NOVOWEL, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, HK_RANDOM_ENVFROM, HK_RANDOM_FROM, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy=46011 X-HELO: mail-wm0-f67.google.com Received: from mail-wm0-f67.google.com (HELO mail-wm0-f67.google.com) (74.125.82.67) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 08 May 2017 22:55:26 +0000 Received: by mail-wm0-f67.google.com with SMTP id d127so10231295wmf.1 for ; Mon, 08 May 2017 15:55:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=Oyu8cMfmdXzGE4QNY+No6Zfs412dZu4JBvF1LugHPdA=; b=cwWTav9WTQt8U+wU/SA3byJ3QISnglFbVKTCAk13xt3azJr6qrq13/RYLqj5gh5sRt eB+BVhMpxTMCJoEX9DPBAD7uC2HlSBWwAQpPWqV2gdPcHuOeqD+3L/ow/VcKI7M+UZnO beWSuXZXO+I6V+HGDqV25yPTHYKh7QIyQ3IasD38GPUMwMXe4JNguMxmZvBEPlvl+Cnz ubFh2Vu+HIOWzHK7EeUcjP+IoFMllH9TwAM63IqzaJFEppEyEOQ7GB6dJEK5Us2xU+JY L0wHGptjv+qL+MAuE+xR4SlqmB6dc+I0Flr/fqUSTBCxrEe2QB06uim00uI/KPEaxf9w R/EQ== X-Gm-Message-State: AODbwcAZ+mySOMl/GNwBUZyOAuG1vESIxRefF/W4MNzA2VSF6mXvtM0N SQTGWDiDQM52mzvO X-Received: by 10.25.17.96 with SMTP id g93mr10721331lfi.129.1494284126818; Mon, 08 May 2017 15:55:26 -0700 (PDT) Received: from octofox.metropolis ([5.19.183.212]) by smtp.gmail.com with ESMTPSA id x22sm1733026ljd.38.2017.05.08.15.55.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 08 May 2017 15:55:26 -0700 (PDT) From: Max Filippov To: gcc-patches@gcc.gnu.org Cc: linux-xtensa@linux-xtensa.org, Sterling Augustine , Max Filippov Subject: [PATCH] xtensa: add support for SSP Date: Mon, 8 May 2017 15:55:11 -0700 Message-Id: <1494284111-31745-1-git-send-email-jcmvbkbc@gmail.com> X-IsSubscribed: yes gcc/ 2017-03-27 Max Filippov * config/xtensa/xtensa-protos.h (xtensa_initial_elimination_offset): New declaration. * config/xtensa/xtensa.c (xtensa_initial_elimination_offset): New function. Move its body from the INITIAL_ELIMINATION_OFFSET macro definition, add case for FRAME_POINTER_REGNUM when FRAME_GROWS_DOWNWARD. * config/xtensa/xtensa.h (FRAME_GROWS_DOWNWARD): New macro definition. (INITIAL_ELIMINATION_OFFSET): Replace body with call to xtensa_initial_elimination_offset. --- gcc/config/xtensa/xtensa-protos.h | 1 + gcc/config/xtensa/xtensa.c | 24 ++++++++++++++++++++++++ gcc/config/xtensa/xtensa.h | 19 ++++--------------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/gcc/config/xtensa/xtensa-protos.h b/gcc/config/xtensa/xtensa-protos.h index 873557f..ef9417c 100644 --- a/gcc/config/xtensa/xtensa-protos.h +++ b/gcc/config/xtensa/xtensa-protos.h @@ -73,5 +73,6 @@ extern void xtensa_expand_prologue (void); extern void xtensa_expand_epilogue (void); extern void order_regs_for_local_alloc (void); extern enum reg_class xtensa_regno_to_class (int regno); +extern HOST_WIDE_INT xtensa_initial_elimination_offset (int from, int to); #endif /* !__XTENSA_PROTOS_H__ */ diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c index 25ed7db..2578716 100644 --- a/gcc/config/xtensa/xtensa.c +++ b/gcc/config/xtensa/xtensa.c @@ -2676,6 +2676,30 @@ xtensa_frame_pointer_required (void) return false; } +HOST_WIDE_INT +xtensa_initial_elimination_offset (int from, int to) +{ + long frame_size = compute_frame_size (get_frame_size ()); + HOST_WIDE_INT offset; + + switch (from) + { + case FRAME_POINTER_REGNUM: + if (FRAME_GROWS_DOWNWARD) + offset = frame_size - (WINDOW_SIZE * UNITS_PER_WORD) + - cfun->machine->callee_save_size; + else + offset = 0; + break; + case ARG_POINTER_REGNUM: + offset = frame_size; + break; + default: + gcc_unreachable (); + } + + return offset; +} /* minimum frame = reg save area (4 words) plus static chain (1 word) and the total number of words must be a multiple of 128 bits. */ diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h index 58eb1b2..68ee96a 100644 --- a/gcc/config/xtensa/xtensa.h +++ b/gcc/config/xtensa/xtensa.h @@ -460,9 +460,11 @@ enum reg_class #define STACK_GROWS_DOWNWARD 1 +#define FRAME_GROWS_DOWNWARD flag_stack_protect + /* Offset within stack frame to start allocating local variables at. */ #define STARTING_FRAME_OFFSET \ - crtl->outgoing_args_size + (FRAME_GROWS_DOWNWARD ? 0 : crtl->outgoing_args_size) /* The ARG_POINTER and FRAME_POINTER are not real Xtensa registers, so they are eliminated to either the stack pointer or hard frame pointer. */ @@ -474,20 +476,7 @@ enum reg_class /* Specify the initial difference between the specified pair of registers. */ #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ - do { \ - long frame_size = compute_frame_size (get_frame_size ()); \ - switch (FROM) \ - { \ - case FRAME_POINTER_REGNUM: \ - (OFFSET) = 0; \ - break; \ - case ARG_POINTER_REGNUM: \ - (OFFSET) = frame_size; \ - break; \ - default: \ - gcc_unreachable (); \ - } \ - } while (0) + (OFFSET) = xtensa_initial_elimination_offset ((FROM), (TO)) /* If defined, the maximum amount of space required for outgoing arguments will be computed and placed into the variable