m68k_output_mi_thunk generats an adjustment of the first parameter on the stack and calls off to the target function. This adjustment is done using addq/subq for values in the range of 1-8, but fo values outside that range, it generates 'add.l #<imm>,4(%sp)' which is valid for m68k, but invalid for ColdFire. The suggested fix for ColdFire is to load the value into %d0, and *then* emit 'add.l %d0,4(%sp)'. The following code triggers this bug when compiled with: m68k-elf-g++ -m5307 -O class FooA { public: virtual ~FooA () = 0; int data[100]; }; class FooB { public: virtual void foo1 () = 0; void fooB () {foo1 ();} int data[100]; }; class FooC : public FooA, public FooB { public: virtual void foo1 () {} }; FooC* Test () { FooC* foc = new FooC; foc->fooB (); }
Confirmed, patch is around somewhere, I cannot find it right now (but I am not trying too hard).
The patch for this can be found at: http://gcc.gnu.org/ml/gcc/2004-05/msg01353.html
OK for 3 4.1.
Subject: Bug 15782 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_4-branch Changes by: bernie@gcc.gnu.org 2004-06-03 04:02:49 Modified files: gcc : ChangeLog gcc/config/m68k: m68k.c Log message: PR target/15782 * config/m68k/m68k.c(m68k_output_mi_thunk): For ColdFire, use %d0 as a scratch to perform an add to memory. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=2.2326.2.465&r2=2.2326.2.466 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/m68k/m68k.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.123.2.1&r2=1.123.2.2
Patch installed in both mailine and gcc-3_4-branch.