mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
3eb19e0717
When functions are terminated by unreachable instructions, the last instruction might trigger a CFI instruction to be generated. However, emitting it would be be illegal since the function (and thus the FDE the CFI is in) has already ended with the previous instruction. Darwin's dwarfdump --verify --eh-frame complains about this and the specification supports this. Relevant bits from the DWARF 5 standard (6.4 Call Frame Information): "[The] address_range [field in an FDE]: The number of bytes of program instructions described by this entry." "Row creation instructions: [...] The new location value is always greater than the current one." The first quotation implies that a CFI cannot describe a target address outside of the enclosing FDE's range. rdar://problem/26244988 Differential Revision: https://reviews.llvm.org/D32246 llvm-svn: 301219
42 lines
1.5 KiB
LLVM
42 lines
1.5 KiB
LLVM
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-apple-darwin | FileCheck -check-prefix=CHECK-MACHO %s
|
|
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-apple-darwin -disable-fp-elim | FileCheck -check-prefix=CHECK-MACHO %s
|
|
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-linux-gnu | FileCheck -check-prefix=LINUX-NO-FP %s
|
|
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc-linux-gnu -disable-fp-elim | FileCheck -check-prefix=LINUX-FP %s
|
|
|
|
define void @func() {
|
|
entry:
|
|
unreachable
|
|
}
|
|
|
|
; MachO cannot handle an empty function.
|
|
; CHECK-MACHO: _func:
|
|
; CHECK-MACHO-NEXT: .cfi_startproc
|
|
; CHECK-MACHO-NEXT: {{^}};
|
|
; CHECK-MACHO-NEXT: nop
|
|
; CHECK-MACHO-NEXT: .cfi_endproc
|
|
|
|
; An empty function is perfectly fine on ELF.
|
|
; LINUX-NO-FP: func:
|
|
; LINUX-NO-FP-NEXT: {{^}}.L[[BEGIN:.*]]:{{$}}
|
|
; LINUX-NO-FP-NEXT: .cfi_startproc
|
|
; LINUX-NO-FP-NEXT: {{^}}#
|
|
; LINUX-NO-FP-NEXT: {{^}}.L[[END:.*]]:{{$}}
|
|
; LINUX-NO-FP-NEXT: .size func, .L[[END]]-.L[[BEGIN]]
|
|
; LINUX-NO-FP-NEXT: .cfi_endproc
|
|
|
|
; A cfi directive cannot point to the end of a function.
|
|
; LINUX-FP: func:
|
|
; LINUX-FP-NEXT: {{^}}.L[[BEGIN:.*]]:{{$}}
|
|
; LINUX-FP-NEXT: .cfi_startproc
|
|
; LINUX-FP-NEXT: {{^}}#
|
|
; LINUX-FP-NEXT: stwu 1, -16(1)
|
|
; LINUX-FP-NEXT: stw 31, 12(1)
|
|
; LINUX-FP-NEXT: {{^}}.L{{.*}}:{{$}}
|
|
; LINUX-FP-NEXT: .cfi_def_cfa_offset 16
|
|
; LINUX-FP-NEXT: {{^}}.L{{.*}}:{{$}}
|
|
; LINUX-FP-NEXT: .cfi_offset r31, -4
|
|
; LINUX-FP-NEXT: mr 31, 1
|
|
; LINUX-FP-NEXT: {{^}}.L[[END:.*]]:{{$}}
|
|
; LINUX-FP-NEXT: .size func, .L[[END]]-.L[[BEGIN]]
|
|
; LINUX-FP-NEXT: .cfi_endproc
|