[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