mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-07 11:33:44 +00:00
Revert r75581: it causes massive breakage in the Ada
testsuite, due to exception handling not working correctly. Maybe because the libgcc unwinder is miscompiled - not sure, and I won't have time to look into it before leaving on holiday. Note that miscompilations of libgcc are not picked up by the nightly testers, because they dynamically link with libgcc, so pick up the system version rather than the version built as part of llvm-gcc. This is a nasty flaw in the nightly testers. (On the other hand the Ada testsuite links with the just built libgcc). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76895 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bc8d813f71
commit
daf2212e83
@ -784,6 +784,29 @@ void X86RegisterInfo::emitCalleeSavedFrameMoves(MachineFunction &MF,
|
||||
unsigned Reg = I->getReg();
|
||||
Offset = MaxOffset - Offset + saveAreaOffset;
|
||||
|
||||
// Don't output a new machine move if we're re-saving the frame
|
||||
// pointer. This happens when the PrologEpilogInserter has inserted an extra
|
||||
// "PUSH" of the frame pointer -- the "emitPrologue" method automatically
|
||||
// generates one when frame pointers are used. If we generate a "machine
|
||||
// move" for this extra "PUSH", the linker will lose track of the fact that
|
||||
// the frame pointer should have the value of the first "PUSH" when it's
|
||||
// trying to unwind.
|
||||
//
|
||||
// FIXME: This looks inelegant. It's possibly correct, but it's covering up
|
||||
// another bug. I.e., one where we generate a prolog like this:
|
||||
//
|
||||
// pushl %ebp
|
||||
// movl %esp, %ebp
|
||||
// pushl %ebp
|
||||
// pushl %esi
|
||||
// ...
|
||||
//
|
||||
// The immediate re-push of EBP is unnecessary. At the least, it's an
|
||||
// optimization bug. EBP can be used as a scratch register in certain
|
||||
// cases, but probably not when we have a frame pointer.
|
||||
if (HasFP && FramePtr == Reg)
|
||||
continue;
|
||||
|
||||
MachineLocation CSDst(MachineLocation::VirtualFP, Offset);
|
||||
MachineLocation CSSrc(Reg);
|
||||
Moves.push_back(MachineMove(LabelId, CSDst, CSSrc));
|
||||
|
Loading…
Reference in New Issue
Block a user