From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31439 invoked by alias); 26 Oct 2011 17:25:07 -0000 Received: (qmail 31373 invoked by uid 22791); 26 Oct 2011 17:25:05 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,MSGID_FROM_MTA_HEADER,RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mtagate1.uk.ibm.com (HELO mtagate1.uk.ibm.com) (194.196.100.161) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 26 Oct 2011 17:24:50 +0000 Received: from d06nrmr1507.portsmouth.uk.ibm.com (d06nrmr1507.portsmouth.uk.ibm.com [9.149.38.233]) by mtagate1.uk.ibm.com (8.13.1/8.13.1) with ESMTP id p9QHOmBn030399 for ; Wed, 26 Oct 2011 17:24:48 GMT Received: from d06av02.portsmouth.uk.ibm.com (d06av02.portsmouth.uk.ibm.com [9.149.37.228]) by d06nrmr1507.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p9QHOmgG2539564 for ; Wed, 26 Oct 2011 18:24:48 +0100 Received: from d06av02.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p9QHOmwY022525 for ; Wed, 26 Oct 2011 11:24:48 -0600 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d06av02.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with SMTP id p9QHOke8022453; Wed, 26 Oct 2011 11:24:47 -0600 Message-Id: <201110261724.p9QHOke8022453@d06av02.portsmouth.uk.ibm.com> Received: by tuxmaker.boeblingen.de.ibm.com (sSMTP sendmail emulation); Wed, 26 Oct 2011 19:24:46 +0200 Subject: Re: [commit/powerpc] crash trying to allocate memory in inferior To: brobecker@adacore.com (Joel Brobecker) Date: Wed, 26 Oct 2011 17:31:00 -0000 From: "Ulrich Weigand" Cc: gdb-patches@sourceware.org In-Reply-To: <1319475191-2379-1-git-send-email-brobecker@adacore.com> from "Joel Brobecker" at Oct 24, 2011 09:53:11 AM MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-10/txt/msg00700.txt.bz2 Joel Brobeker wrote: > * ppc-sysv-tdep.c (do_ppc_sysv_return_value): Do not check > FUNC_TYPE's calling convention if FUNC_TYPE is not a function. Huh, I had just been testing a different patch for the same problem ... Since this patch is a bit more general (it also fixes the 64-bit case, and actually handles pointers to OpenCL functions), I've checked it in anyway. Tested on powerpc64-linux. Bye, Ulrich ChangeLog: * ppc-sysv-tdep.c (ppc_sysv_use_opencl_abi): New function. (ppc_sysv_abi_push_dummy_call): Use it. (do_ppc_sysv_return_value): Likewise. (ppc64_sysv_abi_push_dummy_call): Likewise. (ppc64_sysv_abi_return_value): Likewise. Index: gdb/ppc-sysv-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/ppc-sysv-tdep.c,v retrieving revision 1.64 diff -u -p -r1.64 ppc-sysv-tdep.c --- gdb/ppc-sysv-tdep.c 24 Oct 2011 16:51:36 -0000 1.64 +++ gdb/ppc-sysv-tdep.c 26 Oct 2011 16:12:56 -0000 @@ -32,6 +32,22 @@ #include "infcall.h" #include "dwarf2.h" + +/* Check whether FTPYE is a (pointer to) function type that should use + the OpenCL vector ABI. */ + +static int +ppc_sysv_use_opencl_abi (struct type *ftype) +{ + ftype = check_typedef (ftype); + + if (TYPE_CODE (ftype) == TYPE_CODE_PTR) + ftype = check_typedef (TYPE_TARGET_TYPE (ftype)); + + return (TYPE_CODE (ftype) == TYPE_CODE_FUNC + && TYPE_CALLING_CONVENTION (ftype) == DW_CC_GDB_IBM_OpenCL); +} + /* Pass the arguments in either registers, or in the stack. Using the ppc sysv ABI, the first eight words of the argument list (that might be less than eight parameters if some parameters occupy more than one @@ -51,8 +67,7 @@ ppc_sysv_abi_push_dummy_call (struct gdb { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - struct type *ftype; - int opencl_abi = 0; + int opencl_abi = ppc_sysv_use_opencl_abi (value_type (function)); ULONGEST saved_sp; int argspace = 0; /* 0 is an initial wrong guess. */ int write_pass; @@ -62,13 +77,6 @@ ppc_sysv_abi_push_dummy_call (struct gdb regcache_cooked_read_unsigned (regcache, gdbarch_sp_regnum (gdbarch), &saved_sp); - ftype = check_typedef (value_type (function)); - if (TYPE_CODE (ftype) == TYPE_CODE_PTR) - ftype = check_typedef (TYPE_TARGET_TYPE (ftype)); - if (TYPE_CODE (ftype) == TYPE_CODE_FUNC - && TYPE_CALLING_CONVENTION (ftype) == DW_CC_GDB_IBM_OpenCL) - opencl_abi = 1; - /* Go through the argument list twice. Pass 1: Figure out how much new stack space is required for @@ -689,12 +697,7 @@ do_ppc_sysv_return_value (struct gdbarch { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - int opencl_abi = 0; - - if (func_type - && TYPE_CODE (func_type) == TYPE_CODE_FUNC - && TYPE_CALLING_CONVENTION (func_type) == DW_CC_GDB_IBM_OpenCL) - opencl_abi = 1; + int opencl_abi = func_type? ppc_sysv_use_opencl_abi (func_type) : 0; gdb_assert (tdep->wordsize == 4); @@ -1115,8 +1118,7 @@ ppc64_sysv_abi_push_dummy_call (struct g CORE_ADDR func_addr = find_function_addr (function, NULL); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - struct type *ftype; - int opencl_abi = 0; + int opencl_abi = ppc_sysv_use_opencl_abi (value_type (function)); ULONGEST back_chain; /* See for-loop comment below. */ int write_pass; @@ -1146,13 +1148,6 @@ ppc64_sysv_abi_push_dummy_call (struct g regcache_cooked_read_unsigned (regcache, gdbarch_sp_regnum (gdbarch), &back_chain); - ftype = check_typedef (value_type (function)); - if (TYPE_CODE (ftype) == TYPE_CODE_PTR) - ftype = check_typedef (TYPE_TARGET_TYPE (ftype)); - if (TYPE_CODE (ftype) == TYPE_CODE_FUNC - && TYPE_CALLING_CONVENTION (ftype) == DW_CC_GDB_IBM_OpenCL) - opencl_abi = 1; - /* Go through the argument list twice. Pass 1: Compute the function call's stack space and register @@ -1721,11 +1716,7 @@ ppc64_sysv_abi_return_value (struct gdba { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - int opencl_abi = 0; - - if (func_type - && TYPE_CALLING_CONVENTION (func_type) == DW_CC_GDB_IBM_OpenCL) - opencl_abi = 1; + int opencl_abi = func_type? ppc_sysv_use_opencl_abi (func_type) : 0; /* This function exists to support a calling convention that requires floating-point registers. It shouldn't be used on -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com