[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