Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Feb 2016 13:20:04 -0800
From:      Mark Millard <markmi@dsl-only.net>
To:        Roman Divacky <rdivacky@vlakno.cz>
Cc:        Nathan Whitehorn <nwhitehorn@freebsd.org>, FreeBSD Toolchain <freebsd-toolchain@freebsd.org>, FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>
Subject:   Re: I've submitted 207175 for a clang 3.8.0 va_list handling problem for powerpc
Message-ID:  <D702187C-6B8C-42AC-855D-45A570FDB0FA@dsl-only.net>
In-Reply-To: <20160215201800.GA20796@vlakno.cz>
References:  <F6846682-10F7-4D0D-A691-ED8D4366805C@dsl-only.net> <20160214192903.GA96697@vlakno.cz> <70B405C4-E1AC-4F35-9786-051FDA2F8BE7@dsl-only.net> <D7D536A4-68B6-4506-BDFB-8C2C41E1C958@dsl-only.net> <20160215191100.GA17387@vlakno.cz> <3A260EC5-E69A-4980-8F74-C04395F4E5F4@dsl-only.net> <20160215201800.GA20796@vlakno.cz>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2016-Feb-15, at 12:18 PM, Roman Divacky <rdivacky@vlakno.cz> wrote:
>=20
> On Mon, Feb 15, 2016 at 12:17:50PM -0800, Mark Millard wrote:
>> On 2016-Feb-15, at 11:11 AM, Roman Divacky <rdivacky at vlakno.cz> =
wrote:
>>>=20
>>> Mark, I believe you're right. What do you think about this patch?
>>>=20
>>> Index: tools/clang/lib/CodeGen/TargetInfo.cpp
>>> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
>>> --- tools/clang/lib/CodeGen/TargetInfo.cpp	(revision 260852)
>>> +++ tools/clang/lib/CodeGen/TargetInfo.cpp	(working copy)
>>> @@ -3599,6 +3599,8 @@
>>>  {
>>>    CGF.EmitBlock(UsingOverflow);
>>>=20
>>> +    Builder.CreateStore(Builder.getInt8(11), NumRegsAddr);
>>> +
>>>    // Everything in the overflow area is rounded up to a size of at =
least 4.
>>>    CharUnits OverflowAreaAlign =3D CharUnits::fromQuantity(4);
>>>=20
>>>=20
>>> Can you test it?
>>=20
>> It may be later today before I can start the the test process.
>>=20
>> While your change is not wrong as presented, it does seem to be based =
on the ABI document's numbering with the range 3 <=3D gr <12, where 3 <=3D=
 gr < 11 cover r3-r10 use and gr=3D11 implies overflow stack area use. =
(gr being the ABI documents name.)
>>=20
>> The clang code generation that I saw while analyzing the problem and =
the clang source that you had me look at did not use that numbering. =
Instead it seems to be based on 0 <=3D gpr < 9, where 0 <=3D gpr < 8 =
cover r3-r10 use and gpr=3D8 implies overflow stack area use. (gpr being =
what gdb showed me as I remember.) In other words: clang counts the =
number of "parameter registers" already in use as it goes along instead =
of tracking register numbers that have been used.
>>=20
>> So assigning any value that appears to be positive and >=3D 8 should =
work, such as:
>>=20
>> Builder.CreateStore(Builder.getInt8(8), NumRegsAddr);
>=20
> Can you check what number gcc uses? We want to be interoperable with =
gcc.
>=20
> Anyway, thanks for testing!
>=20
> Roman

I'll do that check of gcc 4.2.1 code generation before starting the test =
later today.

But if the clang numbering is different in gcc 4.2.1 then far more than =
just adding a

> Builder.CreateStore(Builder.getInt8(?), NumRegsAddr)


for some "?" would need to be involved in the changes in order to reach =
compatibility.


I'll note that for clang 3.8.0 the actual comparison instruction =
generated is of the form

> cmplwi  r?,7


for some r?, such as r5 or r4, and the conditional branch generated is a =
bgt instruction.

=3D=3D=3D
Mark Millard
markmi at dsl-only.net




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?D702187C-6B8C-42AC-855D-45A570FDB0FA>