[Bug 207325] projects/clang380-import for TARGET_ARCH=powerpc : c++ exceptions cause SEGV (9 line program)
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Fri Feb 26 22:04:28 UTC 2016
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=207325
--- Comment #4 from Mark Millard <markmi at dsl-only.net> ---
I have found the following mismatch between the powerpc code generated and the
.eh_frame information generated by clang 3.8.0. (Using objdump and dwarfdump
notation below, no relocations.)
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 at plt>
The .eh_frame information shows off cfa=2992(r31) over that whole range but
0x828c to 0x8298 comes after R31 is returned to its old value. (See below.)
Also with <off cfa=2992(r31) > for 0x00007ff0 it also lists: <off r31=-148(cfa)
> for 0x00007ff0.
In other words:
DW_CFA_offset r31 -148 (37 * -4)
is used as if cfa was not tied to r31's value via <off cfa=2992(r31) >.
The dwarfdump 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
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list