Bug 857236
Summary: | Incorrect "dead code" elimination in 4.7.0 | ||||||
---|---|---|---|---|---|---|---|
Product: | [Fedora] Fedora | Reporter: | Tom Lane <tgl> | ||||
Component: | glibc | Assignee: | Jeff Law <law> | ||||
Status: | CLOSED RAWHIDE | QA Contact: | Fedora Extras Quality Assurance <extras-qa> | ||||
Severity: | unspecified | Docs Contact: | |||||
Priority: | unspecified | ||||||
Version: | 17 | CC: | fweimer, hhorak, jakub, law, pfrankli, schwab, spoyarek | ||||
Target Milestone: | --- | ||||||
Target Release: | --- | ||||||
Hardware: | x86_64 | ||||||
OS: | Unspecified | ||||||
Whiteboard: | |||||||
Fixed In Version: | Doc Type: | Bug Fix | |||||
Doc Text: | Story Points: | --- | |||||
Clone Of: | Environment: | ||||||
Last Closed: | 2012-09-14 17:55:05 UTC | Type: | Bug | ||||
Regression: | --- | Mount Type: | --- | ||||
Documentation: | --- | CRM: | |||||
Verified Versions: | Category: | --- | |||||
oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |||||
Cloudforms Team: | --- | Target Upstream Version: | |||||
Embargoed: | |||||||
Attachments: |
|
That is a glibc bug. While in setjmp.h the __sigsetjmp prototype is properly marked as non-leaf: extern int __sigsetjmp (struct __jmp_buf_tag __env[1], int __savemask) __THROWNL; in pthread.h it is incorrectly marked as leaf: extern int __sigsetjmp (struct __jmp_buf_tag *__env, int __savemask) __THROW; When pthread.h is fixed, the testcase works properly. Ho ... no wonder I had a feeling of deja vu about this. Isn't this the same as bug #752905? How did that manage to sneak back in? Because sigsetjmp is prototyped in two different places. Only one got fixed the first time around :( Fixed in f17, f18 (and rawhide shortly). Build spinning. glibc-2.16-14.fc18 has been submitted as an update for Fedora 18. https://admin.fedoraproject.org/updates/glibc-2.16-14.fc18 glibc-2.15-57.fc17 has been submitted as an update for Fedora 17. https://admin.fedoraproject.org/updates/glibc-2.15-57.fc17 glibc-2.16-15.fc18 has been submitted as an update for Fedora 18. https://admin.fedoraproject.org/updates/glibc-2.16-15.fc18 glibc-2.16-15.fc18 has been pushed to the Fedora 18 stable repository. If problems still persist, please make note of it in this bug report. glibc-2.15-57.fc17 has been pushed to the Fedora 17 stable repository. If problems still persist, please make note of it in this bug report. |
Created attachment 612643 [details] plperlbug.c Description of problem: gcc 4.7.0 incorrectly compiles the attached code. It removes the assignment to current_call_data at line 28. I suppose that some part of it is thinking that's dead code because of the other assignment at line 33. But it is not dead code, because pg_re_throw() is not declared "leaf" nor "nothrow" (and in fact, in the real postgresql code this is extracted from, it does do a longjmp). What is truly bizarre is that if you remove the inclusion of perl.h, the error goes away. I don't know what perl.h might contain that would affect this. Version-Release number of selected component (if applicable): gcc-4.7.0-5.fc17.x86_64 perl-devel-5.14.2-212.fc17.x86_64 How reproducible: 100% Steps to Reproduce: 1. gcc -O1 -S -I/usr/lib64/perl5/CORE plperlbug.c 2. examine produced assembly code. Actual results: current_call_data is restored only in the non-longjmp path. Expected results: Should assign to current_call_data just before pg_re_throw call.