On 2016-Feb-19, at 11:37 AM, Mark Millard <[email protected]> wrote:
> The following program does not work for my example TARGET_ARCH=powerpc and
> TARGET_ARCH=powerpc64 environments for buildworld based on
> projects/clang380-import -r205601:
>
> #include <exception>
>
> int main(void)
> {
> try { throw std::exception(); }
> catch (std::exception& e) {} // same result without &
> return 0;
> }
>
> The details vary for what happens and what compiler is in use.
>
> TARGET_ARCH=powerpc with clang 3.8.0: SEGV
>
> TARGET_ARCH=powerpc64 with devel/powerpc64-gcc: unbouded loop in
> _Unwind_RaiseException
>
> For the powerpc64 context: g++49 can be used to show the problem as well:
>
> Using g++49's a.out gets the same unbounded loop result for:
>
> # g++49 -I /usr/include/c++/v1/ -L /usr/lib/ -g -Wall -pedantic
> exception_test.cpp
>
>
> But the a.out works fine for a normal g++49 header/library usage:
>
> # g++49 -g -Wall -pedantic exception_test.cpp
> # ./a.out
> #
>
>
>
> (These were noticed by trying to build and use kyua to run the /usr/tests
> material in tehse enviroments.)
>
>
> ===
> Mark Millard
> markmi at dsl-only.net
[Note: The _Unwind_RaiseException involved below was compiled by clang 3.8.0
during buildworld. So clang generated the .eh_frame information involved.]
In the TARGET_ARCH=powerpc operation there are a sequence of 2 errors, the 2nd
of which gets the SEGV:
A) The catch clause is rejected/ignored so std::terminate is called
B) During the std::terminate related execution the SEGV happens.
(A) is the more fundamental issue.
I have found the following mismatch between some powerpc code generated and the
.eh_frame information generated by clang 3.8.0 for the TARGET_ARCH=powerpc
context. (Using objdump and dwarfdump notation below, no relocations.) The
specific example need not be directly involved in (A) or (B) but is inaccurate
.eh_frame generation either way.
> 00007fd8 <_Unwind_RaiseException> mflr r0
> 00007fdc <_Unwind_RaiseException+0x4> stw r31,-148(r1)
> 00007fe0 <_Unwind_RaiseException+0x8> stw r30,-152(r1)
> 00007fe4 <_Unwind_RaiseException+0xc> stw r0,4(r1)
> 00007fe8 <_Unwind_RaiseException+0x10> stwu r1,-2992(r1)
> 00007fec <_Unwind_RaiseException+0x14> mr r31,r1
> 00007ff0 <_Unwind_RaiseException+0x18> mfcr r12
> . . .
> 0000827c <_Unwind_RaiseException+0x2a4> lwz r14,2776(r31)
> 00008280 <_Unwind_RaiseException+0x2a8> addi r1,r1,2992
> 00008284 <_Unwind_RaiseException+0x2ac> lwz r0,4(r1)
> 00008288 <_Unwind_RaiseException+0x2b0> lwz r31,-148(r1)
> 0000828c <_Unwind_RaiseException+0x2b4> lwz r30,-152(r1)
> 00008290 <_Unwind_RaiseException+0x2b8> mtlr r0
> 00008294 <_Unwind_RaiseException+0x2bc> blr
> 00008298 <_Unwind_RaiseException+0x2c0> bl 0001eccc <abort@plt>
The .eh_frame information shown by dwarfdump (see later below) shows off
cfa=2992(r31) over the range starting at 0x00007ff0 but 0x828c to 0x8298 comes
after R31 is returned to its old value. (The range goes up to 0x0000829c, which
is the start of the next block of addresses.)
<off cfa=2992(r31) > is just wrong at 0000828c and later above.
(I'm not going to make claims here about 0x00007ff0 below listing both <off
cfa=2992(r31) > and <off r31=-148(cfa) > or how such is handled. But it would
seem that cfa=?(r31)'s interpretation would need to ignore any prior or same
line r31=?(cfa). Either way it is generally wrong once cfa itself is
inaccurate, as it is at 0000828c.)
The dwarfdump -v -v -F material for this is:
> < 0><0x00007fd8:0x0000829c><><fde offset 0x000002b4 length: 0x00000064><eh
> aug data len 0x0>
> 0x00007fd8: <off cfa=00(r1) >
> 0x00007fec: <off cfa=2992(r1) > <off r30=-152(cfa) > <off
> r31=-148(cfa) > <off r65=04(cfa) >
> 0x00007ff0: <off cfa=2992(r31) > <off r14=-216(cfa) > <off
> r15=-212(cfa) > <off r16=-208(cfa) > <off r17=-204(cfa) > <off r18=-200(cfa)
> > <off r19=-196(cfa) > <off r20=-192(cfa) > <off r21=-188(cfa) > <off
> r22=-184(cfa) > <off r23=-180(cfa) > <off r24=-176(cfa) > <off r25=-172(cfa)
> > <off r26=-168(cfa) > <off r27=-164(cfa) > <off r28=-160(cfa) > <off
> r29=-156(cfa) > <off r30=-152(cfa) > <off r31=-148(cfa) > <off r46=-144(cfa)
> > <off r47=-136(cfa) > <off r48=-128(cfa) > <off r49=-120(cfa) > <off
> r50=-112(cfa) > <off r51=-104(cfa) > <off r52=-96(cfa) > <off r53=-88(cfa) >
> <off r54=-80(cfa) > <off r55=-72(cfa) > <off r56=-64(cfa) > <off r57=-56(cfa)
> > <off r58=-48(cfa) > <off r59=-40(cfa) > <off r60=-32(cfa) > <off
> r61=-24(cfa) > <off r62=-16(cfa) > <off r63=-8(cfa) > <off r65=04(cfa) >
> fde section offset 692 0x000002b4 cie offset for fde: 696 0x000002b8
> 0 DW_CFA_advance_loc 20 (5 * 4)
> 1 DW_CFA_def_cfa_offset 2992
> 4 DW_CFA_offset r31 -148 (37 * -4)
> 6 DW_CFA_offset r30 -152 (38 * -4)
> 8 DW_CFA_offset_extended_sf r65 4 (-1 * -4)
> 11 DW_CFA_advance_loc 4 (1 * 4)
> 12 DW_CFA_def_cfa_register r31
> 14 DW_CFA_offset r14 -216 (54 * -4)
> 16 DW_CFA_offset r15 -212 (53 * -4)
> 18 DW_CFA_offset r16 -208 (52 * -4)
> 20 DW_CFA_offset r17 -204 (51 * -4)
> 22 DW_CFA_offset r18 -200 (50 * -4)
> 24 DW_CFA_offset r19 -196 (49 * -4)
> 26 DW_CFA_offset r20 -192 (48 * -4)
> 28 DW_CFA_offset r21 -188 (47 * -4)
> 30 DW_CFA_offset r22 -184 (46 * -4)
> 32 DW_CFA_offset r23 -180 (45 * -4)
> 34 DW_CFA_offset r24 -176 (44 * -4)
> 36 DW_CFA_offset r25 -172 (43 * -4)
> 38 DW_CFA_offset r26 -168 (42 * -4)
> 40 DW_CFA_offset r27 -164 (41 * -4)
> 42 DW_CFA_offset r28 -160 (40 * -4)
> 44 DW_CFA_offset r29 -156 (39 * -4)
> 46 DW_CFA_offset r30 -152 (38 * -4)
> 48 DW_CFA_offset r31 -148 (37 * -4)
> 50 DW_CFA_offset r46 -144 (36 * -4)
> 52 DW_CFA_offset r47 -136 (34 * -4)
> 54 DW_CFA_offset r48 -128 (32 * -4)
> 56 DW_CFA_offset r49 -120 (30 * -4)
> 58 DW_CFA_offset r50 -112 (28 * -4)
> 60 DW_CFA_offset r51 -104 (26 * -4)
> 62 DW_CFA_offset r52 -96 (24 * -4)
> 64 DW_CFA_offset r53 -88 (22 * -4)
> 66 DW_CFA_offset r54 -80 (20 * -4)
> 68 DW_CFA_offset r55 -72 (18 * -4)
> 70 DW_CFA_offset r56 -64 (16 * -4)
> 72 DW_CFA_offset r57 -56 (14 * -4)
> 74 DW_CFA_offset r58 -48 (12 * -4)
> 76 DW_CFA_offset r59 -40 (10 * -4)
> 78 DW_CFA_offset r60 -32 (8 * -4)
> 80 DW_CFA_offset r61 -24 (6 * -4)
> 82 DW_CFA_offset r62 -16 (4 * -4)
> 84 DW_CFA_offset r63 -8 (2 * -4)
> 86 DW_CFA_nop
===
Mark Millard
markmi at dsl-only.net
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
To unsubscribe, send any mail to "[email protected]"