[m68k]: patch to fix m68k_output_mi_thunk() for ColdFire
Peter Jakubek
peter@lasergraph-dsp.de
Wed Jun 2 09:11:00 GMT 2004
Mark Mitchell wrote:
>> Bernardo Innocenti wrote:
>>
>> Mark, I believe this patch is also needed on 3.4.
>> Without it, GCC may output invalid code for
>> ColdFire targets.
>>
>> I can't find a specific PR, but I may file one if needed.
>
> Please file a PR demonstrating the problem and attach the patch
> to it (or include a URL), and target the patch for 3.4.1.
>
Yes, the patch is needed for gcc 3.4 as well. here is code that
allows to reproduce the problem.
target m68k-elf, compile with -m5307:
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 ();
}
The thunk comes into play when FooB::fooB () calls the virtual
function foo1. While in FooB::fooB () the this pointer points
to FooB. Then when foo1 is called (which is overwridden by
FooC::foo1), the this pointer needs to be adjusted to point
to FooC, which is -404 in this example (the size of FooA).
Without the patch gcc generates "add.l #-404,4(%sp)" which is
not supported by ColdFire and rejected by the assembler.
I hope this helps,
Peter Jakubek
LaserAnimation Sollinger GmbH
peter@lasergraph-dsp.de
More information about the Gcc
mailing list