Date: Sun, 8 Oct 2017 04:34:29 -0700 From: Mark Millard <markmi@dsl-only.net> To: FreeBSD Toolchain <freebsd-toolchain@freebsd.org>, FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>, freebsd-hackers <freebsd-hackers@freebsd.org> Subject: 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: <6FEAEDA2-6036-4FC0-B794-15BC264BD31D@dsl-only.net>
next in thread | raw e-mail | index | archive | help
=46rom 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? Does FreeBSD's libgcc_s design and implementation handle these additional logical registers? (I've no clue what the logical registers r97-r108 are supposed to match up with in powerpc64 terms.) Supporting notes: r46-r63 are for floating point registers (that have been around for a long time: older powerpc family members). r70 is for having/using the value from "mfcr". r2(?)-r6 are scratch for C++ exception handling. (I originally identified r3-r6. r2 might have a somewhat distinct status?) r14-r31 are for the normal r14 through r31 registers. r65 is standard and heavily used on all(?) routines, not just some libgcc_s ones. (So r65 is not listed below.) 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 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) 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 yet what r9[7-9],r10[0-8] are for. _Unwind_Backtrace suggests that none of them are alternate names for scratch registers r[2-6]. 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"? =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?6FEAEDA2-6036-4FC0-B794-15BC264BD31D>