213 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			YAML
		
	
	
	
			
		
		
	
	
			213 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			YAML
		
	
	
	
# RUN: llc -mtriple=x86_64-unknown-linux-gnu -run-pass shadow-call-stack -verify-machineinstrs -o - %s | FileCheck %s
 | 
						|
--- |
 | 
						|
 | 
						|
  define void @no_return() #0 { ret void }
 | 
						|
  define void @normal_return() #0 { ret void }
 | 
						|
  define void @normal_return_leaf_func() #0 { ret void }
 | 
						|
  define void @short_leaf_func() #0 { ret void }
 | 
						|
  define void @normal_tail_call() #0 { ret void }
 | 
						|
  define void @r11_tail_call() #0 { ret void }
 | 
						|
  define void @conditional_tail_call() #0 { ret void }
 | 
						|
  define void @r10_live_in() #0 { ret void }
 | 
						|
 | 
						|
  attributes #0 = { shadowcallstack }
 | 
						|
 | 
						|
...
 | 
						|
---
 | 
						|
# CHECK-LABEL: name: no_return
 | 
						|
name: no_return
 | 
						|
tracksRegLiveness: true
 | 
						|
frameInfo:
 | 
						|
  adjustsStack: true # not a leaf function
 | 
						|
body: |
 | 
						|
  ; CHECK: bb.0:
 | 
						|
  bb.0:
 | 
						|
    ; CHECK-NEXT: $eax = MOV32ri 13
 | 
						|
    $eax = MOV32ri 13  
 | 
						|
...
 | 
						|
---
 | 
						|
# CHECK-LABEL: name: normal_return
 | 
						|
name: normal_return
 | 
						|
tracksRegLiveness: true
 | 
						|
frameInfo:
 | 
						|
  adjustsStack: true # not a leaf function
 | 
						|
body: |
 | 
						|
  ; CHECK: bb.0:
 | 
						|
  bb.0:
 | 
						|
    ; CHECK: $r10 = MOV64rm $rsp, 1, $noreg, 0, $noreg
 | 
						|
    ; CHECK-NEXT: $r11 = XOR64rr undef $r11, undef $r11, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: ADD64mi8 $r11, 1, $noreg, 0, $gs, 8, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: $r11 = MOV64rm $r11, 1, $noreg, 0, $gs
 | 
						|
    ; CHECK-NEXT: MOV64mr $r11, 1, $noreg, 0, $gs, $r10
 | 
						|
    ; CHECK-NEXT: $eax = MOV32ri 13
 | 
						|
    $eax = MOV32ri 13
 | 
						|
 | 
						|
    ; CHECK-NEXT: $r11 = XOR64rr undef $r11, undef $r11, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: $r10 = MOV64rm $r11, 1, $noreg, 0, $gs
 | 
						|
    ; CHECK-NEXT: $r10 = MOV64rm $r10, 1, $noreg, 0, $gs
 | 
						|
    ; CHECK-NEXT: SUB64mi8 $r11, 1, $noreg, 0, $gs, 8, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: CMP64mr $rsp, 1, $noreg, 0, $noreg, $r10, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: JNE_1 %bb.1, implicit $eflags
 | 
						|
    ; CHECK-NEXT: RETQ $eax
 | 
						|
    RETQ $eax
 | 
						|
 | 
						|
    ; CHECK: bb.1:
 | 
						|
    ; CHECK-NEXT; TRAP  
 | 
						|
...
 | 
						|
---
 | 
						|
# CHECK-LABEL: name: normal_return_leaf_func
 | 
						|
name: normal_return_leaf_func
 | 
						|
tracksRegLiveness: true
 | 
						|
frameInfo:
 | 
						|
  adjustsStack: false # leaf function
 | 
						|
body: |
 | 
						|
  ; CHECK: bb.0:
 | 
						|
  ; CHECK: liveins: $rcx
 | 
						|
  bb.0:
 | 
						|
    liveins: $rcx
 | 
						|
 | 
						|
    ; CHECK: $rdx = MOV64rm $rsp, 1, $noreg, 0, $noreg
 | 
						|
    ; CHECK-NEXT: $eax = MOV32ri 0
 | 
						|
    $eax = MOV32ri 0
 | 
						|
    ; CHECK-NEXT: CMP64ri8 $rcx, 5, implicit-def $eflags
 | 
						|
    CMP64ri8 $rcx, 5, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: JA_1 %bb.1, implicit $eflags
 | 
						|
    JA_1 %bb.1, implicit $eflags
 | 
						|
    ; CHECK-NEXT: JMP_1 %bb.2
 | 
						|
    JMP_1 %bb.2
 | 
						|
 | 
						|
  ; CHECK: bb.1
 | 
						|
  ; CHECK: liveins: $eax, $rdx
 | 
						|
  bb.1:
 | 
						|
    liveins: $eax
 | 
						|
 | 
						|
    ; CHECKT: $eax = MOV32ri 1
 | 
						|
    $eax = MOV32ri 1
 | 
						|
 | 
						|
  ; CHECK: bb.2
 | 
						|
  ; CHECK: liveins: $eax, $rdx
 | 
						|
  bb.2:
 | 
						|
    liveins: $eax
 | 
						|
 | 
						|
    ; CHECK: CMP64mr $rsp, 1, $noreg, 0, $noreg, $rdx, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: JNE_1 %bb.3, implicit $eflags
 | 
						|
    ; CHECK-NEXT: RETQ $eax
 | 
						|
    RETQ $eax
 | 
						|
 | 
						|
    ; CHECK: bb.3:
 | 
						|
    ; CHECK-NEXT; TRAP  
 | 
						|
...
 | 
						|
---
 | 
						|
# CHECK-LABEL: name: short_leaf_func
 | 
						|
name: short_leaf_func
 | 
						|
tracksRegLiveness: true
 | 
						|
frameInfo:
 | 
						|
  adjustsStack: false # leaf function
 | 
						|
body: |
 | 
						|
  ; CHECK: bb.0:
 | 
						|
  bb.0:
 | 
						|
    ; Ensure these are not counted as machine instructions
 | 
						|
    CFI_INSTRUCTION 0
 | 
						|
    CFI_INSTRUCTION 0
 | 
						|
    CFI_INSTRUCTION 0
 | 
						|
    DBG_VALUE 0
 | 
						|
    DBG_VALUE 0
 | 
						|
    DBG_VALUE 0
 | 
						|
 | 
						|
    ; CHECK: $eax = MOV32ri 13
 | 
						|
    $eax = MOV32ri 13
 | 
						|
 | 
						|
    ; CHECK-NEXT: RETQ $eax
 | 
						|
    RETQ $eax  
 | 
						|
...
 | 
						|
---
 | 
						|
# CHECK-LABEL: name: normal_tail_call
 | 
						|
name: normal_tail_call
 | 
						|
tracksRegLiveness: true
 | 
						|
frameInfo:
 | 
						|
  adjustsStack: true # not a leaf function
 | 
						|
body: |
 | 
						|
  ; CHECK: bb.0:
 | 
						|
  bb.0:
 | 
						|
    ; CHECK: $r10 = MOV64rm $rsp, 1, $noreg, 0, $noreg
 | 
						|
    ; CHECK-NEXT: $r11 = XOR64rr undef $r11, undef $r11, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: ADD64mi8 $r11, 1, $noreg, 0, $gs, 8, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: $r11 = MOV64rm $r11, 1, $noreg, 0, $gs
 | 
						|
    ; CHECK-NEXT: MOV64mr $r11, 1, $noreg, 0, $gs, $r10
 | 
						|
    ; CHECK-NEXT: $eax = MOV32ri 13
 | 
						|
    $eax = MOV32ri 13
 | 
						|
 | 
						|
    ; CHECK-NEXT: $r11 = XOR64rr undef $r11, undef $r11, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: $r10 = MOV64rm $r11, 1, $noreg, 0, $gs
 | 
						|
    ; CHECK-NEXT: $r10 = MOV64rm $r10, 1, $noreg, 0, $gs
 | 
						|
    ; CHECK-NEXT: SUB64mi8 $r11, 1, $noreg, 0, $gs, 8, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: CMP64mr $rsp, 1, $noreg, 0, $noreg, $r10, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: JNE_1 %bb.1, implicit $eflags
 | 
						|
    ; CHECK-NEXT: TAILJMPr64 $rax
 | 
						|
    TAILJMPr64 $rax
 | 
						|
 | 
						|
    ; CHECK: bb.1:
 | 
						|
    ; CHECK-NEXT; TRAP  
 | 
						|
...
 | 
						|
---
 | 
						|
# CHECK-LABEL: name: r11_tail_call
 | 
						|
name: r11_tail_call
 | 
						|
tracksRegLiveness: true
 | 
						|
frameInfo:
 | 
						|
  adjustsStack: true # not a leaf function
 | 
						|
body: |
 | 
						|
  ; CHECK: bb.0:
 | 
						|
  bb.0:
 | 
						|
    ; CHECK: $r10 = MOV64rm $rsp, 1, $noreg, 0, $noreg
 | 
						|
    ; CHECK-NEXT: $r11 = XOR64rr undef $r11, undef $r11, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: ADD64mi8 $r11, 1, $noreg, 0, $gs, 8, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: $r11 = MOV64rm $r11, 1, $noreg, 0, $gs
 | 
						|
    ; CHECK-NEXT: MOV64mr $r11, 1, $noreg, 0, $gs, $r10
 | 
						|
    ; CHECK-NEXT: $eax = MOV32ri 13
 | 
						|
    $eax = MOV32ri 13
 | 
						|
 | 
						|
    ; CHECK-NEXT: $r10 = XOR64rr undef $r10, undef $r10, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: $r10 = MOV64rm $r10, 1, $noreg, 0, $gs
 | 
						|
    ; CHECK-NEXT: $r10 = MOV64rm $r10, 1, $noreg, 0, $gs
 | 
						|
    ; CHECK-NEXT: SUB64mi8 $noreg, 1, $noreg, 0, $gs, 8, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: CMP64mr $rsp, 1, $noreg, 0, $noreg, $r10, implicit-def $eflags
 | 
						|
    ; CHECK-NEXT: JNE_1 %bb.1, implicit $eflags
 | 
						|
    ; CHECK-NEXT: TAILJMPr64 undef $r11
 | 
						|
    TAILJMPr64 undef $r11
 | 
						|
 | 
						|
    ; CHECK: bb.1:
 | 
						|
    ; CHECK-NEXT; TRAP  
 | 
						|
...
 | 
						|
---
 | 
						|
# CHECK-LABEL: name: conditional_tail_call
 | 
						|
name: conditional_tail_call
 | 
						|
tracksRegLiveness: true
 | 
						|
frameInfo:
 | 
						|
  adjustsStack: true # not a leaf function
 | 
						|
body: |
 | 
						|
  ; CHECK: bb.0:
 | 
						|
  bb.0:
 | 
						|
    ; CHECK: $eax = MOV32ri 13
 | 
						|
    $eax = MOV32ri 13
 | 
						|
 | 
						|
    ; CHECK-NEXT: TAILJMPd64_CC @conditional_tail_call, undef $eflags
 | 
						|
    TAILJMPd64_CC @conditional_tail_call, undef $eflags  
 | 
						|
...
 | 
						|
---
 | 
						|
# CHECK-LABEL: name: r10_live_in
 | 
						|
name: r10_live_in
 | 
						|
tracksRegLiveness: true
 | 
						|
frameInfo:
 | 
						|
  adjustsStack: true # not a leaf function
 | 
						|
body: |
 | 
						|
  ; CHECK: bb.0:
 | 
						|
  ; CHECK: liveins: $r10
 | 
						|
  bb.0:
 | 
						|
    liveins: $r10
 | 
						|
 | 
						|
    ; CHECK: $eax = MOV32ri 13
 | 
						|
    $eax = MOV32ri 13
 | 
						|
    ; CHECK-NEXT: RETQ $eax
 | 
						|
    RETQ $eax  
 | 
						|
...
 |