On i386, combining -regparm=3 with nested functions results in %ecx (holding
the third function parameter because of -regparm=3) being overwritten with a
temporary pointer used by GCC to implement the nested function call.
GNU GRUB has had a workaround (disabling -regparm in a case-by-case basis) to
this bug for a long while. It's only been brought up to me recently that we
had this problem (I'm one of the GRUB maintainers).
One of the GRUB developers (Bean) produced a test case. I'm attaching it here.
--
Summary: %ecx corruption when combining -regparm=3 with nested
functions
Product: gcc
Version: 4.5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: rmh at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41246