http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60008
Bug ID: 60008 Summary: x86_64: Segmentation fault if compiled with -fcall-saved-rdi -O2 --coverage Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: gcov-profile Assignee: unassigned at gcc dot gnu.org Reporter: peter.oberparleiter at de dot ibm.com Programs compiled on x86_64 with GCC and options "-fcall-saved-rdi -O2 --coverage" cause a segmentation fault. Minimal test case: echo "int main() { return 0; }" | gcc -xc - -o /tmp/test --coverage -O2 -fcall-saved-rdi && /tmp/test Release: - gcc version 4.9.0 20140116 (experimental) [master revision c334d99:760dcd4:018db0b6e750f01880f0d601e1cf167948f55ab5] (GCC) Configured with: configure --prefix=gcc-head-install --enable-shared --with-system-zlib --enable-threads=posix --enable-__cxa_atexit --enable-checking --enable-gnu-indirect-function --program-suffix=-4.9.0 --with-as=binutils/install/bin/as --with-ld=binutils/install/bin/ld --enable-languages=c Also found on: - gcc version 4.8.2 20131212 (Red Hat 4.8.2-7) (GCC) - gcc version 4.7.2 (Debian 4.7.2-5) - gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) Environment: GNU/Linux Additional information: The cause for the segmentation fault can be found when comparing the generated constructor functions: gcc --coverage -O2 -fcall-saved-rdi 0000000000400c10 <_GLOBAL__I_65535_0_main>: 400c10: 57 push %rdi 400c11: 5f pop %rdi 400c12: e9 09 00 00 00 jmpq 400c20 <__gcov_init> -> Nothing is loaded into %rdi, __gcov_init() accesses random memory gcc --coverage -O2 0000000000400c10 <_GLOBAL__I_65535_0_main>: 400c10: 48 83 ec 08 sub $0x8,%rsp 400c14: bf 60 2a 60 00 mov $0x602a60,%edi 400c19: 48 83 c4 08 add $0x8,%rsp 400c1d: e9 0e 00 00 00 jmpq 400c30 <__gcov_init> -> %rdi contains pointer to gcov_info structure when __gcov_init() is called gcc --coverage -fcall-saved-rdi 0000000000400c11 <_GLOBAL__I_65535_0_main>: 400c11: 55 push %rbp 400c12: 48 89 e5 mov %rsp,%rbp 400c15: 57 push %rdi 400c16: 48 83 ec 08 sub $0x8,%rsp 400c1a: bf 80 2a 60 00 mov $0x602a80,%edi 400c1f: e8 0c 00 00 00 callq 400c30 <__gcov_init> 400c24: 48 83 c4 08 add $0x8,%rsp 400c28: 5f pop %rdi 400c29: c9 leaveq 400c2a: c3 retq -> %rdi contains pointer to gcov_info structure when __gcov_init() is called