seen in a segfault running the tests in the coinor-osi package, https://launchpad.net/bugs/1263576, both in saucy and trusty, version 0.106.4
and 0.106.5. Version 0.103 doesn't show the issue.
both the 4.7 and 4.8 linaro branches show this behaviour, and trunk 20131121
(didn't build a newer one yet).
William Grant tracked that down to a bug with very negative vcall_offsets in
aarch64 multiple inheritance thunks. The example below has two consecutive
thunks, with the second adding 263 instead of subtracting 264.
aarch64_build_constant seems to not handle negative integers. He tried a quick
gcc patch to avoid using aarch64_build_constant, and the coinor-osi tests succeed.
seen in a segfault running the tests in the coinor-osi package, /launchpad. net/bugs/ 1263576, both in saucy and trusty, version 0.106.4
https:/
and 0.106.5. Version 0.103 doesn't show the issue.
both the 4.7 and 4.8 linaro branches show this behaviour, and trunk 20131121
(didn't build a newer one yet).
William Grant tracked that down to a bug with very negative vcall_offsets in build_constant seems to not handle negative integers. He tried a quick build_constant, and the coinor-osi tests succeed.
aarch64 multiple inheritance thunks. The example below has two consecutive
thunks, with the second adding 263 instead of subtracting 264.
aarch64_
gcc patch to avoid using aarch64_
0000000000401ca4 <_ZTv0_ n256_N1C2adEv> :
401ca4: f9400010 ldr x16, [x0]
401ca8: f8500211 ldr x17, [x16,#-256]
401cac: 8b110000 add x0, x0, x17
401cb0: 17fffff9 b 401c94 <_ZN1C2adEv>
[...]
0000000000401cc4 <_ZTv0_ n264_N1C2aeEv> :
401cc4: f9400010 ldr x16, [x0]
401cc8: d28020f1 mov x17, #0x107 // #263
401ccc: f8716a11 ldr x17, [x16,x17]
401cd0: 8b110000 add x0, x0, x17
401cd4: 17fffff8 b 401cb4 <_ZN1C2aeEv>
Any chance for a quick 2013 review?
Thanks, Matthias
--- a/gcc/config/ aarch64/ aarch64. c aarch64/ aarch64. c build_constant (IP1_REGNUM, vcall_offset); add_constant (IP0_REGNUM, IP1_REGNUM, vcall_offset);
+++ b/gcc/config/
@@ -2540,8 +2540,8 @@
addr = plus_constant (Pmode, temp0, vcall_offset);
else
{
- aarch64_
- addr = gen_rtx_PLUS (Pmode, temp0, temp1);
+ aarch64_
+ addr = temp0;
}