https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80803
--- Comment #14 from boger at us dot ibm.com ---
I have found the incorrect code that is causing this test to fail but not sure
what causes it. My previous theory was not correct.
The problem is that the second argument being passed to runtime.DeepEqual in
net.TestParseIP is wrong. The storage for the arguments are being generated by
calls to runtime.newobject, followed by code to fill in the contents. The
arguments are slices so should have 3 doublewords including the address and 2
lengths. The first argument is initialized correctly but the second is not
storing the length values. Here is a snippet of code from the bad a.out:
10066158: 69 91 fc 4b bl 1002f2c0
<00003287.plt_call.runtime.newobject>
1006615c: 18 00 41 e8 ld r2,24(r1)
10066160: 10 02 01 e9 ld r8,528(r1)
10066164: 18 02 41 e9 ld r10,536(r1)
10066168: 20 02 21 e9 ld r9,544(r1)
1006616c: f8 01 a1 38 addi r5,r1,504
10066170: 78 1b 72 7c mr r18,r3
10066174: 78 fb e3 7f mr r3,r31
10066178: 78 93 44 7e mr r4,r18
1006617c: f8 01 01 f9 std r8,504(r1)
10066180: 00 02 41 f9 std r10,512(r1)
10066184: 08 02 21 f9 std r9,520(r1)
10066188: d9 92 fc 4b bl 1002f460
<00003287.plt_call.runtime.typedmemmove>
1006618c: 18 00 41 e8 ld r2,24(r1)
10066190: 78 fb e3 7f mr r3,r31
10066194: 2d 91 fc 4b bl 1002f2c0
<00003287.plt_call.runtime.newobject>
10066198: 18 00 41 e8 ld r2,24(r1)
1006619c: e0 01 a1 38 addi r5,r1,480
100661a0: e0 01 c1 fb std r30,480(r1)
100661a4: 78 1b 70 7c mr r16,r3
100661a8: 78 fb e3 7f mr r3,r31
100661ac: 78 83 04 7e mr r4,r16
100661b0: b1 92 fc 4b bl 1002f460
<00003287.plt_call.runtime.typedmemmove>
100661b4: 18 00 41 e8 ld r2,24(r1)
100661b8: 78 fb e5 7f mr r5,r31
100661bc: 78 83 06 7e mr r6,r16
100661c0: 78 fb e3 7f mr r3,r31
100661c4: 78 93 44 7e mr r4,r18
100661c8: 49 9b fc 4b bl 1002fd10
<00003287.plt_call.reflect.DeepEqual>
In gdb I can see that the length field in the slice passed to DeepEqual and
then deepValueEqual is 0 causing them to appear not equal, and the length 0
causes other problems later on.
I tried to reproduce this in a small testcase but it did not fail. In that
case the code looks like this:
10002c48: 19 f9 ff 4b bl 10002560
<000000be.plt_call.runtime.newobject>
10002c4c: 18 00 41 e8 ld r2,24(r1)
10002c50: 78 1b 69 7c mr r9,r3
10002c54: c0 02 3f f9 std r9,704(r31)
10002c58: 48 03 1f e9 ld r8,840(r31)
10002c5c: 50 03 5f e9 ld r10,848(r31)
10002c60: 58 03 3f e9 ld r9,856(r31)
10002c64: a8 02 1f f9 std r8,680(r31)
10002c68: b0 02 5f f9 std r10,688(r31)
10002c6c: b8 02 3f f9 std r9,696(r31)
10002c70: c0 02 3f e9 ld r9,704(r31)
10002c74: a8 02 5f 39 addi r10,r31,680
10002c78: 78 53 45 7d mr r5,r10
10002c7c: 78 4b 24 7d mr r4,r9
10002c80: 58 80 62 e8 ld r3,-32680(r2)
10002c84: fd fa ff 4b bl 10002780
<000000be.plt_call.runtime.typedmemmove>
10002c88: 18 00 41 e8 ld r2,24(r1)
10002c8c: c0 02 3f e9 ld r9,704(r31)
10002c90: 78 4b 33 7d mr r19,r9
10002c94: 58 80 82 ea ld r20,-32680(r2)
10002c98: 58 80 62 e8 ld r3,-32680(r2)
10002c9c: c5 f8 ff 4b bl 10002560
<000000be.plt_call.runtime.newobject>
10002ca0: 18 00 41 e8 ld r2,24(r1)
10002ca4: 78 1b 69 7c mr r9,r3
10002ca8: a0 02 3f f9 std r9,672(r31)
10002cac: c8 02 1f e9 ld r8,712(r31)
10002cb0: d0 02 5f e9 ld r10,720(r31)
10002cb4: d8 02 3f e9 ld r9,728(r31)
10002cb8: 88 02 1f f9 std r8,648(r31)
10002cbc: 90 02 5f f9 std r10,656(r31)
10002cc0: 98 02 3f f9 std r9,664(r31)
10002cc4: a0 02 3f e9 ld r9,672(r31)
10002cc8: 88 02 5f 39 addi r10,r31,648
10002ccc: 78 53 45 7d mr r5,r10
10002cd0: 78 4b 24 7d mr r4,r9
10002cd4: 58 80 62 e8 ld r3,-32680(r2)
10002cd8: a9 fa ff 4b bl 10002780
<000000be.plt_call.runtime.typedmemmove>
10002cdc: 18 00 41 e8 ld r2,24(r1)
10002ce0: a0 02 3f e9 ld r9,672(r31)
10002ce4: 78 4b 35 7d mr r21,r9
10002ce8: 78 a3 85 7e mr r5,r20
10002cec: 78 ab a6 7e mr r6,r21
10002cf0: 78 93 43 7e mr r3,r18
10002cf4: 78 9b 64 7e mr r4,r19
10002cf8: 19 f8 ff 4b bl 10002510
<000000be.plt_call.reflect.DeepEqual>