| #===------------------------------------------------------------------------===# | 
 | # | 
 | # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | # See https://llvm.org/LICENSE.txt for license information. | 
 | # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | # | 
 | #===------------------------------------------------------------------------===# | 
 |  | 
 | # REQUIRES: target={{x86_64-.+-linux-gnu}} | 
 |  | 
 | # Inline assembly isn't supported by Memory Sanitizer | 
 | # UNSUPPORTED: msan | 
 |  | 
 | # RUN: %{build} -no-pie | 
 | # 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 |