Another ABI variation/violation. I top post them because it is largely separate from the AltiVec Registers issue and is probably more important.
Summary: Lack of r2-r6 save/restore (and so its matching DW_CFA_<?> material) so lack of places for the like of _Unwind_SetGR to work with. More detail: Beyond the AltiVec Registers issue it turns out that for: _Unwind_RaiseException _Unwind_ForcedUnwind _Unwind_Resume _Unwind_Resume_or_Rethrow the code generation from clang 5 for them does not save/restore the ABI's "scratch registers" involved in the exception handling: r2-r6. But they are in the code from powerpc64-gcc. In FreeBSD's libgcc_s.so.1 and libcxxrt.so.1 terms: This means that _Unwind_SetGR and _Unwind_GetGR have no place to set or access the value of the r2-r6 GR in question. It currently crashes as the first attempt, which happens to be for setting r3 (as a scratch value). This in turn prevents __gxx_personality_v0 from working. That in turn prevents throwing exceptions from working. Without the code generation, it makes sense to not have the DW_CFA_<?>'s as well. The code generation (or lack of it) is a bigger deal. It appears that in this area clang 5 simply does not currently match the ABI that powerpc64-gcc is generating code for and that FreeBSD's libgcc_s.so.1 and libcxxrt.so.1 are designed for. That is why throwing a C++ exception gets the failure at: Loaded symbols for /libexec/ld-elf.so.1 #0 0x0000000050530c20 in _Unwind_SetGR (context=<value optimized out>, index=<value optimized out>, val=1342447712) at unwind-dw2-fde.h:162 162 { (gdb) bt #0 0x0000000050530c20 in _Unwind_SetGR (context=<value optimized out>, index=<value optimized out>, val=1342447712) at unwind-dw2-fde.h:162 #1 0x0000000050190194 in __gxx_personality_v0 (version=<value optimized out>, actions=<value optimized out>, exceptionClass=<value optimized out>, exceptionObject=0x50042060, context=0xffffffffffffcc70) at /usr/src/contrib/libcxxrt/exception.cc:1203 #2 0x0000000050531a60 in _Unwind_RaiseException_Phase2 (exc=0x50042060, context=0xffffffffffffcc70) at unwind.inc:66 #3 0x0000000050531548 in _Unwind_RaiseException (exc=<value optimized out>) at unwind.inc:135 #4 0x000000005018f4f4 in __cxa_throw (thrown_exception=<value optimized out>, tinfo=<value optimized out>, dest=<value Clang does save and restore other special registers (special in DW_CFA_<?> terms): In libgcc_s.so.1.full (via clang): 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) By contrast for powerpc64-gcc: In libgcc_s.so.1.full (via powerpc64-gcc): 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 On 2017-Oct-8, at 2:24 PM, Mark Millard <markmi at dsl-only.net> wrote: > 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).] >> >> On 2017-Oct-8, at 4:34 AM, Mark Millard <markmi at dsl-only.net> wrote: >> >>> From a dwarfdump's _Unwind_RaiseException information >>> from a clang/clang++ 5 based compile: >>> >>> 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) >>> >>> 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? >> >> ABI64BitOpenPOWERv1.1_16July2015_pub.pdf indicates >> that r97-r108 are for vr20-vr31 (AltiVec Registers). >> [Is AltiVec optional --possibly missing?] >> >> So the questions translate into questions about >> AltiVec support/handling for C++ exceptions. >> >> [Note: R70 is supposed to be specific to CR2.] >> >>> Does FreeBSD's libgcc_s design and implementation handle >>> these additional logical registers? >> . . . >> >> 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)? >> >>> Supporting notes: >>> >>> r46-r63 are for floating point registers (that >>> have been around for a long time: older >>> powerpc family members). >> >> r46-r63 are for f14-f31. >> >>> r70 is for having/using the value from "mfcr". >> >> Apparently r70 is supposed to be specific to CR2. >> >>> r2(?)-r6 are scratch for C++ exception handling. >>> (I originally identified r3-r6. r2 might have a >>> somewhat distinct status?) >> >> 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.) >> >>> r14-r31 are for the normal r14 through r31 >>> registers. >> >> r97-r108 are for AltiVec Registers vr20-vr31. >> >>> r65 is standard and heavily used on all(?) >>> routines, not just some libgcc_s ones. (So >>> r65 is not listed below.) >> >> r65 for lr. >> >>> In libgcc_s.so.1.full (via powerpc64-gcc): >>> >>> 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 >> >> So no AltiVec Registers listed. >> >>> In libgcc_s.so.1.full (via clang): >>> >>> 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) >> >> So no internal, special-for-excpetion-routines >> scratch register usage listed (r2-r6). >> >>> 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. >>> >> . . . >>> >>> 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. >>> >>> Which file's implementations are used from >>> what I can tell : >>> >>> 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) >>> >>> 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? >>> >>> /* Exception handling and frame unwind runtime interface routines. -*- C -*- >>> Copyright (C) 2001, 2003 Free Software Foundation, Inc. >>> >>> This file is part of GCC. >>> >>> 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. >>> >>> 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.) >>> >>> . . . >>> >>> Does libgcc_s.so.1 with its type of use form a "combined executable"? === Mark Millard markmi at dsl-only.net _______________________________________________ freebsd-toolchain@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain To unsubscribe, send any mail to "freebsd-toolchain-unsubscr...@freebsd.org"