From dc7eb3e023e34adc9d40e93626467cfe22756f4c Mon Sep 17 00:00:00 2001 From: Jim Grosbach Date: Fri, 8 Nov 2013 22:33:06 +0000 Subject: X86: Assembly files with .cfi_cfa_def shouldn't hit llvm_unreachable() On darwin, when trying to create compact unwind info, a .cfi_cfa_def directive would case an llvm_unreachable() to be hit. Back off when we see this directive and generate the regular DWARF style eh_frame. rdar://15406518 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194285 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/MC/X86/cfi_def_cfa-crash.s | 73 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 test/MC/X86/cfi_def_cfa-crash.s (limited to 'test/MC') diff --git a/test/MC/X86/cfi_def_cfa-crash.s b/test/MC/X86/cfi_def_cfa-crash.s new file mode 100644 index 0000000000..9d22d6e281 --- /dev/null +++ b/test/MC/X86/cfi_def_cfa-crash.s @@ -0,0 +1,73 @@ +// RUN: llvm-mc -triple x86_64-apple-darwin -filetype=obj %s -o - | macho-dump | FileCheck %s + +// We were trying to generate compact unwind info for assembly like this. +// The .cfi_def_cfa directive, however, throws a wrench into that and was +// causing an llvm_unreachable() failure. Make sure the assembler can handle +// the input. The actual eh_frames created using these directives are checked +// elsewhere. This test is a simpler "does the code assemble" check. + +// rdar://15406518 + +.macro SaveRegisters + + push %rbp + .cfi_def_cfa_offset 16 + .cfi_offset rbp, -16 + + mov %rsp, %rbp + .cfi_def_cfa_register rbp + + sub $$0x80+8, %rsp + + movdqa %xmm0, -0x80(%rbp) + push %rax + movdqa %xmm1, -0x70(%rbp) + push %rdi + movdqa %xmm2, -0x60(%rbp) + push %rsi + movdqa %xmm3, -0x50(%rbp) + push %rdx + movdqa %xmm4, -0x40(%rbp) + push %rcx + movdqa %xmm5, -0x30(%rbp) + push %r8 + movdqa %xmm6, -0x20(%rbp) + push %r9 + movdqa %xmm7, -0x10(%rbp) + +.endmacro +.macro RestoreRegisters + + movdqa -0x80(%rbp), %xmm0 + pop %r9 + movdqa -0x70(%rbp), %xmm1 + pop %r8 + movdqa -0x60(%rbp), %xmm2 + pop %rcx + movdqa -0x50(%rbp), %xmm3 + pop %rdx + movdqa -0x40(%rbp), %xmm4 + pop %rsi + movdqa -0x30(%rbp), %xmm5 + pop %rdi + movdqa -0x20(%rbp), %xmm6 + pop %rax + movdqa -0x10(%rbp), %xmm7 + + leave + .cfi_def_cfa rsp, 8 + .cfi_same_value rbp + +.endmacro + +_foo: +.cfi_startproc + SaveRegisters + + RestoreRegisters + ret + .cfi_endproc + + + +// CHECK: 'section_name', '__eh_frame\x00 -- cgit v1.2.3