| #===------------------------------------------------------------------------===# | |
| # | |
| # 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 |