[PATCH] D87371: [MC] [Win64EH] Try to generate packed unwind info where possible

Eli Friedman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 10 18:33:01 PDT 2020


efriedma added a comment.

> the length of the synthesized canonical prologue might differ a little from the actual one maybe

Getting the length wrong has caused miscompiles in the past.



================
Comment at: llvm/lib/MC/MCWin64EH.cpp:933
 
+  if (PackedEpilogOffset == 0 && !info->HandlesExceptions &&
+      FuncLength <= 0x7ff && TryPacked) {
----------------
mstorsjo wrote:
> efriedma wrote:
> > Is it always exactly zero?  Spec says in some cases "No instruction corresponding to mov x29,sp is present in the epilog"
> I'm not entirely sure how to interpret that clause.
> 
> I'm looking at one case, where MSVC generates the following prologue:
> ```
>        0: fd 7b bb a9   stp     x29, x30, [sp, #-80]!
>        4: fd 03 00 91   mov     x29, sp
>        8: ff 43 00 d1   sub     sp, sp, #16
> ```
> However, the final `sub sp, sp, #16` isn't part of the canonical prologue, and this is described as packed unwind info RegI=0, CR=3, FrameSize=80, which llvm-readobj prints as
> ```
>     Prologue [
>       mov x29, sp
>       stp x29, lr, [sp, #-80]!
>       end
>     ]
> ```
> However the actual epilogue of the generated code looks like this:
> ```
>       dc: ff 43 00 91   add     sp, sp, #16
>       e0: fd 7b c5 a8   ldp     x29, x30, [sp], #80
> ```
> 
> (Here, instead of `mov sp, x29` it has `add sp, sp #16`, but it doesn't matter as they're equivalent here.)
> 
> So if unwinding from the body, the prologue is executed, and it starts off by reversing `mov x29, sp` from the prologue. But if choosing to execute the epilogue instead of the prologue, it has to execute that instruction, to get the right stack pointer.
> 
> From testing the unwinder behaviour with RtlVirtualUnwind, it does look like it does execute `mov sp, x29` as part of the epilogue for these cases though, which would make sense.
> 
> 
> So I guess it should be ok to generate packed data if the epilogue is an exact match of the prologue, except for the final `set_fp` opcode - but that wording actually makes me worry more about the cases where the epilogue does contain that opcode (and rely on it). And the docs say
> 
> > Packed unwind data can't be used if a function requires restoration of sp from x29.
> 
> But I'd say that the code generated by MSVC that I quoted does seem to rely on it.
Makes sense.

Maybe we can get a spec clarification for this.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87371/new/

https://reviews.llvm.org/D87371



More information about the llvm-commits mailing list