From patchwork Fri Mar 22 09:25:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Agarwal X-Patchwork-Id: 87506 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E418E3858418 for ; Fri, 22 Mar 2024 09:26:54 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by sourceware.org (Postfix) with ESMTPS id 558EE3858C55 for ; Fri, 22 Mar 2024 09:26:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 558EE3858C55 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.ibm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linux.ibm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 558EE3858C55 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711099577; cv=none; b=IiL9HEcxtC1jyZJOsyN6DlmhkQmxjRwRV0yYre5VUfXfy+80WQbxPkCCS4DZxXIPX0zfLQx5MdrflUfSYFIu4OCdxUlpmmuQYmedbO3ALj27gC7YiXdFPRdbaG/C0IrG79fj/kCypxtZjXcDJxdmrwZ8HgrUJh4M5CRGynbAvsk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711099577; c=relaxed/simple; bh=fCRES+QhpjEwGipkH8DZy8RfE4dCYRnAQx0wTp6+2Ic=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=RX7DtF4NdhKWoPwyhxIlXtxIsi9xi91vV3XAwlm1OfsMMvLz9+f03dlEdELbweoWBjHkkumSMuguNeLUx0oasBfcCeD/6F5gpDw2yPygx8JwXq+VI1NtkD5+8sQRX6l4khjMdW2RBx5Kds7sD5LjCz7QkwVGl+iS2Hhnieer5ws= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 42M90Sea011829; Fri, 22 Mar 2024 09:26:07 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=message-id : date : mime-version : to : from : subject : content-type : content-transfer-encoding; s=pp1; bh=+ssNj8xRbusmrZzMZ1ieOEIO8uIqlnKshRMmOUmfHlE=; b=YxaE0a5SIqWwvI4IgLNbl2q3AeMXakA/VcianF0ulMw+kcUNQILo/tnPUjTKtsNjcMcD FvjLxkkrkckM2i9lpehXElI1W9ZEUqL7BF7J/Xf/A7VMzJIG0SR3hnTOCJ1SX52tNXz/ zrTg2cNWR5CZ+ns9jxgwTS+yX0HwSDJP2xXjiojQVSCW/YpaP+S3ggD24rUD/RgNfLTb PCirWS7h0aJGO2vrvZ1RlYmHowpzgNdbCj+S4fqd/sx2iRuknYd2Vq8HGWntvCuvEyUv Am0A5x8RtC4krjXWH4ubrxnTieBR0l1VKsMNfZrtfYLipDuqFh6G2gwkEYeINWmlLTJV qQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3x15f8g88y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 22 Mar 2024 09:26:06 +0000 Received: from m0353729.ppops.net (m0353729.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 42M9PCPX019319; Fri, 22 Mar 2024 09:26:06 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3x15f8g88h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 22 Mar 2024 09:26:06 +0000 Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 42M8eCp7026714; Fri, 22 Mar 2024 09:25:52 GMT Received: from smtprelay02.wdc07v.mail.ibm.com ([172.16.1.69]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 3x0x172tmk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 22 Mar 2024 09:25:52 +0000 Received: from smtpav04.wdc07v.mail.ibm.com (smtpav04.wdc07v.mail.ibm.com [10.39.53.231]) by smtprelay02.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 42M9PnuS20120136 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 22 Mar 2024 09:25:51 GMT Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0D14B58054; Fri, 22 Mar 2024 09:25:49 +0000 (GMT) Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EF59D58045; Fri, 22 Mar 2024 09:25:45 +0000 (GMT) Received: from [9.43.31.19] (unknown [9.43.31.19]) by smtpav04.wdc07v.mail.ibm.com (Postfix) with ESMTP; Fri, 22 Mar 2024 09:25:45 +0000 (GMT) Message-ID: <3ff6a834-2d45-4f8d-8746-99fad5a73e60@linux.ibm.com> Date: Fri, 22 Mar 2024 14:55:43 +0530 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: Jakub Jelinek , "Kewen.Lin" , Segher Boessenkool , Peter Bergner , David Edelsohn , Michael Meissner , gcc-patches From: Ajit Agarwal Subject: [PATCH v1] rs6000: Stackoverflow in optimized code on PPC [PR100799] X-TM-AS-GCONF: 00 X-Proofpoint-GUID: COr48SLf2P6f88QYYfYLTWX5kOBvPUp6 X-Proofpoint-ORIG-GUID: Yf26hrZuRYYRRCbhzHm3elGppmokE7ep X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.1011,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2024-03-22_06,2024-03-21_02,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 spamscore=0 clxscore=1015 mlxlogscore=999 suspectscore=0 bulkscore=0 malwarescore=0 adultscore=0 mlxscore=0 priorityscore=1501 lowpriorityscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2403210000 definitions=main-2403220068 X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, KAM_MANYTO, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Hello Jakub: When using FlexiBLAS with OpenBLAS we noticed corruption of the parameters passed to OpenBLAS functions. FlexiBLAS basically provides a BLAS interface where each function is a stub that forwards the arguments to a real BLAS lib, like OpenBLAS. Fixes the corruption of caller frame checking number of arguments is less than equal to GP_ARG_NUM_REG (8) excluding hidden unused DECLS. Bootstrapped and regtested on powerpc64-linux-gnu. Thanks & Regards Ajit rs6000: Stackoverflow in optimized code on PPC [PR100799] When using FlexiBLAS with OpenBLAS we noticed corruption of the parameters passed to OpenBLAS functions. FlexiBLAS basically provides a BLAS interface where each function is a stub that forwards the arguments to a real BLAS lib, like OpenBLAS. Fixes the corruption of caller frame checking number of arguments is less than equal to GP_ARG_NUM_REG (8) excluding hidden unused DECLS. 2024-03-22 Ajit Kumar Agarwal gcc/ChangeLog: PR rtk-optimization/100799 * config/rs6000/rs6000-calls.cc (rs6000_function_arg): Don't generate parameter save area if number of arguments passed less than equal to GP_ARG_NUM_REG (8) excluding hidden parameter. (init_cumulative_args): Check for hidden parameter in fortran routine and set the flag hidden_string_length and actual parameter passed excluding hidden unused DECLS. * config/rs6000/rs6000.h (rs6000_args): Add new field hidden_string_length and actual_parm_length. --- gcc/config/rs6000/rs6000-call.cc | 40 ++++++++++++++++++++++++++++++-- gcc/config/rs6000/rs6000.h | 8 +++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/gcc/config/rs6000/rs6000-call.cc b/gcc/config/rs6000/rs6000-call.cc index 1f8f93a2ee7..2620ce16943 100644 --- a/gcc/config/rs6000/rs6000-call.cc +++ b/gcc/config/rs6000/rs6000-call.cc @@ -64,7 +64,7 @@ #include "ppc-auxv.h" #include "targhooks.h" #include "opts.h" - +#include "tree-dfa.h" #include "rs6000-internal.h" #ifndef TARGET_PROFILE_KERNEL @@ -584,6 +584,33 @@ init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, if (incoming || cum->prototype) cum->nargs_prototype = n_named_args; + /* Workaround buggy C/C++ wrappers around Fortran routines with + character(len=constant) arguments if the hidden string length arguments + are passed on the stack; if the callers forget to pass those arguments, + attempting to tail call in such routines leads to stack corruption. + Avoid return stack space for parameters <= 8 excluding hidden string + length argument is passed (partially or fully) on the stack in the + caller and the callee needs to pass any arguments on the stack. */ + unsigned int num_args = 0; + unsigned int hidden_length = 0; + + for (tree arg = DECL_ARGUMENTS (current_function_decl); + arg; arg = DECL_CHAIN (arg)) + { + num_args++; + if (DECL_HIDDEN_STRING_LENGTH (arg)) + { + tree parmdef = ssa_default_def (cfun, arg); + if (parmdef == NULL || has_zero_uses (parmdef)) + { + cum->hidden_string_length = 1; + hidden_length++; + } + } + } + + cum->actual_parm_length = num_args - hidden_length; + /* Check for a longcall attribute. */ if ((!fntype && rs6000_default_long_calls) || (fntype @@ -1857,7 +1884,16 @@ rs6000_function_arg (cumulative_args_t cum_v, const function_arg_info &arg) return rs6000_finish_function_arg (mode, rvec, k); } - else if (align_words < GP_ARG_NUM_REG) + /* Workaround buggy C/C++ wrappers around Fortran routines with + character(len=constant) arguments if the hidden string length arguments + are passed on the stack; if the callers forget to pass those arguments, + attempting to tail call in such routines leads to stack corruption. + Avoid return stack space for parameters <= 8 excluding hidden string + length argument is passed (partially or fully) on the stack in the + caller and the callee needs to pass any arguments on the stack. */ + else if (align_words < GP_ARG_NUM_REG + || (cum->hidden_string_length + && cum->actual_parm_length <= GP_ARG_NUM_REG)) { if (TARGET_32BIT && TARGET_POWERPC64) return rs6000_mixed_function_arg (mode, type, align_words); diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 68bc45d65ba..a1d3ed00b14 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -1490,6 +1490,14 @@ typedef struct rs6000_args int named; /* false for varargs params */ int escapes; /* if function visible outside tu */ int libcall; /* If this is a compiler generated call. */ + /* Actual parameter length ignoring hidden paramter. + This is done to C++ wrapper calling fortran module + which has hidden parameter that are not used. */ + unsigned int actual_parm_length; + /* Hidden parameters while calling C++ wrapper to fortran + module. Set if there is hidden parameter in fortran + module while called C++ wrapper. */ + unsigned int hidden_string_length : 1; } CUMULATIVE_ARGS; /* Initialize a variable CUM of type CUMULATIVE_ARGS