mgrang added a comment. In D53541#1356904 <https://reviews.llvm.org/D53541#1356904>, @rnk wrote:
> In D53541#1353251 <https://reviews.llvm.org/D53541#1353251>, @mgrang wrote: > > > > What about the three stack pointer case of stack realignment plus a > > > dynamic alloca? Typically this is the case where recoverfp is necessary. > > > > @rnk Sorry, I missed your comment earlier. I am not sure what scenario the > > three stack pointer case is. Could you please give me a test case for it? > > > I think you just need a local variable with an alignment greater than the ABI > provides, something like: > > struct Foo { > Foo(); > int x, y, z; > }; > int filter(int); > void may_throw(); > void seh_byval(int n) { > Foo __declspec(align(32)) o; > __try { > may_throw(); > } __except(filter(o.x)) { > } > } > We seem to be generating the same code as MSVC. Here's my test case: struct Foo { void (*ptr)(); int x, y, z; }; int filter(int); void may_throw(); void seh_byval(int n) { struct Foo __declspec(align(32)) o; __try { may_throw(); } __except(filter(o.x)) { } } MSVC: |seh_byval$filt$0| PROC stp fp,lr,[sp,#-0x10]! mov fp,x1 |$LN5@seh_byval$| ldr x8,[fp,#0x10] ldr w0,[x8,#8] bl filter nop |$LN7@seh_byval$| ldp fp,lr,[sp],#0x10 ret LLVM: .seh_proc "?filt$0@0@seh_byval@@" ; %bb.0: ; %entry movz x8, #:abs_g1_s:.Lseh_byval$frame_escape_0 movk x8, #:abs_g0_nc:.Lseh_byval$frame_escape_0 add x8, x1, x8 ldr w0, [x8, #8] b filter CHANGES SINCE LAST ACTION https://reviews.llvm.org/D53541/new/ https://reviews.llvm.org/D53541 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits