From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 54806 invoked by alias); 2 Nov 2017 12:34:46 -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 53547 invoked by uid 89); 2 Nov 2017 12:34:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,RCVD_IN_DNSWL_NONE,RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=PLUS, H*RU:10.12.239.238, Hx-spam-relays-external:sk:US01WEH, Hx-spam-relays-external:sk:us01weh X-HELO: smtprelay.synopsys.com Received: from smtprelay.synopsys.com (HELO smtprelay.synopsys.com) (198.182.47.9) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 02 Nov 2017 12:34:40 +0000 Received: from mailhost.synopsys.com (mailhost3.synopsys.com [10.12.238.238]) by smtprelay.synopsys.com (Postfix) with ESMTP id 66BC724E2036; Thu, 2 Nov 2017 05:34:39 -0700 (PDT) Received: from mailhost.synopsys.com (localhost [127.0.0.1]) by mailhost.synopsys.com (Postfix) with ESMTP id 4EB56B1D; Thu, 2 Nov 2017 05:34:39 -0700 (PDT) Received: from US01WEHTC2.internal.synopsys.com (us01wehtc2-vip.internal.synopsys.com [10.12.239.238]) by mailhost.synopsys.com (Postfix) with ESMTP id 43265B1A; Thu, 2 Nov 2017 05:34:39 -0700 (PDT) Received: from IN01WEHTCB.internal.synopsys.com (10.144.199.106) by US01WEHTC2.internal.synopsys.com (10.12.239.237) with Microsoft SMTP Server (TLS) id 14.3.266.1; Thu, 2 Nov 2017 05:34:31 -0700 Received: from IN01WEHTCA.internal.synopsys.com (10.144.199.103) by IN01WEHTCB.internal.synopsys.com (10.144.199.105) with Microsoft SMTP Server (TLS) id 14.3.266.1; Thu, 2 Nov 2017 18:04:29 +0530 Received: from nl20droid1.internal.synopsys.com (10.100.24.228) by IN01WEHTCA.internal.synopsys.com (10.144.199.243) with Microsoft SMTP Server (TLS) id 14.3.266.1; Thu, 2 Nov 2017 18:04:28 +0530 From: Claudiu Zissulescu To: CC: , , Subject: [PATCH 4/6] [ARC] Rework delegitimate_address hook Date: Thu, 02 Nov 2017 12:34:00 -0000 Message-ID: <1509625835-22344-5-git-send-email-claziss@synopsys.com> In-Reply-To: <1509625835-22344-1-git-send-email-claziss@synopsys.com> References: <1509625835-22344-1-git-send-email-claziss@synopsys.com> MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2017-11/txt/msg00084.txt.bz2 From: claziss Delegitimize address is used to undo the obfuscating effect of PIC addresses, returning the address in a way which is understood by the compiler. gcc/ 2017-04-25 Claudiu Zissulescu * config/arc/arc.c (arc_delegitimize_address_0): Refactored to recognize new pic like addresses. (arc_delegitimize_address): Clean up. testsuite/ 2017-08-31 Claudiu Zissulescu * testsuite/gcc.target/arc/tdelegitimize_addr.c: New test. --- gcc/config/arc/arc.c | 91 ++++++++++------------- gcc/testsuite/gcc.target/arc/tdelegitimize_addr.c | 23 ++++++ 2 files changed, 62 insertions(+), 52 deletions(-) create mode 100755 gcc/testsuite/gcc.target/arc/tdelegitimize_addr.c diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c index e7194a2..07dd072 100644 --- a/gcc/config/arc/arc.c +++ b/gcc/config/arc/arc.c @@ -9506,68 +9506,55 @@ arc_legitimize_address (rtx orig_x, rtx oldx, machine_mode mode) } static rtx -arc_delegitimize_address_0 (rtx x) +arc_delegitimize_address_0 (rtx op) { - rtx u, gp, p; - - if (GET_CODE (x) == CONST && GET_CODE (u = XEXP (x, 0)) == UNSPEC) + switch (GET_CODE (op)) { - if (XINT (u, 1) == ARC_UNSPEC_GOT - || XINT (u, 1) == ARC_UNSPEC_GOTOFFPC) - return XVECEXP (u, 0, 0); + case CONST: + return arc_delegitimize_address_0 (XEXP (op, 0)); + + case UNSPEC: + switch (XINT (op, 1)) + { + case ARC_UNSPEC_GOT: + case ARC_UNSPEC_GOTOFFPC: + return XVECEXP (op, 0, 0); + default: + break; + } + break; + + case PLUS: + { + rtx t1 = arc_delegitimize_address_0 (XEXP (op, 0)); + rtx t2 = XEXP (op, 1); + + if (t1 && t2) + return gen_rtx_PLUS (GET_MODE (op), t1, t2); + break; + } + + default: + break; } - else if (GET_CODE (x) == CONST && GET_CODE (p = XEXP (x, 0)) == PLUS - && GET_CODE (u = XEXP (p, 0)) == UNSPEC - && (XINT (u, 1) == ARC_UNSPEC_GOT - || XINT (u, 1) == ARC_UNSPEC_GOTOFFPC)) - return gen_rtx_CONST - (GET_MODE (x), - gen_rtx_PLUS (GET_MODE (p), XVECEXP (u, 0, 0), XEXP (p, 1))); - else if (GET_CODE (x) == PLUS - && ((REG_P (gp = XEXP (x, 0)) - && REGNO (gp) == PIC_OFFSET_TABLE_REGNUM) - || (GET_CODE (gp) == CONST - && GET_CODE (u = XEXP (gp, 0)) == UNSPEC - && XINT (u, 1) == ARC_UNSPEC_GOT - && GET_CODE (XVECEXP (u, 0, 0)) == SYMBOL_REF - && !strcmp (XSTR (XVECEXP (u, 0, 0), 0), "_DYNAMIC"))) - && GET_CODE (XEXP (x, 1)) == CONST - && GET_CODE (u = XEXP (XEXP (x, 1), 0)) == UNSPEC - && XINT (u, 1) == ARC_UNSPEC_GOTOFF) - return XVECEXP (u, 0, 0); - else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS - && ((REG_P (gp = XEXP (XEXP (x, 0), 1)) - && REGNO (gp) == PIC_OFFSET_TABLE_REGNUM) - || (GET_CODE (gp) == CONST - && GET_CODE (u = XEXP (gp, 0)) == UNSPEC - && XINT (u, 1) == ARC_UNSPEC_GOT - && GET_CODE (XVECEXP (u, 0, 0)) == SYMBOL_REF - && !strcmp (XSTR (XVECEXP (u, 0, 0), 0), "_DYNAMIC"))) - && GET_CODE (XEXP (x, 1)) == CONST - && GET_CODE (u = XEXP (XEXP (x, 1), 0)) == UNSPEC - && XINT (u, 1) == ARC_UNSPEC_GOTOFF) - return gen_rtx_PLUS (GET_MODE (x), XEXP (XEXP (x, 0), 0), - XVECEXP (u, 0, 0)); - else if (GET_CODE (x) == PLUS - && (u = arc_delegitimize_address_0 (XEXP (x, 1)))) - return gen_rtx_PLUS (GET_MODE (x), XEXP (x, 0), u); return NULL_RTX; } static rtx -arc_delegitimize_address (rtx x) +arc_delegitimize_address (rtx orig_x) { - rtx orig_x = x = delegitimize_mem_from_attrs (x); - if (GET_CODE (x) == MEM) + rtx x = orig_x; + + if (MEM_P (x)) x = XEXP (x, 0); + x = arc_delegitimize_address_0 (x); - if (x) - { - if (MEM_P (orig_x)) - x = replace_equiv_address_nv (orig_x, x); - return x; - } - return orig_x; + if (!x) + return orig_x; + + if (MEM_P (orig_x)) + x = replace_equiv_address_nv (orig_x, x); + return x; } /* Return a REG rtx for acc1. N.B. the gcc-internal representation may diff --git a/gcc/testsuite/gcc.target/arc/tdelegitimize_addr.c b/gcc/testsuite/gcc.target/arc/tdelegitimize_addr.c new file mode 100755 index 0000000..0d010ff --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/tdelegitimize_addr.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-skip-if "" { ! { clmcpu } } } */ +/* { dg-options "-mcpu=archs -g -O1 -fpic -mlra" } */ + +/* Check if delegitimize address returns correctly the un-obfuscated + address. */ + +typedef struct { + long long tv_usec; +} t_a; + +static t_a a; + +int b; +extern void fn2 (t_a); + +void fn1 (void) +{ + again: + fn2(a); + if (b) + goto again; +} -- 1.9.1