From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 65643 invoked by alias); 9 Dec 2018 10:09:17 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 65629 invoked by uid 89); 9 Dec 2018 10:09:16 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_NUMSUBJECT,SPF_PASS autolearn=ham version=3.3.2 spammy=UD:eu, HX-OutGoing-Spam-Status:score, spanning, H*Ad:D*eu X-HELO: server28.superhosting.bg Received: from server28.superhosting.bg (HELO server28.superhosting.bg) (217.174.156.11) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 09 Dec 2018 10:09:12 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dinux.eu; s=default; h=Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:MIME-Version :Content-Type:Content-Transfer-Encoding:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=ABcuxlxLtrEU63FOD2In8o5K95jbPV6tnHb7KSC3fgA=; b=TgbOxlFCYfhkER6GmBMBfJi5Q9 cYT7HQUNOf7MmEEEEzHHwWYZs02GcGR2XZEMRxjdT7w7ihERPIfLF4gtPowu8ccHWHwh3CYDjE8NH GbVsygwer1nakGhQglNvxewWsymylrCxWqHk/BLirRuDToqMNswbFrbTd2c6gZ7Bx9PRQbeR8PqlP BModJE1d7t7avOQpcZf7PcyBJYLn35l3XS5M8ad73ll/Qdhf1Sie3kWYZ+R4tS9Jtu3oTo3OeT5/Y RiqwTF4cRlY3geWYQTPte4p75xLsrHhEiWEFjxUps8zjobudWKsbx7x1Y51bz5/NygtqBaViolpAd UppBBu7g==; Received: from [95.87.234.74] (port=35372 helo=localhost.localdomain) by server28.superhosting.bg with esmtpsa (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.91) (envelope-from ) id 1gVw1M-0008oV-5z; Sun, 09 Dec 2018 12:09:10 +0200 From: Dimitar Dimitrov To: gcc-patches@gcc.gnu.org Cc: Dimitar Dimitrov Subject: [PATCH] [RFC] PR target/52813 and target/11807 Date: Sun, 09 Dec 2018 10:09:00 -0000 Message-Id: <20181209100856.14051-1-dimitar@dinux.eu> X-OutGoing-Spam-Status: No, score=-0.5 X-IsSubscribed: yes X-SW-Source: 2018-12/txt/msg00532.txt.bz2 I have tested this fix on x86_64 host, and found no regression in the C and C++ testsuites. I'm marking this patch as RFC simply because I don't have experience with other architectures, and I don't have a setup to test all architectures supported by GCC. gcc/ChangeLog: 2018-12-07 Dimitar Dimitrov * cfgexpand.c (asm_clobber_reg_is_valid): Also produce error when stack pointer is clobbered. (expand_asm_stmt): Refactor clobber check in separate function. gcc/testsuite/ChangeLog: 2018-12-07 Dimitar Dimitrov * gcc.target/i386/pr52813.c: New test. Signed-off-by: Dimitar Dimitrov --- gcc/cfgexpand.c | 42 ++++++++++++++++++++++++++------- gcc/testsuite/gcc.target/i386/pr52813.c | 9 +++++++ 2 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr52813.c diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 5e23bc242b9..8474372a216 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2845,6 +2845,38 @@ tree_conflicts_with_clobbers_p (tree t, HARD_REG_SET *clobbered_regs) return false; } +/* Check that the given REGNO spanning NREGS is a valid + asm clobber operand. Some HW registers cannot be + saved/restored, hence they should not be clobbered by + asm statements. */ +static bool +asm_clobber_reg_is_valid (int regno, int nregs, const char *regname) +{ + bool is_valid = true; + HARD_REG_SET regset; + + CLEAR_HARD_REG_SET (regset); + + add_range_to_hard_reg_set (®set, regno, nregs); + + /* Clobbering the PIC register is an error. */ + if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM + && overlaps_hard_reg_set_p (regset, Pmode, PIC_OFFSET_TABLE_REGNUM)) + { + /* ??? Diagnose during gimplification? */ + error ("PIC register clobbered by %qs in %", regname); + is_valid = false; + } + /* Clobbering the STACK POINTER register is an error. */ + if (overlaps_hard_reg_set_p (regset, Pmode, STACK_POINTER_REGNUM)) + { + error ("Stack Pointer register clobbered by %qs in %", regname); + is_valid = false; + } + + return is_valid; +} + /* Generate RTL for an asm statement with arguments. STRING is the instruction template. OUTPUTS is a list of output arguments (lvalues); INPUTS a list of inputs. @@ -2977,14 +3009,8 @@ expand_asm_stmt (gasm *stmt) else for (int reg = j; reg < j + nregs; reg++) { - /* Clobbering the PIC register is an error. */ - if (reg == (int) PIC_OFFSET_TABLE_REGNUM) - { - /* ??? Diagnose during gimplification? */ - error ("PIC register clobbered by %qs in %", - regname); - return; - } + if (!asm_clobber_reg_is_valid (reg, nregs, regname)) + return; SET_HARD_REG_BIT (clobbered_regs, reg); rtx x = gen_rtx_REG (reg_raw_mode[reg], reg); diff --git a/gcc/testsuite/gcc.target/i386/pr52813.c b/gcc/testsuite/gcc.target/i386/pr52813.c new file mode 100644 index 00000000000..154ebbfc423 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr52813.c @@ -0,0 +1,9 @@ +/* Ensure that stack pointer cannot be an asm clobber. */ +/* { dg-do compile { target { ! ia32 } } } */ +/* { dg-options "-O2" } */ + +void +test1 (void) +{ + asm volatile ("" : : : "%esp"); /* { dg-error "Stack Pointer register clobbered" } */ +} -- 2.11.0