File: stack-protector.ll

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 1,998,492 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (135 lines) | stat: -rw-r--r-- 4,494 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -mtriple=wasm32-unknown-unknown < %s | FileCheck -check-prefix=WASM32 %s

@"\01LC" = internal constant [11 x i8] c"buf == %s\0A\00"		; <ptr> [#uses=1]

define void @test(ptr %a) nounwind ssp {
; WASM32-LABEL: test:
; WASM32:         .functype test (i32) -> ()
; WASM32-NEXT:    .local i32
; WASM32-NEXT:  # %bb.0: # %entry
; WASM32-NEXT:    global.get __stack_pointer
; WASM32-NEXT:    i32.const 32
; WASM32-NEXT:    i32.sub
; WASM32-NEXT:    local.tee 1
; WASM32-NEXT:    global.set __stack_pointer
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    local.get 0
; WASM32-NEXT:    i32.store 16
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 0
; WASM32-NEXT:    i32.load __stack_chk_guard
; WASM32-NEXT:    i32.store 28
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 20
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    local.get 0
; WASM32-NEXT:    call strcpy
; WASM32-NEXT:    drop
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 20
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    i32.store 0
; WASM32-NEXT:    i32.const LC
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    call printf
; WASM32-NEXT:    drop
; WASM32-NEXT:    block
; WASM32-NEXT:    i32.const 0
; WASM32-NEXT:    i32.load __stack_chk_guard
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.load 28
; WASM32-NEXT:    i32.eq
; WASM32-NEXT:    br_if 0 # 0: down to label0
; WASM32-NEXT:  # %bb.1: # %return
; WASM32-NEXT:    call __stack_chk_fail
; WASM32-NEXT:    unreachable
; WASM32-NEXT:  .LBB0_2: # %return
; WASM32-NEXT:    end_block # label0:
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 32
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    global.set __stack_pointer
; WASM32-NEXT:    # fallthrough-return
entry:
	%a_addr = alloca ptr		; <ptr> [#uses=2]
	%buf = alloca [8 x i8]		; <ptr> [#uses=2]
  %"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
	store ptr %a, ptr %a_addr
	%0 = load ptr, ptr %a_addr, align 4		; <ptr> [#uses=1]
	%1 = call ptr @strcpy(ptr %buf, ptr %0) nounwind		; <ptr> [#uses=0]
	%2 = call i32 (ptr, ...) @printf(ptr @"\01LC", ptr %buf) nounwind		; <i32> [#uses=0]
	br label %return

return:		; preds = %entry
	ret void
}

define i32 @test_return_i32(ptr %a) nounwind ssp {
; WASM32-LABEL: test_return_i32:
; WASM32:         .functype test_return_i32 (i32) -> (i32)
; WASM32-NEXT:    .local i32
; WASM32-NEXT:  # %bb.0: # %entry
; WASM32-NEXT:    global.get __stack_pointer
; WASM32-NEXT:    i32.const 32
; WASM32-NEXT:    i32.sub
; WASM32-NEXT:    local.tee 1
; WASM32-NEXT:    global.set __stack_pointer
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    local.get 0
; WASM32-NEXT:    i32.store 16
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 0
; WASM32-NEXT:    i32.load __stack_chk_guard
; WASM32-NEXT:    i32.store 28
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 20
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    local.get 0
; WASM32-NEXT:    call strcpy
; WASM32-NEXT:    drop
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 20
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    i32.store 0
; WASM32-NEXT:    i32.const LC
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    call printf
; WASM32-NEXT:    drop
; WASM32-NEXT:    block
; WASM32-NEXT:    i32.const 0
; WASM32-NEXT:    i32.load __stack_chk_guard
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.load 28
; WASM32-NEXT:    i32.eq
; WASM32-NEXT:    br_if 0 # 0: down to label1
; WASM32-NEXT:  # %bb.1: # %return
; WASM32-NEXT:    call __stack_chk_fail
; WASM32-NEXT:    unreachable
; WASM32-NEXT:  .LBB1_2: # %return
; WASM32-NEXT:    end_block # label1:
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 32
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    global.set __stack_pointer
; WASM32-NEXT:    i32.const 0
; WASM32-NEXT:    # fallthrough-return
entry:
  %a_addr = alloca ptr    ; <ptr> [#uses=2]
  %buf = alloca [8 x i8]    ; <ptr> [#uses=2]
  %"alloca point" = bitcast i32 0 to i32    ; <i32> [#uses=0]
  store ptr %a, ptr %a_addr
  %0 = load ptr, ptr %a_addr, align 4    ; <ptr> [#uses=1]
  %1 = call ptr @strcpy(ptr %buf, ptr %0) nounwind    ; <ptr> [#uses=0]
  %2 = call i32 (ptr, ...) @printf(ptr @"\01LC", ptr %buf) nounwind    ; <i32> [#uses=0]
  br label %return

return:    ; preds = %entry
  ret i32 0
}

declare ptr @strcpy(ptr, ptr) nounwind

declare i32 @printf(ptr, ...) nounwind