From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mikael Pettersson Subject: Re: aranym bug, manifests as "ida_remove called for id=13" on recent kernels Date: Mon, 11 Oct 2010 21:05:03 +0200 Message-ID: <19635.24543.793716.40892@pilspetsen.it.uu.se> References: <20101007174948.GT19804@ZenIV.linux.org.uk> <20101010144952.GF19804@ZenIV.linux.org.uk> <20101010235256.GG19804@ZenIV.linux.org.uk> <20101011024103.GH19804@ZenIV.linux.org.uk> <20101011043632.GA2566@cynthia.pants.nu> <20101011044808.GI19804@ZenIV.linux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: QUOTED-PRINTABLE Return-path: Received: from fanny.its.uu.se ([130.238.4.241]:58202 "EHLO fanny.its.uu.se" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754373Ab0JKTFH convert rfc822-to-8bit (ORCPT ); Mon, 11 Oct 2010 15:05:07 -0400 In-Reply-To: Sender: linux-m68k-owner@vger.kernel.org List-Id: linux-m68k@vger.kernel.org To: Thorsten Glaser Cc: linux-kernel@vger.kernel.org, linux-m68k@vger.kernel.org Thorsten Glaser writes: > Mikael Pettersson dixit: >=20 > >It's gcc PR41302 which was fixed for gcc trunk on November 4 2009 > >in r153890. The patch backports easily to gcc-4.4 and solves the > >test case there (manual inspection using a cross). It also backpor= ts >=20 > [x] send unidiff >=20 > I=E2=80=99ll include that in my gcc build and then forward it to Deb= ian > once I got a working gcc, unless you want to push that to them > already. This is what I have had in my repo since November last year, but it's only been minimally tested in a cross. Please push if/once it passes bootstrap + regtest. gcc/ 2009-11-10 Mikael Pettersson Backport from mainline: 2009-11-04 Maxim Kuvyrkov PR target/41302 * config/m68k/m68k.c (m68k_reg_present_p): New static function. (m68k_ok_for_sibcall_p): Handle different result return locations. gcc/testsuite/ 2009-11-10 Mikael Pettersson Backport from mainline: 2009-11-04 Carlos O'Donell PR target/41302 * gcc.target/m68k/pr41302.c: New test. --- gcc-4.4.2/gcc/config/m68k/m68k.c.~1~ 2008-11-19 17:24:10.000000000 = +0100 +++ gcc-4.4.2/gcc/config/m68k/m68k.c 2009-11-10 00:10:06.000000000 +010= 0 @@ -1374,6 +1374,30 @@ flags_in_68881 (void) return cc_status.flags & CC_IN_68881; } =20 +/* Return true if PARALLEL contains register REGNO. */ +static bool +m68k_reg_present_p (const_rtx parallel, unsigned int regno) +{ + int i; + + if (REG_P (parallel) && REGNO (parallel) =3D=3D regno) + return true; + + if (GET_CODE (parallel) !=3D PARALLEL) + return false; + + for (i =3D 0; i < XVECLEN (parallel, 0); ++i) + { + const_rtx x; + + x =3D XEXP (XVECEXP (parallel, 0, i), 0); + if (REG_P (x) && REGNO (x) =3D=3D regno) + return true; + } + + return false; +} + /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL_P. */ =20 static bool @@ -1386,6 +1410,26 @@ m68k_ok_for_sibcall_p (tree decl, tree e if (CALL_EXPR_STATIC_CHAIN (exp)) return false; =20 + if (!VOID_TYPE_P (TREE_TYPE (DECL_RESULT (cfun->decl)))) + { + /* Check that the return value locations are the same. For + example that we aren't returning a value from the sibling in + a D0 register but then need to transfer it to a A0 register. */ + rtx cfun_value; + rtx call_value; + + cfun_value =3D FUNCTION_VALUE (TREE_TYPE (DECL_RESULT (cfun->dec= l)), + cfun->decl); + call_value =3D FUNCTION_VALUE (TREE_TYPE (exp), decl); + + /* Check that the values are equal or that the result the callee + function returns is superset of what the current function returns. = */ + if (!(rtx_equal_p (cfun_value, call_value) + || (REG_P (cfun_value) + && m68k_reg_present_p (call_value, REGNO (cfun_value))))) + return false; + } + kind =3D m68k_get_function_kind (current_function_decl); if (kind =3D=3D m68k_fk_normal_function) /* We can always sibcall from a normal function, because it's @@ -4583,6 +4627,9 @@ m68k_libcall_value (enum machine_mode mo return gen_rtx_REG (mode, D0_REG); } =20 +/* Location in which function value is returned. + NOTE: Due to differences in ABIs, don't call this function directly= , + use FUNCTION_VALUE instead. */ rtx m68k_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNU= SED) { --- gcc-4.4.2/gcc/testsuite/gcc.target/m68k/pr41302.c.~1~ 1970-01-01 01= :00:00.000000000 +0100 +++ gcc-4.4.2/gcc/testsuite/gcc.target/m68k/pr41302.c 2009-11-04 13:09:= 17.000000000 +0100 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler "move.l \%d0,\%a0" { target *linux* } }= } */ + +struct pts { + int c; +}; + +unsigned int bar (struct pts *a, int b); + +struct pts * foo (struct pts *a, int b) +{ + return (struct pts *) bar (a, b); +}