mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 08:26:29 +00:00
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:
parent
86f9f3b0af
commit
b8435149f5
@ -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.
|
||||
//
|
||||
|
73
test/MC/X86/cfi_def_cfa-crash.s
Normal file
73
test/MC/X86/cfi_def_cfa-crash.s
Normal 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
|
Loading…
Reference in New Issue
Block a user