[llvm-commits] [llvm] r76895 - /llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
Evan Cheng
evan.cheng at apple.com
Thu Jul 23 16:13:29 PDT 2009
Any idea what's the real problem? This patch is just a hack.
Evan
On Jul 23, 2009, at 12:00 PM, Duncan Sands wrote:
> Author: baldrick
> Date: Thu Jul 23 14:00:02 2009
> New Revision: 76895
>
> URL: http://llvm.org/viewvc/llvm-project?rev=76895&view=rev
> Log:
> 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).
>
> Modified:
> llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
>
> Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=76895&r1=76894&r2=76895&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Thu Jul 23
> 14:00:02 2009
> @@ -784,6 +784,29 @@
> 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));
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list