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

llvm-svn: 194285
This commit is contained in:
Jim Grosbach 2013-11-08 22:33:06 +00:00
parent 86f9f3b0af
commit b8435149f5
2 changed files with 76 additions and 1 deletions

View File

@ -450,7 +450,9 @@ protected:
switch (Inst.getOperation()) {
default:
llvm_unreachable("cannot handle CFI directive for compact unwind!");
// Any other CFI directives indicate a frame that we aren't prepared
// to represent via compact unwind, so just bail out.
return 0;
case MCCFIInstruction::OpDefCfaRegister: {
// Defines a frame pointer. E.g.
//

View File

@ -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