1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- # REQUIRES: x86, linux
- # RUN: %{build} -target x86_64-unknown-linux-gnu
- # RUN: %{run}
- # The following assembly is a translation of this code:
- #
- # _Unwind_Reason_Code callback(int, _Unwind_Action, long unsigned int,
- # _Unwind_Exception*, _Unwind_Context*, void*) {
- # return _Unwind_Reason_Code(0);
- # }
- #
- # int main() {
- # asm(".cfi_remember_state\n\t");
- # _Unwind_Exception exc;
- # _Unwind_ForcedUnwind(&exc, callback, 0);
- # asm(".cfi_restore_state\n\t");
- # }
- #
- # When unwinding, the CFI parser will stop parsing opcodes after the current PC,
- # so in this case the DW_CFA_restore_state opcode will never be processed and,
- # if the library doesn't clean up properly, the store allocated by
- # DW_CFA_remember_state will be leaked.
- #
- # This test will fail when linked with an asan-enabled libunwind if the
- # remembered state is leaked.
- SIZEOF_UNWIND_EXCEPTION = 32
- .text
- callback:
- xorl %eax, %eax
- retq
- .globl main # -- Begin function main
- .p2align 4, 0x90
- .type main,@function
- main: # @main
- .cfi_startproc
- subq $8, %rsp # Adjust stack alignment
- subq $SIZEOF_UNWIND_EXCEPTION, %rsp
- .cfi_def_cfa_offset 48
- .cfi_remember_state
- movq %rsp, %rdi
- movabsq $callback, %rsi
- xorl %edx, %edx
- callq _Unwind_ForcedUnwind
- .cfi_restore_state
- xorl %eax, %eax
- addq $SIZEOF_UNWIND_EXCEPTION, %rsp
- addq $8, %rsp # Undo stack alignment adjustment
- .cfi_def_cfa_offset 8
- retq
- .Lfunc_end1:
- .size main, .Lfunc_end1-main
- .cfi_endproc
- # -- End function
|