Red Hat Bugzilla – Bug 490509
GCC register allocation wrongly using ebp
Last modified: 2009-04-02 05:20:39 EDT
Created attachment 335390 [details]
Preprocessed gcc output
Description of problem:
Version-Release number of selected component (if applicable):
gcc version 4.4.0 20090313 (Red Hat 4.4.0-0.26) (GCC)
Steps to Reproduce:
1. Compile qemu on an i386 host (./configure --target-list=i386-softmmu; make)
3. See a segfault
QEMU runs. Sorry for not having a smaller test case for this
This works with older versions of gcc, including 4.3. I'm attaching to this BZ a copy of the preprocessed version of the culprit file (op_helper.c)
If you look closely, you'll see:
register struct CPUX86State *env asm("ebp");
Meaning gcc should not touch it, since it is a global var (or touch it and save it later). The generated object code has something like this:
b1a3: 09 e8 or %ebp,%eax
b1a5: 89 d5 mov %edx,%ebp
which seems invalid to me.
Created attachment 335419 [details]
Patch that fixes the bug
Here's a patch that seems to fix the problem. Still requires further testing.
When tested, are you going to submit it to gcc-patches together with a testcase (if a small testcase is distillable)? Thanks.
Yup. I'm not sure about a testcase, though. Register allocation testcases are too fragile, even for glaring errors like this.
Patch proposed upstream:
This should be fixed in 4.4.0-0.29 and above.