From patchwork Sat Mar 20 12:21:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 1456095 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=XKadIyL8; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4F2fyL3v3Jz9sRf for ; Sat, 20 Mar 2021 23:21:44 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C5A543858009; Sat, 20 Mar 2021 12:21:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C5A543858009 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1616242897; bh=UbUZJmiA1uUXDtDVNpeW9SBXvmDTvPDwgSKtf/MPdj0=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=XKadIyL8gqrKA+JvCylZCBlbEHVWIfxdS4hpqvjEXeOBysZdjWlUAD8kVo5lV6hbt PacWRrinEJs8Ig/SFBtmZ7duPeVOT9G88wibpmH57222BpkNAPhXLP3SJTkW9rmCPH 5jnd4s+f+mAqNguJvU6qg6R6Bcy86Z88OnxlPKGg= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-pl1-x629.google.com (mail-pl1-x629.google.com [IPv6:2607:f8b0:4864:20::629]) by sourceware.org (Postfix) with ESMTPS id 5B9E53858001 for ; Sat, 20 Mar 2021 12:21:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 5B9E53858001 Received: by mail-pl1-x629.google.com with SMTP id e14so4201742plj.2 for ; Sat, 20 Mar 2021 05:21:35 -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:mime-version :content-transfer-encoding; bh=UbUZJmiA1uUXDtDVNpeW9SBXvmDTvPDwgSKtf/MPdj0=; b=IdXVnvIuxdnCys2mduMtS0+d/gUi7TkYcPxhhvYJlJ4hrbON/0Y9t61NV3r2Y2RlY7 xFb9CzV1xaymC6Kl7uxZDVxuVthm6jeqGrrk+6ePQHk3D5cvPpfC/46yldhMBPLaqbYz 8NAuFUO64H7sxE00A1gTu9cxY3Zfl8U4/48iTNdC7gGr4ZeDWbJ1NhZZ3kuL5MrjIGy0 XSPATnwQHfcN6CKI/68O1a36Gvk/+c7xBjNkO8MOlXwpiqlJ4OwTX3mrQ/4COvEyZmor MW04OicbcLE5GfwUw7m4UkXkzk7yu8mkznMpObJ1fFQX0b0rEu77QIXwXO8f0+UfD74y K+/w== X-Gm-Message-State: AOAM530Pam+iiaIeY9hkE7nF+cugP9h+bHeZZGev+wAaHBzEQhUwCeTD YlIe/NX9MJzvPRJAcPzkM+WhYNFj08I= X-Google-Smtp-Source: ABdhPJwa8X2dbdFUvHye2Ka1TTTX7NYx31pRsEPFaNA64zT9ziJsWuBXFiZvJXoR/2PeQbQ/QuAofA== X-Received: by 2002:a17:90b:46d0:: with SMTP id jx16mr3413310pjb.3.1616242893988; Sat, 20 Mar 2021 05:21:33 -0700 (PDT) Received: from gnu-cfl-2.localdomain ([172.56.38.37]) by smtp.gmail.com with ESMTPSA id mp21sm9017302pjb.16.2021.03.20.05.21.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Mar 2021 05:21:33 -0700 (PDT) Received: from gnu-cfl-2.?040none?041 (localhost [IPv6:::1]) by gnu-cfl-2.localdomain (Postfix) with ESMTP id F0B241A016E; Sat, 20 Mar 2021 05:21:31 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [PATCH] x86: Check cfun != NULL before accessing silent_p Date: Sat, 20 Mar 2021 05:21:31 -0700 Message-Id: <20210320122131.564376-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-Spam-Status: No, score=-3026.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, UNWANTED_LANGUAGE_BODY autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: "H.J. Lu via Gcc-patches" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Since construct_container may be called with cfun == NULL, check cfun != NULL before accessing silent_p. gcc/ PR target/99679 * config/i386/i386.c (construct_container): Check cfun != NULL before accessing silent_p. gcc/testsuite/ PR target/99679 * g++.target/i386/pr99679.C: New test. --- gcc/config/i386/i386.c | 4 +- gcc/testsuite/g++.target/i386/pr99679.C | 144 ++++++++++++++++++++++++ 2 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.target/i386/pr99679.C diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 714349094bd..7c41302c75b 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2540,7 +2540,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, { /* Return early if we shouldn't raise an error for invalid calls. */ - if (cfun->machine->silent_p) + if (cfun != NULL && cfun->machine->silent_p) return NULL; if (in_return) { @@ -2568,7 +2568,7 @@ construct_container (machine_mode mode, machine_mode orig_mode, { /* Return early if we shouldn't raise an error for invalid calls. */ - if (cfun->machine->silent_p) + if (cfun != NULL && cfun->machine->silent_p) return NULL; if (!issued_x87_ret_error) { diff --git a/gcc/testsuite/g++.target/i386/pr99679.C b/gcc/testsuite/g++.target/i386/pr99679.C new file mode 100644 index 00000000000..3570d34cf51 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr99679.C @@ -0,0 +1,144 @@ +// { dg-do compile } +// { dg-options "-Ofast -fipa-pta -mno-80387" } + +#include + +extern "C" void abort (void); + +int v1 = 8; +long int v2 = 3; +void *v3 = (void *) &v2; +struct A { char c[16]; } v4 = { "foo" }; +long double v5 = 40; +char seen[20]; +int cnt; + +__attribute__ ((noinline)) int +foo1 (int x, int y, ...) +{ + int i; + long int l; + void *v; + struct A a; + long double ld; + va_list ap; + + va_start (ap, y); + if (x < 0 || x >= 20 || seen[x]) + abort (); + seen[x] = ++cnt; + if (y != 6) + abort (); + i = va_arg (ap, int); + if (i != 5) + abort (); + switch (x) + { + case 0: + i = va_arg (ap, int); + if (i != 9 || v1 != 9) + abort (); + a = va_arg (ap, struct A); + if (__builtin_memcmp (a.c, v4.c, sizeof (a.c)) != 0) + abort (); + v = (void *) va_arg (ap, struct A *); + if (v != (void *) &v4) + abort (); + l = va_arg (ap, long int); + if (l != 3 || v2 != 4) + abort (); + break; + case 1: + ld = va_arg (ap, long double); + if (ld != 41 || v5 != ld) + abort (); + i = va_arg (ap, int); + if (i != 8) + abort (); + v = va_arg (ap, void *); + if (v != &v2) + abort (); + break; + case 2: + break; + default: + abort (); + } + va_end (ap); + return x; +} + +__attribute__ ((noinline)) int +foo2 (int x, int y, ...) +{ + long long int ll; + void *v; + struct A a, b; + long double ld; + va_list ap; + + va_start (ap, y); + if (x < 0 || x >= 20 || seen[x]) + abort (); + seen[x] = ++cnt | 64; + if (y != 10) + abort (); + switch (x) + { + case 11: + break; + case 12: + ld = va_arg (ap, long double); + if (ld != 41 || v5 != 40) + abort (); + a = va_arg (ap, struct A); + if (__builtin_memcmp (a.c, v4.c, sizeof (a.c)) != 0) + abort (); + b = va_arg (ap, struct A); + if (__builtin_memcmp (b.c, v4.c, sizeof (b.c)) != 0) + abort (); + v = va_arg (ap, void *); + if (v != &v2) + abort (); + ll = va_arg (ap, long long int); + if (ll != 16LL) + abort (); + break; + case 2: + break; + default: + abort (); + } + va_end (ap); + return x + 8; +} + +__attribute__ ((noinline)) int +foo3 (void) +{ + return 6; +} + +extern inline __attribute__ ((always_inline, gnu_inline)) int +bar (int x, ...) +{ + if (x < 10) + return foo1 (x, foo3 (), 5, __builtin_va_arg_pack ()); + return foo2 (x, foo3 () + 4, __builtin_va_arg_pack ()); +} + +int +main (void) +{ + if (bar (0, ++v1, v4, &v4, v2++) != 0) + abort (); + if (bar (1, ++v5, 8, v3) != 1) + abort (); + if (bar (2) != 2) + abort (); + if (bar (v1 + 2) != 19) + abort (); + if (bar (v1 + 3, v5--, v4, v4, v3, 16LL) != 20) + abort (); + return 0; +} // { dg-error "x87 register return with x87 disabled" "" { target { ! ia32 } } }