Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Oct 2017 14:24:07 -0700
From:      Mark Millard <markmi@dsl-only.net>
To:        Roman Divacky <rdivacky@vlakno.cz>, FreeBSD Toolchain <freebsd-toolchain@freebsd.org>, FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>, freebsd-hackers <freebsd-hackers@freebsd.org>, Justin Hibbits <jrh29@alumni.cwru.edu>, Nathan Whitehorn <nwhitehorn@freebsd.org>
Subject:   Re: head -r324071 clang++ 5 for TARGET_ARCH=powerpc64 (e.g.): DW_CFA_offset_extended for r97-r108? Handled by FreeBSD's libgcc_s.so.1 ? (more. . .)
Message-ID:  <CF0CE1A7-7AC4-48C8-89EE-D8EABE408DBC@dsl-only.net>
In-Reply-To: <1098914B-6BA2-419D-B8FB-01AB71C3DC29@dsl-only.net>
References:  <6FEAEDA2-6036-4FC0-B794-15BC264BD31D@dsl-only.net> <1098914B-6BA2-419D-B8FB-01AB71C3DC29@dsl-only.net>

next in thread | previous in thread | raw e-mail | index | archive | help
Quick top note: clang 5 does generate code sequences
with AltiVec stvx and lvx instructions where r97-r108
are listed but powerpc64-gcc is not doing so in those
same sorts of places. This appears to be a ABI
variation across toolchains to me, unless such is
fully optional in the ABI somehow.

On 2017-Oct-8, at 6:34 AM, Mark Millard <markmi at dsl-only.net> wrote:

> [Looks like r97-r108 are for vr20-vr31 (AltiVec
> Registers).]
>=20
> On 2017-Oct-8, at 4:34 AM, Mark Millard <markmi at dsl-only.net> =
wrote:
>=20
>> =46rom a dwarfdump's _Unwind_RaiseException information
>> from a clang/clang++ 5 based compile:
>>=20
>>       91 DW_CFA_offset_extended r97 -496  (62 * -8)
>>       94 DW_CFA_offset_extended r98 -480  (60 * -8)
>>       97 DW_CFA_offset_extended r99 -464  (58 * -8)
>>       100 DW_CFA_offset_extended r100 -448  (56 * -8)
>>       103 DW_CFA_offset_extended r101 -432  (54 * -8)
>>       106 DW_CFA_offset_extended r102 -416  (52 * -8)
>>       109 DW_CFA_offset_extended r103 -400  (50 * -8)
>>       112 DW_CFA_offset_extended r104 -384  (48 * -8)
>>       115 DW_CFA_offset_extended r105 -368  (46 * -8)
>>       118 DW_CFA_offset_extended r106 -352  (44 * -8)
>>       121 DW_CFA_offset_extended r107 -336  (42 * -8)
>>       124 DW_CFA_offset_extended r108 -320  (40 * -8)
>>=20
>> By contrast devel/powerpc64-gcc does not produce any
>> of those. Is this lack of support of some part of an
>> ABI? Is clang going outside the range of the intended
>> ABI?
>=20
> ABI64BitOpenPOWERv1.1_16July2015_pub.pdf indicates
> that r97-r108 are for vr20-vr31 (AltiVec Registers).
> [Is AltiVec optional --possibly missing?]
>=20
> So the questions translate into questions about
> AltiVec support/handling for C++ exceptions.
>=20
> [Note: R70 is supposed to be specific to CR2.]
>=20
>> Does FreeBSD's libgcc_s design and implementation handle
>> these additional logical registers?
> . . .
>=20
> So the libgcc_s question traces back to: does it
> handle AltiVec Registers vr20-vr31 if they are
> referenced (clang)? Is it well behaved if r97-r108
> are not referenced (powerpc64-gcc)?
>=20
>> Supporting notes:
>>=20
>> r46-r63 are for floating point registers (that
>> have been around for a long time: older
>> powerpc family members).
>=20
> r46-r63 are for f14-f31.
>=20
>> r70 is for having/using the value from "mfcr".
>=20
> Apparently r70 is supposed to be specific to CR2.
>=20
>> r2(?)-r6 are scratch for C++ exception handling.
>> (I originally identified r3-r6. r2 might have a
>> somewhat distinct status?)
>=20
> In normal functions r2-r6 do not get
> DW_CFA_offset_extended_sf or
> DW_CFA_offset entries. They are special
> to some internal exception handling
> routines. (See later.)
>=20
>> r14-r31 are for the normal r14 through r31
>> registers.
>=20
> r97-r108 are for AltiVec Registers vr20-vr31.
>=20
>> r65 is standard and heavily used on all(?)
>> routines, not just some libgcc_s ones. (So
>> r65 is not listed below.)
>=20
> r65 for lr.
>=20
>> In libgcc_s.so.1.full (via powerpc64-gcc):
>>=20
>> uw_update_context_1:           r70
>> _Unwind_RaiseException:        r[2-6],r4[6-9],r5[0-9],r6[0-3],r70
>> _Unwind_RaiseException_Phase2: (nothing special matched)
>> _Unwind_ForcedUnwind:          r[2-6],r4[6-9],r5[0-9],r6[0-3],r70
>> _Unwind_Resume:                r[2-6],r4[6-9],r5[0-9],r6[0-3],r70
>> _Unwind_Resume_or_Rethrow:     r[2-6],r4[6-9],r5[0-9],r6[0-3],r70
>> _Unwind_Backtrace:                    r4[6-9],r5[0-9],r6[0-3],r70
>> __deregister_frame_info_bases: r70
>> _Unwind_Find_FDE:              r70
>=20
> So no AltiVec Registers listed.
>=20
>> In libgcc_s.so.1.full (via clang):
>>=20
>> uw_update_context_1:           r70 (uw_update_context_1 was actually =
later in the file)
>> _Unwind_RaiseException:        =
r4[6-9],r5[0-9],r6[0-3],r70,r9[7-9],r10[0-8]
>> _Unwind_RaiseException_Phase2: r70
>> _Unwind_ForcedUnwind:          =
r4[6-9],r5[0-9],r6[0-3],r70,r9[7-9],r10[0-8]
>> _Unwind_Resume:                =
r4[6-9],r5[0-9],r6[0-3],r70,r9[7-9],r10[0-8]
>> _Unwind_Resume_or_Rethrow:     =
r4[6-9],r5[0-9],r6[0-3],r70,r9[7-9],r10[0-8]
>> _Unwind_Backtrace:             =
r4[6-9],r5[0-9],r6[0-3],r70,r9[7-9],r10[0-8]
>> __deregister_frame_info_bases: (nothing special matched)
>> _Unwind_Find_FDE:              (nothing special matched)
>=20
> So no internal, special-for-excpetion-routines
> scratch register usage listed (r2-r6).
>=20
>> clang is missing all the r[2-6] references but
>> the code generated does have the registers in
>> use. Thrown C++ exceptions crash because of
>> the lack of the r2-r6's, dying on a r3 attempt.
>>=20
> . . .
>>=20
>> I have no clue why _Unwind_RaiseException_Phase2
>> has a r70 for clang but not for powerpc64-gcc.
>> Or the other way around for __deregister_frame_info_bases
>> and _Unwind_Find_FDE.
>>=20
>> Which file's implementations are used from
>> what I can tell :
>>=20
>> uw_update_context_1:           /usr/src/contrib/gcc/unwind-dw2.c
>> _Unwind_RaiseException:        /usr/src/contrib/gcc/unwind.inc
>> _Unwind_RaiseException_Phase2: /usr/src/contrib/gcc/unwind.inc
>> _Unwind_ForcedUnwind:          /usr/src/contrib/gcc/unwind.inc
>> _Unwind_Resume:                /usr/src/contrib/gcc/unwind.inc
>> _Unwind_Resume_or_Rethrow:     /usr/src/contrib/gcc/unwind.inc
>> _Unwind_Backtrace:             /usr/src/contrib/gcc/unwind.inc
>> __deregister_frame_info_bases: /usr/src/contrib/gcc/unwind-dw2-fde.c
>> _Unwind_Find_FDE:              /usr/src/contrib/gcc/unwind-dw2-fde*.c =
(unsure)
>>=20
>> An implication is that GPL Version 2 source code
>> is involved even when clang is the system compiler.
>> Is that what FreeBSD intends for the powerpc
>> families?
>>=20
>> /* Exception handling and frame unwind runtime interface routines. =
-*- C -*-
>>  Copyright (C) 2001, 2003 Free Software Foundation, Inc.
>>=20
>>  This file is part of GCC.
>>=20
>>  GCC is free software; you can redistribute it and/or modify it
>>  under the terms of the GNU General Public License as published by
>>  the Free Software Foundation; either version 2, or (at your option)
>>  any later version.
>>=20
>>  In addition to the permissions in the GNU General Public License, =
the
>>  Free Software Foundation gives you unlimited permission to link the
>>  compiled version of this file into combinations with other programs,
>>  and to distribute those combinations without any restriction coming
>>  from the use of this file.  (The General Public License restrictions
>>  do apply in other respects; for example, they cover modification of
>>  the file, and distribution when not linked into a combined
>>  executable.)
>>=20
>> . . .
>>=20
>> Does libgcc_s.so.1 with its type of use form a "combined executable"?


=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?CF0CE1A7-7AC4-48C8-89EE-D8EABE408DBC>