[llvm-commits] [PATH] Fix unwind info in x86 JIT for functions without stack space

Bill Wendling isanbard at gmail.com
Sun Aug 2 04:48:11 PDT 2009


On Jul 31, 2009, at 10:56 AM, Zoltan Varga wrote:
> Hi,
>
> This is a resend of a patch sent earlier which got lost in the ml  
> traffic.
>
>   The x86 jit doesn't generate a def_cfa_offset unwind instruction  
> after the
> pushes in the function prolog if the function doesn't
>
> have any stack space, i.e. for a prolog like:
>
> 0x40011870:     push %r15
>
> 0x40011872:     push %r14
>
> 0x40011874:     push %rbx
>
> The attached patch fixes this.
>
Hi Zoltan,

(Sorry it took me a while to look at this email.)

I don't think that this patch is the correct solution. The unwind info  
for callee-saved registers should be emitted in this code:

   // Skip the callee-saved push instructions.
   bool RegsSaved = false;
   while (MBBI != MBB.end() &&
          (MBBI->getOpcode() == X86::PUSH32r ||
           MBBI->getOpcode() == X86::PUSH64r)) {
     RegsSaved = true;
     ++MBBI;
   }

   if (RegsSaved && needsFrameMoves) {
     // Mark end of callee-saved push instructions.
     unsigned LabelId = MMI->NextLabelID();
     BuildMI(MBB, MBBI, DL, TII.get(X86::DBG_LABEL)).addImm(LabelId);

     // Emit DWARF info specifying the offsets of the callee-saved  
registers.
     emitCalleeSavedFrameMoves(MF, LabelId, HasFP ? FramePtr :  
StackPtr);
   }

The code you modified is placing a label/machine-move after the "subl  
X, %esp" instruction when there isn't a frame pointer. (N.B., this  
instruction won't exist if NumBytes == 0.)

Do you have a code example for me to look at?

-bw




More information about the llvm-commits mailing list