Skip site navigation (1)Skip section navigation (2)
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>