1 ; RUN: llc -mtriple=i386-pc-linux-gnu < %s -o - | FileCheck --check-prefix=LINUX-I386 %s 2 ; RUN: llc -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck --check-prefix=LINUX-X64 %s 3 ; RUN: llc -code-model=kernel -mtriple=x86_64-pc-linux-gnu < %s -o - | FileCheck --check-prefix=LINUX-KERNEL-X64 %s 4 ; RUN: llc -mtriple=x86_64-apple-darwin < %s -o - | FileCheck --check-prefix=DARWIN-X64 %s 5 ; RUN: llc -mtriple=amd64-pc-openbsd < %s -o - | FileCheck --check-prefix=OPENBSD-AMD64 %s 6 ; RUN: llc -mtriple=i386-pc-windows-msvc < %s -o - | FileCheck -check-prefix=MSVC-I386 %s 7 8 %struct.foo = type { [16 x i8] } 9 %struct.foo.0 = type { [4 x i8] } 10 %struct.pair = type { i32, i32 } 11 %struct.nest = type { %struct.pair, %struct.pair } 12 %struct.vec = type { <4 x i32> } 13 %class.A = type { [2 x i8] } 14 %struct.deep = type { %union.anon } 15 %union.anon = type { %struct.anon } 16 %struct.anon = type { %struct.anon.0 } 17 %struct.anon.0 = type { %union.anon.1 } 18 %union.anon.1 = type { [2 x i8] } 19 %struct.small = type { i8 } 20 %struct.small_char = type { i32, [5 x i8] } 21 22 @.str = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 23 24 ; test1a: array of [16 x i8] 25 ; no ssp attribute 26 ; Requires no protector. 27 define void @test1a(i8* %a) { 28 entry: 29 ; LINUX-I386-LABEL: test1a: 30 ; LINUX-I386-NOT: calll __stack_chk_fail 31 ; LINUX-I386: .cfi_endproc 32 33 ; LINUX-X64-LABEL: test1a: 34 ; LINUX-X64-NOT: callq __stack_chk_fail 35 ; LINUX-X64: .cfi_endproc 36 37 ; LINUX-KERNEL-X64-LABEL: test1a: 38 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 39 ; LINUX-KERNEL-X64: .cfi_endproc 40 41 ; DARWIN-X64-LABEL: test1a: 42 ; DARWIN-X64-NOT: callq ___stack_chk_fail 43 ; DARWIN-X64: .cfi_endproc 44 45 ; MSVC-I386-LABEL: test1a: 46 ; MSVC-I386-NOT: calll @__security_check_cookie@4 47 ; MSVC-I386: retl 48 %a.addr = alloca i8*, align 8 49 %buf = alloca [16 x i8], align 16 50 store i8* %a, i8** %a.addr, align 8 51 %arraydecay = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 52 %0 = load i8*, i8** %a.addr, align 8 53 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 54 %arraydecay1 = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 55 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) 56 ret void 57 } 58 59 ; test1b: array of [16 x i8] 60 ; ssp attribute 61 ; Requires protector. 62 ; Function Attrs: ssp 63 define void @test1b(i8* %a) #0 { 64 entry: 65 ; LINUX-I386-LABEL: test1b: 66 ; LINUX-I386: mov{{l|q}} %gs: 67 ; LINUX-I386: calll __stack_chk_fail 68 69 ; LINUX-X64-LABEL: test1b: 70 ; LINUX-X64: mov{{l|q}} %fs: 71 ; LINUX-X64: callq __stack_chk_fail 72 73 ; LINUX-KERNEL-X64-LABEL: test1b: 74 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 75 ; LINUX-KERNEL-X64: callq __stack_chk_fail 76 77 ; DARWIN-X64-LABEL: test1b: 78 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 79 ; DARWIN-X64: callq ___stack_chk_fail 80 81 ; OPENBSD-AMD64-LABEL: test1b: 82 ; OPENBSD-AMD64: movq __guard_local(%rip) 83 ; OPENBSD-AMD64: callq __stack_smash_handler 84 85 ; MSVC-I386-LABEL: test1b: 86 ; MSVC-I386: movl ___security_cookie, 87 ; MSVC-I386: calll @__security_check_cookie@4 88 %a.addr = alloca i8*, align 8 89 %buf = alloca [16 x i8], align 16 90 store i8* %a, i8** %a.addr, align 8 91 %arraydecay = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 92 %0 = load i8*, i8** %a.addr, align 8 93 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 94 %arraydecay1 = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 95 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) 96 ret void 97 } 98 99 ; test1c: array of [16 x i8] 100 ; sspstrong attribute 101 ; Requires protector. 102 ; Function Attrs: sspstrong 103 define void @test1c(i8* %a) #1 { 104 entry: 105 ; LINUX-I386-LABEL: test1c: 106 ; LINUX-I386: mov{{l|q}} %gs: 107 ; LINUX-I386: calll __stack_chk_fail 108 109 ; LINUX-X64-LABEL: test1c: 110 ; LINUX-X64: mov{{l|q}} %fs: 111 ; LINUX-X64: callq __stack_chk_fail 112 113 ; LINUX-KERNEL-X64-LABEL: test1c: 114 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 115 ; LINUX-KERNEL-X64: callq __stack_chk_fail 116 117 ; DARWIN-X64-LABEL: test1c: 118 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 119 ; DARWIN-X64: callq ___stack_chk_fail 120 121 ; MSVC-I386-LABEL: test1c: 122 ; MSVC-I386: movl ___security_cookie, 123 ; MSVC-I386: calll @__security_check_cookie@4 124 %a.addr = alloca i8*, align 8 125 %buf = alloca [16 x i8], align 16 126 store i8* %a, i8** %a.addr, align 8 127 %arraydecay = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 128 %0 = load i8*, i8** %a.addr, align 8 129 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 130 %arraydecay1 = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 131 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) 132 ret void 133 } 134 135 ; test1d: array of [16 x i8] 136 ; sspreq attribute 137 ; Requires protector. 138 ; Function Attrs: sspreq 139 define void @test1d(i8* %a) #2 { 140 entry: 141 ; LINUX-I386-LABEL: test1d: 142 ; LINUX-I386: mov{{l|q}} %gs: 143 ; LINUX-I386: calll __stack_chk_fail 144 145 ; LINUX-X64-LABEL: test1d: 146 ; LINUX-X64: mov{{l|q}} %fs: 147 ; LINUX-X64: callq __stack_chk_fail 148 149 ; LINUX-KERNEL-X64-LABEL: test1d: 150 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 151 ; LINUX-KERNEL-X64: callq __stack_chk_fail 152 153 ; DARWIN-X64-LABEL: test1d: 154 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 155 ; DARWIN-X64: callq ___stack_chk_fail 156 157 ; MSVC-I386-LABEL: test1d: 158 ; MSVC-I386: movl ___security_cookie, 159 ; MSVC-I386: calll @__security_check_cookie@4 160 %a.addr = alloca i8*, align 8 161 %buf = alloca [16 x i8], align 16 162 store i8* %a, i8** %a.addr, align 8 163 %arraydecay = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 164 %0 = load i8*, i8** %a.addr, align 8 165 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 166 %arraydecay1 = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 167 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) 168 ret void 169 } 170 171 ; test2a: struct { [16 x i8] } 172 ; no ssp attribute 173 ; Requires no protector. 174 define void @test2a(i8* %a) { 175 entry: 176 ; LINUX-I386-LABEL: test2a: 177 ; LINUX-I386-NOT: calll __stack_chk_fail 178 ; LINUX-I386: .cfi_endproc 179 180 ; LINUX-X64-LABEL: test2a: 181 ; LINUX-X64-NOT: callq __stack_chk_fail 182 ; LINUX-X64: .cfi_endproc 183 184 ; LINUX-KERNEL-X64-LABEL: test2a: 185 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 186 ; LINUX-KERNEL-X64: .cfi_endproc 187 188 ; DARWIN-X64-LABEL: test2a: 189 ; DARWIN-X64-NOT: callq ___stack_chk_fail 190 ; DARWIN-X64: .cfi_endproc 191 192 ; MSVC-I386-LABEL: test2a: 193 ; MSVC-I386-NOT: calll @__security_check_cookie@4 194 ; MSVC-I386: retl 195 %a.addr = alloca i8*, align 8 196 %b = alloca %struct.foo, align 1 197 store i8* %a, i8** %a.addr, align 8 198 %buf = getelementptr inbounds %struct.foo, %struct.foo* %b, i32 0, i32 0 199 %arraydecay = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 200 %0 = load i8*, i8** %a.addr, align 8 201 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 202 %buf1 = getelementptr inbounds %struct.foo, %struct.foo* %b, i32 0, i32 0 203 %arraydecay2 = getelementptr inbounds [16 x i8], [16 x i8]* %buf1, i32 0, i32 0 204 %call3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) 205 ret void 206 } 207 208 ; test2b: struct { [16 x i8] } 209 ; ssp attribute 210 ; Requires protector. 211 ; Function Attrs: ssp 212 define void @test2b(i8* %a) #0 { 213 entry: 214 ; LINUX-I386-LABEL: test2b: 215 ; LINUX-I386: mov{{l|q}} %gs: 216 ; LINUX-I386: calll __stack_chk_fail 217 218 ; LINUX-X64-LABEL: test2b: 219 ; LINUX-X64: mov{{l|q}} %fs: 220 ; LINUX-X64: callq __stack_chk_fail 221 222 ; LINUX-KERNEL-X64-LABEL: test2b: 223 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 224 ; LINUX-KERNEL-X64: callq __stack_chk_fail 225 226 ; DARWIN-X64-LABEL: test2b: 227 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 228 ; DARWIN-X64: callq ___stack_chk_fail 229 %a.addr = alloca i8*, align 8 230 %b = alloca %struct.foo, align 1 231 store i8* %a, i8** %a.addr, align 8 232 %buf = getelementptr inbounds %struct.foo, %struct.foo* %b, i32 0, i32 0 233 %arraydecay = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 234 %0 = load i8*, i8** %a.addr, align 8 235 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 236 %buf1 = getelementptr inbounds %struct.foo, %struct.foo* %b, i32 0, i32 0 237 %arraydecay2 = getelementptr inbounds [16 x i8], [16 x i8]* %buf1, i32 0, i32 0 238 %call3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) 239 ret void 240 } 241 242 ; test2c: struct { [16 x i8] } 243 ; sspstrong attribute 244 ; Requires protector. 245 ; Function Attrs: sspstrong 246 define void @test2c(i8* %a) #1 { 247 entry: 248 ; LINUX-I386-LABEL: test2c: 249 ; LINUX-I386: mov{{l|q}} %gs: 250 ; LINUX-I386: calll __stack_chk_fail 251 252 ; LINUX-X64-LABEL: test2c: 253 ; LINUX-X64: mov{{l|q}} %fs: 254 ; LINUX-X64: callq __stack_chk_fail 255 256 ; LINUX-KERNEL-X64-LABEL: test2c: 257 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 258 ; LINUX-KERNEL-X64: callq __stack_chk_fail 259 260 ; DARWIN-X64-LABEL: test2c: 261 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 262 ; DARWIN-X64: callq ___stack_chk_fail 263 264 ; MSVC-I386-LABEL: test2c: 265 ; MSVC-I386: movl ___security_cookie, 266 ; MSVC-I386: calll @__security_check_cookie@4 267 %a.addr = alloca i8*, align 8 268 %b = alloca %struct.foo, align 1 269 store i8* %a, i8** %a.addr, align 8 270 %buf = getelementptr inbounds %struct.foo, %struct.foo* %b, i32 0, i32 0 271 %arraydecay = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 272 %0 = load i8*, i8** %a.addr, align 8 273 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 274 %buf1 = getelementptr inbounds %struct.foo, %struct.foo* %b, i32 0, i32 0 275 %arraydecay2 = getelementptr inbounds [16 x i8], [16 x i8]* %buf1, i32 0, i32 0 276 %call3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) 277 ret void 278 } 279 280 ; test2d: struct { [16 x i8] } 281 ; sspreq attribute 282 ; Requires protector. 283 ; Function Attrs: sspreq 284 define void @test2d(i8* %a) #2 { 285 entry: 286 ; LINUX-I386-LABEL: test2d: 287 ; LINUX-I386: mov{{l|q}} %gs: 288 ; LINUX-I386: calll __stack_chk_fail 289 290 ; LINUX-X64-LABEL: test2d: 291 ; LINUX-X64: mov{{l|q}} %fs: 292 ; LINUX-X64: callq __stack_chk_fail 293 294 ; LINUX-KERNEL-X64-LABEL: test2d: 295 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 296 ; LINUX-KERNEL-X64: callq __stack_chk_fail 297 298 ; DARWIN-X64-LABEL: test2d: 299 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 300 ; DARWIN-X64: callq ___stack_chk_fail 301 302 ; MSVC-I386-LABEL: test2d: 303 ; MSVC-I386: movl ___security_cookie, 304 ; MSVC-I386: calll @__security_check_cookie@4 305 %a.addr = alloca i8*, align 8 306 %b = alloca %struct.foo, align 1 307 store i8* %a, i8** %a.addr, align 8 308 %buf = getelementptr inbounds %struct.foo, %struct.foo* %b, i32 0, i32 0 309 %arraydecay = getelementptr inbounds [16 x i8], [16 x i8]* %buf, i32 0, i32 0 310 %0 = load i8*, i8** %a.addr, align 8 311 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 312 %buf1 = getelementptr inbounds %struct.foo, %struct.foo* %b, i32 0, i32 0 313 %arraydecay2 = getelementptr inbounds [16 x i8], [16 x i8]* %buf1, i32 0, i32 0 314 %call3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) 315 ret void 316 } 317 318 ; test3a: array of [4 x i8] 319 ; no ssp attribute 320 ; Requires no protector. 321 define void @test3a(i8* %a) { 322 entry: 323 ; LINUX-I386-LABEL: test3a: 324 ; LINUX-I386-NOT: calll __stack_chk_fail 325 ; LINUX-I386: .cfi_endproc 326 327 ; LINUX-X64-LABEL: test3a: 328 ; LINUX-X64-NOT: callq __stack_chk_fail 329 ; LINUX-X64: .cfi_endproc 330 331 ; LINUX-KERNEL-X64-LABEL: test3a: 332 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 333 ; LINUX-KERNEL-X64: .cfi_endproc 334 335 ; DARWIN-X64-LABEL: test3a: 336 ; DARWIN-X64-NOT: callq ___stack_chk_fail 337 ; DARWIN-X64: .cfi_endproc 338 339 ; MSVC-I386-LABEL: test3a: 340 ; MSVC-I386-NOT: calll @__security_check_cookie@4 341 ; MSVC-I386: retl 342 %a.addr = alloca i8*, align 8 343 %buf = alloca [4 x i8], align 1 344 store i8* %a, i8** %a.addr, align 8 345 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 346 %0 = load i8*, i8** %a.addr, align 8 347 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 348 %arraydecay1 = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 349 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) 350 ret void 351 } 352 353 ; test3b: array [4 x i8] 354 ; ssp attribute 355 ; Requires no protector. 356 ; Function Attrs: ssp 357 define void @test3b(i8* %a) #0 { 358 entry: 359 ; LINUX-I386-LABEL: test3b: 360 ; LINUX-I386-NOT: calll __stack_chk_fail 361 ; LINUX-I386: .cfi_endproc 362 363 ; LINUX-X64-LABEL: test3b: 364 ; LINUX-X64-NOT: callq __stack_chk_fail 365 ; LINUX-X64: .cfi_endproc 366 367 ; LINUX-KERNEL-X64-LABEL: test3b: 368 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 369 ; LINUX-KERNEL-X64: .cfi_endproc 370 371 ; DARWIN-X64-LABEL: test3b: 372 ; DARWIN-X64-NOT: callq ___stack_chk_fail 373 ; DARWIN-X64: .cfi_endproc 374 375 ; MSVC-I386-LABEL: test3b: 376 ; MSVC-I386-NOT: calll @__security_check_cookie@4 377 ; MSVC-I386: retl 378 %a.addr = alloca i8*, align 8 379 %buf = alloca [4 x i8], align 1 380 store i8* %a, i8** %a.addr, align 8 381 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 382 %0 = load i8*, i8** %a.addr, align 8 383 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 384 %arraydecay1 = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 385 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) 386 ret void 387 } 388 389 ; test3c: array of [4 x i8] 390 ; sspstrong attribute 391 ; Requires protector. 392 ; Function Attrs: sspstrong 393 define void @test3c(i8* %a) #1 { 394 entry: 395 ; LINUX-I386-LABEL: test3c: 396 ; LINUX-I386: mov{{l|q}} %gs: 397 ; LINUX-I386: calll __stack_chk_fail 398 399 ; LINUX-X64-LABEL: test3c: 400 ; LINUX-X64: mov{{l|q}} %fs: 401 ; LINUX-X64: callq __stack_chk_fail 402 403 ; LINUX-KERNEL-X64-LABEL: test3c: 404 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 405 ; LINUX-KERNEL-X64: callq __stack_chk_fail 406 407 ; DARWIN-X64-LABEL: test3c: 408 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 409 ; DARWIN-X64: callq ___stack_chk_fail 410 411 ; MSVC-I386-LABEL: test3c: 412 ; MSVC-I386: movl ___security_cookie, 413 ; MSVC-I386: calll @__security_check_cookie@4 414 %a.addr = alloca i8*, align 8 415 %buf = alloca [4 x i8], align 1 416 store i8* %a, i8** %a.addr, align 8 417 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 418 %0 = load i8*, i8** %a.addr, align 8 419 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 420 %arraydecay1 = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 421 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) 422 ret void 423 } 424 425 ; test3d: array of [4 x i8] 426 ; sspreq attribute 427 ; Requires protector. 428 ; Function Attrs: sspreq 429 define void @test3d(i8* %a) #2 { 430 entry: 431 ; LINUX-I386-LABEL: test3d: 432 ; LINUX-I386: mov{{l|q}} %gs: 433 ; LINUX-I386: calll __stack_chk_fail 434 435 ; LINUX-X64-LABEL: test3d: 436 ; LINUX-X64: mov{{l|q}} %fs: 437 ; LINUX-X64: callq __stack_chk_fail 438 439 ; LINUX-KERNEL-X64-LABEL: test3d: 440 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 441 ; LINUX-KERNEL-X64: callq __stack_chk_fail 442 443 ; DARWIN-X64-LABEL: test3d: 444 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 445 ; DARWIN-X64: callq ___stack_chk_fail 446 447 ; MSVC-I386-LABEL: test3d: 448 ; MSVC-I386: movl ___security_cookie, 449 ; MSVC-I386: calll @__security_check_cookie@4 450 %a.addr = alloca i8*, align 8 451 %buf = alloca [4 x i8], align 1 452 store i8* %a, i8** %a.addr, align 8 453 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 454 %0 = load i8*, i8** %a.addr, align 8 455 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 456 %arraydecay1 = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 457 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay1) 458 ret void 459 } 460 461 ; test4a: struct { [4 x i8] } 462 ; no ssp attribute 463 ; Requires no protector. 464 define void @test4a(i8* %a) { 465 entry: 466 ; LINUX-I386-LABEL: test4a: 467 ; LINUX-I386-NOT: calll __stack_chk_fail 468 ; LINUX-I386: .cfi_endproc 469 470 ; LINUX-X64-LABEL: test4a: 471 ; LINUX-X64-NOT: callq __stack_chk_fail 472 ; LINUX-X64: .cfi_endproc 473 474 ; LINUX-KERNEL-X64-LABEL: test4a: 475 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 476 ; LINUX-KERNEL-X64: .cfi_endproc 477 478 ; DARWIN-X64-LABEL: test4a: 479 ; DARWIN-X64-NOT: callq ___stack_chk_fail 480 ; DARWIN-X64: .cfi_endproc 481 482 ; MSVC-I386-LABEL: test4a: 483 ; MSVC-I386-NOT: calll @__security_check_cookie@4 484 ; MSVC-I386: retl 485 %a.addr = alloca i8*, align 8 486 %b = alloca %struct.foo.0, align 1 487 store i8* %a, i8** %a.addr, align 8 488 %buf = getelementptr inbounds %struct.foo.0, %struct.foo.0* %b, i32 0, i32 0 489 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 490 %0 = load i8*, i8** %a.addr, align 8 491 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 492 %buf1 = getelementptr inbounds %struct.foo.0, %struct.foo.0* %b, i32 0, i32 0 493 %arraydecay2 = getelementptr inbounds [4 x i8], [4 x i8]* %buf1, i32 0, i32 0 494 %call3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) 495 ret void 496 } 497 498 ; test4b: struct { [4 x i8] } 499 ; ssp attribute 500 ; Requires no protector. 501 ; Function Attrs: ssp 502 define void @test4b(i8* %a) #0 { 503 entry: 504 ; LINUX-I386-LABEL: test4b: 505 ; LINUX-I386-NOT: calll __stack_chk_fail 506 ; LINUX-I386: .cfi_endproc 507 508 ; LINUX-X64-LABEL: test4b: 509 ; LINUX-X64-NOT: callq __stack_chk_fail 510 ; LINUX-X64: .cfi_endproc 511 512 ; LINUX-KERNEL-X64-LABEL: test4b: 513 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 514 ; LINUX-KERNEL-X64: .cfi_endproc 515 516 ; DARWIN-X64-LABEL: test4b: 517 ; DARWIN-X64-NOT: callq ___stack_chk_fail 518 ; DARWIN-X64: .cfi_endproc 519 520 ; MSVC-I386-LABEL: test4b: 521 ; MSVC-I386-NOT: calll @__security_check_cookie@4 522 ; MSVC-I386: retl 523 %a.addr = alloca i8*, align 8 524 %b = alloca %struct.foo.0, align 1 525 store i8* %a, i8** %a.addr, align 8 526 %buf = getelementptr inbounds %struct.foo.0, %struct.foo.0* %b, i32 0, i32 0 527 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 528 %0 = load i8*, i8** %a.addr, align 8 529 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 530 %buf1 = getelementptr inbounds %struct.foo.0, %struct.foo.0* %b, i32 0, i32 0 531 %arraydecay2 = getelementptr inbounds [4 x i8], [4 x i8]* %buf1, i32 0, i32 0 532 %call3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) 533 ret void 534 } 535 536 ; test4c: struct { [4 x i8] } 537 ; sspstrong attribute 538 ; Requires protector. 539 ; Function Attrs: sspstrong 540 define void @test4c(i8* %a) #1 { 541 entry: 542 ; LINUX-I386-LABEL: test4c: 543 ; LINUX-I386: mov{{l|q}} %gs: 544 ; LINUX-I386: calll __stack_chk_fail 545 546 ; LINUX-X64-LABEL: test4c: 547 ; LINUX-X64: mov{{l|q}} %fs: 548 ; LINUX-X64: callq __stack_chk_fail 549 550 ; LINUX-KERNEL-X64-LABEL: test4c: 551 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 552 ; LINUX-KERNEL-X64: callq __stack_chk_fail 553 554 ; DARWIN-X64-LABEL: test4c: 555 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 556 ; DARWIN-X64: callq ___stack_chk_fail 557 558 ; MSVC-I386-LABEL: test4c: 559 ; MSVC-I386: movl ___security_cookie, 560 ; MSVC-I386: calll @__security_check_cookie@4 561 %a.addr = alloca i8*, align 8 562 %b = alloca %struct.foo.0, align 1 563 store i8* %a, i8** %a.addr, align 8 564 %buf = getelementptr inbounds %struct.foo.0, %struct.foo.0* %b, i32 0, i32 0 565 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 566 %0 = load i8*, i8** %a.addr, align 8 567 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 568 %buf1 = getelementptr inbounds %struct.foo.0, %struct.foo.0* %b, i32 0, i32 0 569 %arraydecay2 = getelementptr inbounds [4 x i8], [4 x i8]* %buf1, i32 0, i32 0 570 %call3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) 571 ret void 572 } 573 574 ; test4d: struct { [4 x i8] } 575 ; sspreq attribute 576 ; Requires protector. 577 ; Function Attrs: sspreq 578 define void @test4d(i8* %a) #2 { 579 entry: 580 ; LINUX-I386-LABEL: test4d: 581 ; LINUX-I386: mov{{l|q}} %gs: 582 ; LINUX-I386: calll __stack_chk_fail 583 584 ; LINUX-X64-LABEL: test4d: 585 ; LINUX-X64: mov{{l|q}} %fs: 586 ; LINUX-X64: callq __stack_chk_fail 587 588 ; LINUX-KERNEL-X64-LABEL: test4d: 589 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 590 ; LINUX-KERNEL-X64: callq __stack_chk_fail 591 592 ; DARWIN-X64-LABEL: test4d: 593 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 594 ; DARWIN-X64: callq ___stack_chk_fail 595 596 ; MSVC-I386-LABEL: test4d: 597 ; MSVC-I386: movl ___security_cookie, 598 ; MSVC-I386: calll @__security_check_cookie@4 599 %a.addr = alloca i8*, align 8 600 %b = alloca %struct.foo.0, align 1 601 store i8* %a, i8** %a.addr, align 8 602 %buf = getelementptr inbounds %struct.foo.0, %struct.foo.0* %b, i32 0, i32 0 603 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %buf, i32 0, i32 0 604 %0 = load i8*, i8** %a.addr, align 8 605 %call = call i8* @strcpy(i8* %arraydecay, i8* %0) 606 %buf1 = getelementptr inbounds %struct.foo.0, %struct.foo.0* %b, i32 0, i32 0 607 %arraydecay2 = getelementptr inbounds [4 x i8], [4 x i8]* %buf1, i32 0, i32 0 608 %call3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay2) 609 ret void 610 } 611 612 ; test5a: no arrays / no nested arrays 613 ; no ssp attribute 614 ; Requires no protector. 615 define void @test5a(i8* %a) { 616 entry: 617 ; LINUX-I386-LABEL: test5a: 618 ; LINUX-I386-NOT: calll __stack_chk_fail 619 ; LINUX-I386: .cfi_endproc 620 621 ; LINUX-X64-LABEL: test5a: 622 ; LINUX-X64-NOT: callq __stack_chk_fail 623 ; LINUX-X64: .cfi_endproc 624 625 ; LINUX-KERNEL-X64-LABEL: test5a: 626 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 627 ; LINUX-KERNEL-X64: .cfi_endproc 628 629 ; DARWIN-X64-LABEL: test5a: 630 ; DARWIN-X64-NOT: callq ___stack_chk_fail 631 ; DARWIN-X64: .cfi_endproc 632 633 ; MSVC-I386-LABEL: test5a: 634 ; MSVC-I386-NOT: calll @__security_check_cookie@4 635 ; MSVC-I386: retl 636 %a.addr = alloca i8*, align 8 637 store i8* %a, i8** %a.addr, align 8 638 %0 = load i8*, i8** %a.addr, align 8 639 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %0) 640 ret void 641 } 642 643 ; test5b: no arrays / no nested arrays 644 ; ssp attribute 645 ; Requires no protector. 646 ; Function Attrs: ssp 647 define void @test5b(i8* %a) #0 { 648 entry: 649 ; LINUX-I386-LABEL: test5b: 650 ; LINUX-I386-NOT: calll __stack_chk_fail 651 ; LINUX-I386: .cfi_endproc 652 653 ; LINUX-X64-LABEL: test5b: 654 ; LINUX-X64-NOT: callq __stack_chk_fail 655 ; LINUX-X64: .cfi_endproc 656 657 ; LINUX-KERNEL-X64-LABEL: test5b: 658 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 659 ; LINUX-KERNEL-X64: .cfi_endproc 660 661 ; DARWIN-X64-LABEL: test5b: 662 ; DARWIN-X64-NOT: callq ___stack_chk_fail 663 ; DARWIN-X64: .cfi_endproc 664 665 ; MSVC-I386-LABEL: test5b: 666 ; MSVC-I386-NOT: calll @__security_check_cookie@4 667 ; MSVC-I386: retl 668 %a.addr = alloca i8*, align 8 669 store i8* %a, i8** %a.addr, align 8 670 %0 = load i8*, i8** %a.addr, align 8 671 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %0) 672 ret void 673 } 674 675 ; test5c: no arrays / no nested arrays 676 ; sspstrong attribute 677 ; Requires no protector. 678 ; Function Attrs: sspstrong 679 define void @test5c(i8* %a) #1 { 680 entry: 681 ; LINUX-I386-LABEL: test5c: 682 ; LINUX-I386-NOT: calll __stack_chk_fail 683 ; LINUX-I386: .cfi_endproc 684 685 ; LINUX-X64-LABEL: test5c: 686 ; LINUX-X64-NOT: callq __stack_chk_fail 687 ; LINUX-X64: .cfi_endproc 688 689 ; LINUX-KERNEL-X64-LABEL: test5c: 690 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 691 ; LINUX-KERNEL-X64: .cfi_endproc 692 693 ; DARWIN-X64-LABEL: test5c: 694 ; DARWIN-X64-NOT: callq ___stack_chk_fail 695 ; DARWIN-X64: .cfi_endproc 696 697 ; MSVC-I386-LABEL: test5c: 698 ; MSVC-I386-NOT: calll @__security_check_cookie@4 699 ; MSVC-I386: retl 700 %a.addr = alloca i8*, align 8 701 store i8* %a, i8** %a.addr, align 8 702 %0 = load i8*, i8** %a.addr, align 8 703 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %0) 704 ret void 705 } 706 707 ; test5d: no arrays / no nested arrays 708 ; sspreq attribute 709 ; Requires protector. 710 ; Function Attrs: sspreq 711 define void @test5d(i8* %a) #2 { 712 entry: 713 ; LINUX-I386-LABEL: test5d: 714 ; LINUX-I386: mov{{l|q}} %gs: 715 ; LINUX-I386: calll __stack_chk_fail 716 717 ; LINUX-X64-LABEL: test5d: 718 ; LINUX-X64: mov{{l|q}} %fs: 719 ; LINUX-X64: callq __stack_chk_fail 720 721 ; LINUX-KERNEL-X64-LABEL: test5d: 722 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 723 ; LINUX-KERNEL-X64: callq __stack_chk_fail 724 725 ; DARWIN-X64-LABEL: test5d: 726 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 727 ; DARWIN-X64: callq ___stack_chk_fail 728 729 ; MSVC-I386-LABEL: test5d: 730 ; MSVC-I386: movl ___security_cookie, 731 ; MSVC-I386: calll @__security_check_cookie@4 732 %a.addr = alloca i8*, align 8 733 store i8* %a, i8** %a.addr, align 8 734 %0 = load i8*, i8** %a.addr, align 8 735 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %0) 736 ret void 737 } 738 739 ; test6a: Address-of local taken (j = &a) 740 ; no ssp attribute 741 ; Requires no protector. 742 define void @test6a() { 743 entry: 744 ; LINUX-I386-LABEL: test6a: 745 ; LINUX-I386-NOT: calll __stack_chk_fail 746 ; LINUX-I386: .cfi_endproc 747 748 ; LINUX-X64-LABEL: test6a: 749 ; LINUX-X64-NOT: callq __stack_chk_fail 750 ; LINUX-X64: .cfi_endproc 751 752 ; LINUX-KERNEL-X64-LABEL: test6a: 753 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 754 ; LINUX-KERNEL-X64: .cfi_endproc 755 756 ; DARWIN-X64-LABEL: test6a: 757 ; DARWIN-X64-NOT: callq ___stack_chk_fail 758 ; DARWIN-X64: .cfi_endproc 759 760 ; MSVC-I386-LABEL: test6a: 761 ; MSVC-I386-NOT: calll @__security_check_cookie@4 762 ; MSVC-I386: retl 763 %retval = alloca i32, align 4 764 %a = alloca i32, align 4 765 %j = alloca i32*, align 8 766 store i32 0, i32* %retval 767 %0 = load i32, i32* %a, align 4 768 %add = add nsw i32 %0, 1 769 store i32 %add, i32* %a, align 4 770 store i32* %a, i32** %j, align 8 771 ret void 772 } 773 774 ; test6b: Address-of local taken (j = &a) 775 ; ssp attribute 776 ; Requires no protector. 777 ; Function Attrs: ssp 778 define void @test6b() #0 { 779 entry: 780 ; LINUX-I386-LABEL: test6b: 781 ; LINUX-I386-NOT: calll __stack_chk_fail 782 ; LINUX-I386: .cfi_endproc 783 784 ; LINUX-X64-LABEL: test6b: 785 ; LINUX-X64-NOT: callq __stack_chk_fail 786 ; LINUX-X64: .cfi_endproc 787 788 ; LINUX-KERNEL-X64-LABEL: test6b: 789 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 790 ; LINUX-KERNEL-X64: .cfi_endproc 791 792 ; DARWIN-X64-LABEL: test6b: 793 ; DARWIN-X64-NOT: callq ___stack_chk_fail 794 ; DARWIN-X64: .cfi_endproc 795 796 797 ; MSVC-I386-LABEL: test6b: 798 ; MSVC-I386-NOT: calll @__security_check_cookie@4 799 ; MSVC-I386: retl 800 %retval = alloca i32, align 4 801 %a = alloca i32, align 4 802 %j = alloca i32*, align 8 803 store i32 0, i32* %retval 804 %0 = load i32, i32* %a, align 4 805 %add = add nsw i32 %0, 1 806 store i32 %add, i32* %a, align 4 807 store i32* %a, i32** %j, align 8 808 ret void 809 } 810 811 ; test6c: Address-of local taken (j = &a) 812 ; sspstrong attribute 813 ; Requires protector. 814 ; Function Attrs: sspstrong 815 define void @test6c() #1 { 816 entry: 817 ; LINUX-I386-LABEL: test6c: 818 ; LINUX-I386: mov{{l|q}} %gs: 819 ; LINUX-I386: calll __stack_chk_fail 820 821 ; LINUX-X64-LABEL: test6c: 822 ; LINUX-X64: mov{{l|q}} %fs: 823 ; LINUX-X64: callq __stack_chk_fail 824 825 ; LINUX-KERNEL-X64-LABEL: test6c: 826 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 827 ; LINUX-KERNEL-X64: callq __stack_chk_fail 828 829 ; DARWIN-X64-LABEL: test6c: 830 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 831 ; DARWIN-X64: callq ___stack_chk_fail 832 833 ; MSVC-I386-LABEL: test6c: 834 ; MSVC-I386: movl ___security_cookie, 835 ; MSVC-I386: calll @__security_check_cookie@4 836 %retval = alloca i32, align 4 837 %a = alloca i32, align 4 838 %j = alloca i32*, align 8 839 store i32 0, i32* %retval 840 %0 = load i32, i32* %a, align 4 841 %add = add nsw i32 %0, 1 842 store i32 %add, i32* %a, align 4 843 store i32* %a, i32** %j, align 8 844 ret void 845 } 846 847 ; test6d: Address-of local taken (j = &a) 848 ; sspreq attribute 849 ; Requires protector. 850 ; Function Attrs: sspreq 851 define void @test6d() #2 { 852 entry: 853 ; LINUX-I386-LABEL: test6d: 854 ; LINUX-I386: mov{{l|q}} %gs: 855 ; LINUX-I386: calll __stack_chk_fail 856 857 ; LINUX-X64-LABEL: test6d: 858 ; LINUX-X64: mov{{l|q}} %fs: 859 ; LINUX-X64: callq __stack_chk_fail 860 861 ; LINUX-KERNEL-X64-LABEL: test6d: 862 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 863 ; LINUX-KERNEL-X64: callq __stack_chk_fail 864 865 ; DARWIN-X64-LABEL: test6d: 866 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 867 ; DARWIN-X64: callq ___stack_chk_fail 868 869 ; MSVC-I386-LABEL: test6d: 870 ; MSVC-I386: movl ___security_cookie, 871 ; MSVC-I386: calll @__security_check_cookie@4 872 %retval = alloca i32, align 4 873 %a = alloca i32, align 4 874 %j = alloca i32*, align 8 875 store i32 0, i32* %retval 876 %0 = load i32, i32* %a, align 4 877 %add = add nsw i32 %0, 1 878 store i32 %add, i32* %a, align 4 879 store i32* %a, i32** %j, align 8 880 ret void 881 } 882 883 ; test7a: PtrToInt Cast 884 ; no ssp attribute 885 ; Requires no protector. 886 define void @test7a() { 887 entry: 888 ; LINUX-I386-LABEL: test7a: 889 ; LINUX-I386-NOT: calll __stack_chk_fail 890 ; LINUX-I386: .cfi_endproc 891 892 ; LINUX-X64-LABEL: test7a: 893 ; LINUX-X64-NOT: callq __stack_chk_fail 894 ; LINUX-X64: .cfi_endproc 895 896 ; LINUX-KERNEL-X64-LABEL: test7a: 897 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 898 ; LINUX-KERNEL-X64: .cfi_endproc 899 900 ; DARWIN-X64-LABEL: test7a: 901 ; DARWIN-X64-NOT: callq ___stack_chk_fail 902 ; DARWIN-X64: .cfi_endproc 903 904 ; MSVC-I386-LABEL: test7a: 905 ; MSVC-I386-NOT: calll @__security_check_cookie@4 906 ; MSVC-I386: retl 907 %a = alloca i32, align 4 908 %0 = ptrtoint i32* %a to i64 909 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 %0) 910 ret void 911 } 912 913 ; test7b: PtrToInt Cast 914 ; ssp attribute 915 ; Requires no protector. 916 ; Function Attrs: ssp 917 define void @test7b() #0 { 918 entry: 919 ; LINUX-I386-LABEL: test7b: 920 ; LINUX-I386-NOT: calll __stack_chk_fail 921 ; LINUX-I386: .cfi_endproc 922 923 ; LINUX-X64-LABEL: test7b: 924 ; LINUX-X64-NOT: callq __stack_chk_fail 925 ; LINUX-X64: .cfi_endproc 926 927 ; LINUX-KERNEL-X64-LABEL: test7b: 928 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 929 ; LINUX-KERNEL-X64: .cfi_endproc 930 931 ; DARWIN-X64-LABEL: test7b: 932 ; DARWIN-X64-NOT: callq ___stack_chk_fail 933 ; DARWIN-X64: .cfi_endproc 934 935 ; MSVC-I386-LABEL: test7b: 936 ; MSVC-I386-NOT: calll @__security_check_cookie@4 937 ; MSVC-I386: retl 938 %a = alloca i32, align 4 939 %0 = ptrtoint i32* %a to i64 940 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 %0) 941 ret void 942 } 943 944 ; test7c: PtrToInt Cast 945 ; sspstrong attribute 946 ; Requires protector. 947 ; Function Attrs: sspstrong 948 define void @test7c() #1 { 949 entry: 950 ; LINUX-I386-LABEL: test7c: 951 ; LINUX-I386: mov{{l|q}} %gs: 952 ; LINUX-I386: calll __stack_chk_fail 953 954 ; LINUX-X64-LABEL: test7c: 955 ; LINUX-X64: mov{{l|q}} %fs: 956 ; LINUX-X64: callq __stack_chk_fail 957 958 ; LINUX-KERNEL-X64-LABEL: test7c: 959 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 960 ; LINUX-KERNEL-X64: callq __stack_chk_fail 961 962 ; DARWIN-X64-LABEL: test7c: 963 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 964 ; DARWIN-X64: callq ___stack_chk_fail 965 966 ; MSVC-I386-LABEL: test7c: 967 ; MSVC-I386: movl ___security_cookie, 968 ; MSVC-I386: calll @__security_check_cookie@4 969 %a = alloca i32, align 4 970 %0 = ptrtoint i32* %a to i64 971 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 %0) 972 ret void 973 } 974 975 ; test7d: PtrToInt Cast 976 ; sspreq attribute 977 ; Requires protector. 978 ; Function Attrs: sspreq 979 define void @test7d() #2 { 980 entry: 981 ; LINUX-I386-LABEL: test7d: 982 ; LINUX-I386: mov{{l|q}} %gs: 983 ; LINUX-I386: calll __stack_chk_fail 984 985 ; LINUX-X64-LABEL: test7d: 986 ; LINUX-X64: mov{{l|q}} %fs: 987 ; LINUX-X64: callq __stack_chk_fail 988 989 ; LINUX-KERNEL-X64-LABEL: test7d: 990 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 991 ; LINUX-KERNEL-X64: callq __stack_chk_fail 992 993 ; DARWIN-X64-LABEL: test7d: 994 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 995 ; DARWIN-X64: callq ___stack_chk_fail 996 997 ; MSVC-I386-LABEL: test7d: 998 ; MSVC-I386: movl ___security_cookie, 999 ; MSVC-I386: calll @__security_check_cookie@4 1000 %a = alloca i32, align 4 1001 %0 = ptrtoint i32* %a to i64 1002 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 %0) 1003 ret void 1004 } 1005 1006 ; test8a: Passing addr-of to function call 1007 ; no ssp attribute 1008 ; Requires no protector. 1009 define void @test8a() { 1010 entry: 1011 ; LINUX-I386-LABEL: test8a: 1012 ; LINUX-I386-NOT: calll __stack_chk_fail 1013 ; LINUX-I386: .cfi_endproc 1014 1015 ; LINUX-X64-LABEL: test8a: 1016 ; LINUX-X64-NOT: callq __stack_chk_fail 1017 ; LINUX-X64: .cfi_endproc 1018 1019 ; LINUX-KERNEL-X64-LABEL: test8a: 1020 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1021 ; LINUX-KERNEL-X64: .cfi_endproc 1022 1023 ; DARWIN-X64-LABEL: test8a: 1024 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1025 ; DARWIN-X64: .cfi_endproc 1026 1027 ; MSVC-I386-LABEL: test8a: 1028 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1029 ; MSVC-I386: retl 1030 %b = alloca i32, align 4 1031 call void @funcall(i32* %b) 1032 ret void 1033 } 1034 1035 ; test8b: Passing addr-of to function call 1036 ; ssp attribute 1037 ; Requires no protector. 1038 ; Function Attrs: ssp 1039 define void @test8b() #0 { 1040 entry: 1041 ; LINUX-I386-LABEL: test8b: 1042 ; LINUX-I386-NOT: calll __stack_chk_fail 1043 ; LINUX-I386: .cfi_endproc 1044 1045 ; LINUX-X64-LABEL: test8b: 1046 ; LINUX-X64-NOT: callq __stack_chk_fail 1047 ; LINUX-X64: .cfi_endproc 1048 1049 ; LINUX-KERNEL-X64-LABEL: test8b: 1050 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1051 ; LINUX-KERNEL-X64: .cfi_endproc 1052 1053 ; DARWIN-X64-LABEL: test8b: 1054 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1055 ; DARWIN-X64: .cfi_endproc 1056 1057 ; MSVC-I386-LABEL: test8b: 1058 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1059 ; MSVC-I386: retl 1060 %b = alloca i32, align 4 1061 call void @funcall(i32* %b) 1062 ret void 1063 } 1064 1065 ; test8c: Passing addr-of to function call 1066 ; sspstrong attribute 1067 ; Requires protector. 1068 ; Function Attrs: sspstrong 1069 define void @test8c() #1 { 1070 entry: 1071 ; LINUX-I386-LABEL: test8c: 1072 ; LINUX-I386: mov{{l|q}} %gs: 1073 ; LINUX-I386: calll __stack_chk_fail 1074 1075 ; LINUX-X64-LABEL: test8c: 1076 ; LINUX-X64: mov{{l|q}} %fs: 1077 ; LINUX-X64: callq __stack_chk_fail 1078 1079 ; LINUX-KERNEL-X64-LABEL: test8c: 1080 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1081 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1082 1083 ; DARWIN-X64-LABEL: test8c: 1084 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1085 ; DARWIN-X64: callq ___stack_chk_fail 1086 1087 ; MSVC-I386-LABEL: test8c: 1088 ; MSVC-I386: movl ___security_cookie, 1089 ; MSVC-I386: calll @__security_check_cookie@4 1090 %b = alloca i32, align 4 1091 call void @funcall(i32* %b) 1092 ret void 1093 } 1094 1095 ; test8d: Passing addr-of to function call 1096 ; sspreq attribute 1097 ; Requires protector. 1098 ; Function Attrs: sspreq 1099 define void @test8d() #2 { 1100 entry: 1101 ; LINUX-I386-LABEL: test8d: 1102 ; LINUX-I386: mov{{l|q}} %gs: 1103 ; LINUX-I386: calll __stack_chk_fail 1104 1105 ; LINUX-X64-LABEL: test8d: 1106 ; LINUX-X64: mov{{l|q}} %fs: 1107 ; LINUX-X64: callq __stack_chk_fail 1108 1109 ; LINUX-KERNEL-X64-LABEL: test8d: 1110 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1111 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1112 1113 ; DARWIN-X64-LABEL: test8d: 1114 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1115 ; DARWIN-X64: callq ___stack_chk_fail 1116 1117 ; MSVC-I386-LABEL: test8d: 1118 ; MSVC-I386: movl ___security_cookie, 1119 ; MSVC-I386: calll @__security_check_cookie@4 1120 %b = alloca i32, align 4 1121 call void @funcall(i32* %b) 1122 ret void 1123 } 1124 1125 ; test9a: Addr-of in select instruction 1126 ; no ssp attribute 1127 ; Requires no protector. 1128 define void @test9a() { 1129 entry: 1130 ; LINUX-I386-LABEL: test9a: 1131 ; LINUX-I386-NOT: calll __stack_chk_fail 1132 ; LINUX-I386: .cfi_endproc 1133 1134 ; LINUX-X64-LABEL: test9a: 1135 ; LINUX-X64-NOT: callq __stack_chk_fail 1136 ; LINUX-X64: .cfi_endproc 1137 1138 ; LINUX-KERNEL-X64-LABEL: test9a: 1139 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1140 ; LINUX-KERNEL-X64: .cfi_endproc 1141 1142 ; DARWIN-X64-LABEL: test9a: 1143 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1144 ; DARWIN-X64: .cfi_endproc 1145 1146 ; MSVC-I386-LABEL: test9a: 1147 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1148 ; MSVC-I386: retl 1149 %x = alloca double, align 8 1150 %call = call double @testi_aux() 1151 store double %call, double* %x, align 8 1152 %cmp2 = fcmp ogt double %call, 0.000000e+00 1153 %y.1 = select i1 %cmp2, double* %x, double* null 1154 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), double* %y.1) 1155 ret void 1156 } 1157 1158 ; test9b: Addr-of in select instruction 1159 ; ssp attribute 1160 ; Requires no protector. 1161 ; Function Attrs: ssp 1162 define void @test9b() #0 { 1163 entry: 1164 ; LINUX-I386-LABEL: test9b: 1165 ; LINUX-I386-NOT: calll __stack_chk_fail 1166 ; LINUX-I386: .cfi_endproc 1167 1168 ; LINUX-X64-LABEL: test9b: 1169 ; LINUX-X64-NOT: callq __stack_chk_fail 1170 ; LINUX-X64: .cfi_endproc 1171 1172 ; LINUX-KERNEL-X64-LABEL: test9b: 1173 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1174 ; LINUX-KERNEL-X64: .cfi_endproc 1175 1176 ; DARWIN-X64-LABEL: test9b: 1177 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1178 ; DARWIN-X64: .cfi_endproc 1179 1180 ; MSVC-I386-LABEL: test9b: 1181 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1182 ; MSVC-I386: retl 1183 %x = alloca double, align 8 1184 %call = call double @testi_aux() 1185 store double %call, double* %x, align 8 1186 %cmp2 = fcmp ogt double %call, 0.000000e+00 1187 %y.1 = select i1 %cmp2, double* %x, double* null 1188 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), double* %y.1) 1189 ret void 1190 } 1191 1192 ; test9c: Addr-of in select instruction 1193 ; sspstrong attribute 1194 ; Requires protector. 1195 ; Function Attrs: sspstrong 1196 define void @test9c() #1 { 1197 entry: 1198 ; LINUX-I386-LABEL: test9c: 1199 ; LINUX-I386: mov{{l|q}} %gs: 1200 ; LINUX-I386: calll __stack_chk_fail 1201 1202 ; LINUX-X64-LABEL: test9c: 1203 ; LINUX-X64: mov{{l|q}} %fs: 1204 ; LINUX-X64: callq __stack_chk_fail 1205 1206 ; LINUX-KERNEL-X64-LABEL: test9c: 1207 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1208 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1209 1210 ; DARWIN-X64-LABEL: test9c: 1211 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1212 ; DARWIN-X64: callq ___stack_chk_fail 1213 1214 ; MSVC-I386-LABEL: test9c: 1215 ; MSVC-I386: movl ___security_cookie, 1216 ; MSVC-I386: calll @__security_check_cookie@4 1217 %x = alloca double, align 8 1218 %call = call double @testi_aux() 1219 store double %call, double* %x, align 8 1220 %cmp2 = fcmp ogt double %call, 0.000000e+00 1221 %y.1 = select i1 %cmp2, double* %x, double* null 1222 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), double* %y.1) 1223 ret void 1224 } 1225 1226 ; test9d: Addr-of in select instruction 1227 ; sspreq attribute 1228 ; Requires protector. 1229 ; Function Attrs: sspreq 1230 define void @test9d() #2 { 1231 entry: 1232 ; LINUX-I386-LABEL: test9d: 1233 ; LINUX-I386: mov{{l|q}} %gs: 1234 ; LINUX-I386: calll __stack_chk_fail 1235 1236 ; LINUX-X64-LABEL: test9d: 1237 ; LINUX-X64: mov{{l|q}} %fs: 1238 ; LINUX-X64: callq __stack_chk_fail 1239 1240 ; LINUX-KERNEL-X64-LABEL: test9d: 1241 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1242 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1243 1244 ; DARWIN-X64-LABEL: test9d: 1245 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1246 ; DARWIN-X64: callq ___stack_chk_fail 1247 1248 ; MSVC-I386-LABEL: test9d: 1249 ; MSVC-I386: movl ___security_cookie, 1250 ; MSVC-I386: calll @__security_check_cookie@4 1251 %x = alloca double, align 8 1252 %call = call double @testi_aux() 1253 store double %call, double* %x, align 8 1254 %cmp2 = fcmp ogt double %call, 0.000000e+00 1255 %y.1 = select i1 %cmp2, double* %x, double* null 1256 %call2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), double* %y.1) 1257 ret void 1258 } 1259 1260 ; test10a: Addr-of in phi instruction 1261 ; no ssp attribute 1262 ; Requires no protector. 1263 define void @test10a() { 1264 entry: 1265 ; LINUX-I386-LABEL: test10a: 1266 ; LINUX-I386-NOT: calll __stack_chk_fail 1267 ; LINUX-I386: .cfi_endproc 1268 1269 ; LINUX-X64-LABEL: test10a: 1270 ; LINUX-X64-NOT: callq __stack_chk_fail 1271 ; LINUX-X64: .cfi_endproc 1272 1273 ; LINUX-KERNEL-X64-LABEL: test10a: 1274 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1275 ; LINUX-KERNEL-X64: .cfi_endproc 1276 1277 ; DARWIN-X64-LABEL: test10a: 1278 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1279 ; DARWIN-X64: .cfi_endproc 1280 1281 ; MSVC-I386-LABEL: test10a: 1282 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1283 ; MSVC-I386: retl 1284 %x = alloca double, align 8 1285 %call = call double @testi_aux() 1286 store double %call, double* %x, align 8 1287 %cmp = fcmp ogt double %call, 3.140000e+00 1288 br i1 %cmp, label %if.then, label %if.else 1289 1290 if.then: ; preds = %entry 1291 %call1 = call double @testi_aux() 1292 store double %call1, double* %x, align 8 1293 br label %if.end4 1294 1295 if.else: ; preds = %entry 1296 %cmp2 = fcmp ogt double %call, 1.000000e+00 1297 br i1 %cmp2, label %if.then3, label %if.end4 1298 1299 if.then3: ; preds = %if.else 1300 br label %if.end4 1301 1302 if.end4: ; preds = %if.else, %if.then3, %if.then 1303 %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ] 1304 %call5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double* %y.0) 1305 ret void 1306 } 1307 1308 ; test10b: Addr-of in phi instruction 1309 ; ssp attribute 1310 ; Requires no protector. 1311 ; Function Attrs: ssp 1312 define void @test10b() #0 { 1313 entry: 1314 ; LINUX-I386-LABEL: test10b: 1315 ; LINUX-I386-NOT: calll __stack_chk_fail 1316 ; LINUX-I386: .cfi_endproc 1317 1318 ; LINUX-X64-LABEL: test10b: 1319 ; LINUX-X64-NOT: callq __stack_chk_fail 1320 ; LINUX-X64: .cfi_endproc 1321 1322 ; LINUX-KERNEL-X64-LABEL: test10b: 1323 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1324 ; LINUX-KERNEL-X64: .cfi_endproc 1325 1326 ; DARWIN-X64-LABEL: test10b: 1327 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1328 ; DARWIN-X64: .cfi_endproc 1329 1330 ; MSVC-I386-LABEL: test10b: 1331 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1332 ; MSVC-I386: retl 1333 %x = alloca double, align 8 1334 %call = call double @testi_aux() 1335 store double %call, double* %x, align 8 1336 %cmp = fcmp ogt double %call, 3.140000e+00 1337 br i1 %cmp, label %if.then, label %if.else 1338 1339 if.then: ; preds = %entry 1340 %call1 = call double @testi_aux() 1341 store double %call1, double* %x, align 8 1342 br label %if.end4 1343 1344 if.else: ; preds = %entry 1345 %cmp2 = fcmp ogt double %call, 1.000000e+00 1346 br i1 %cmp2, label %if.then3, label %if.end4 1347 1348 if.then3: ; preds = %if.else 1349 br label %if.end4 1350 1351 if.end4: ; preds = %if.else, %if.then3, %if.then 1352 %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ] 1353 %call5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double* %y.0) 1354 ret void 1355 } 1356 1357 ; test10c: Addr-of in phi instruction 1358 ; sspstrong attribute 1359 ; Requires protector. 1360 ; Function Attrs: sspstrong 1361 define void @test10c() #1 { 1362 entry: 1363 ; LINUX-I386-LABEL: test10c: 1364 ; LINUX-I386: mov{{l|q}} %gs: 1365 ; LINUX-I386: calll __stack_chk_fail 1366 1367 ; LINUX-X64-LABEL: test10c: 1368 ; LINUX-X64: mov{{l|q}} %fs: 1369 ; LINUX-X64: callq __stack_chk_fail 1370 1371 ; LINUX-KERNEL-X64-LABEL: test10c: 1372 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1373 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1374 1375 ; DARWIN-X64-LABEL: test10c: 1376 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1377 ; DARWIN-X64: callq ___stack_chk_fail 1378 1379 ; MSVC-I386-LABEL: test10c: 1380 ; MSVC-I386: movl ___security_cookie, 1381 ; MSVC-I386: calll @__security_check_cookie@4 1382 %x = alloca double, align 8 1383 %call = call double @testi_aux() 1384 store double %call, double* %x, align 8 1385 %cmp = fcmp ogt double %call, 3.140000e+00 1386 br i1 %cmp, label %if.then, label %if.else 1387 1388 if.then: ; preds = %entry 1389 %call1 = call double @testi_aux() 1390 store double %call1, double* %x, align 8 1391 br label %if.end4 1392 1393 if.else: ; preds = %entry 1394 %cmp2 = fcmp ogt double %call, 1.000000e+00 1395 br i1 %cmp2, label %if.then3, label %if.end4 1396 1397 if.then3: ; preds = %if.else 1398 br label %if.end4 1399 1400 if.end4: ; preds = %if.else, %if.then3, %if.then 1401 %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ] 1402 %call5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double* %y.0) 1403 ret void 1404 } 1405 1406 ; test10d: Addr-of in phi instruction 1407 ; sspreq attribute 1408 ; Requires protector. 1409 ; Function Attrs: sspreq 1410 define void @test10d() #2 { 1411 entry: 1412 ; LINUX-I386-LABEL: test10d: 1413 ; LINUX-I386: mov{{l|q}} %gs: 1414 ; LINUX-I386: calll __stack_chk_fail 1415 1416 ; LINUX-X64-LABEL: test10d: 1417 ; LINUX-X64: mov{{l|q}} %fs: 1418 ; LINUX-X64: callq __stack_chk_fail 1419 1420 ; LINUX-KERNEL-X64-LABEL: test10d: 1421 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1422 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1423 1424 ; DARWIN-X64-LABEL: test10d: 1425 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1426 ; DARWIN-X64: callq ___stack_chk_fail 1427 1428 ; MSVC-I386-LABEL: test10d: 1429 ; MSVC-I386: movl ___security_cookie, 1430 ; MSVC-I386: calll @__security_check_cookie@4 1431 %x = alloca double, align 8 1432 %call = call double @testi_aux() 1433 store double %call, double* %x, align 8 1434 %cmp = fcmp ogt double %call, 3.140000e+00 1435 br i1 %cmp, label %if.then, label %if.else 1436 1437 if.then: ; preds = %entry 1438 %call1 = call double @testi_aux() 1439 store double %call1, double* %x, align 8 1440 br label %if.end4 1441 1442 if.else: ; preds = %entry 1443 %cmp2 = fcmp ogt double %call, 1.000000e+00 1444 br i1 %cmp2, label %if.then3, label %if.end4 1445 1446 if.then3: ; preds = %if.else 1447 br label %if.end4 1448 1449 if.end4: ; preds = %if.else, %if.then3, %if.then 1450 %y.0 = phi double* [ null, %if.then ], [ %x, %if.then3 ], [ null, %if.else ] 1451 %call5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double* %y.0) 1452 ret void 1453 } 1454 1455 ; test11a: Addr-of struct element. (GEP followed by store). 1456 ; no ssp attribute 1457 ; Requires no protector. 1458 define void @test11a() { 1459 entry: 1460 ; LINUX-I386-LABEL: test11a: 1461 ; LINUX-I386-NOT: calll __stack_chk_fail 1462 ; LINUX-I386: .cfi_endproc 1463 1464 ; LINUX-X64-LABEL: test11a: 1465 ; LINUX-X64-NOT: callq __stack_chk_fail 1466 ; LINUX-X64: .cfi_endproc 1467 1468 ; LINUX-KERNEL-X64-LABEL: test11a: 1469 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1470 ; LINUX-KERNEL-X64: .cfi_endproc 1471 1472 ; DARWIN-X64-LABEL: test11a: 1473 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1474 ; DARWIN-X64: .cfi_endproc 1475 1476 ; MSVC-I386-LABEL: test11a: 1477 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1478 ; MSVC-I386: retl 1479 %c = alloca %struct.pair, align 4 1480 %b = alloca i32*, align 8 1481 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 1 1482 store i32* %y, i32** %b, align 8 1483 %0 = load i32*, i32** %b, align 8 1484 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32* %0) 1485 ret void 1486 } 1487 1488 ; test11b: Addr-of struct element. (GEP followed by store). 1489 ; ssp attribute 1490 ; Requires no protector. 1491 ; Function Attrs: ssp 1492 define void @test11b() #0 { 1493 entry: 1494 ; LINUX-I386-LABEL: test11b: 1495 ; LINUX-I386-NOT: calll __stack_chk_fail 1496 ; LINUX-I386: .cfi_endproc 1497 1498 ; LINUX-X64-LABEL: test11b: 1499 ; LINUX-X64-NOT: callq __stack_chk_fail 1500 ; LINUX-X64: .cfi_endproc 1501 1502 ; LINUX-KERNEL-X64-LABEL: test11b: 1503 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1504 ; LINUX-KERNEL-X64: .cfi_endproc 1505 1506 ; DARWIN-X64-LABEL: test11b: 1507 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1508 ; DARWIN-X64: .cfi_endproc 1509 1510 ; MSVC-I386-LABEL: test11b: 1511 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1512 ; MSVC-I386: retl 1513 %c = alloca %struct.pair, align 4 1514 %b = alloca i32*, align 8 1515 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 1 1516 store i32* %y, i32** %b, align 8 1517 %0 = load i32*, i32** %b, align 8 1518 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32* %0) 1519 ret void 1520 } 1521 1522 ; test11c: Addr-of struct element. (GEP followed by store). 1523 ; sspstrong attribute 1524 ; Requires protector. 1525 ; Function Attrs: sspstrong 1526 define void @test11c() #1 { 1527 entry: 1528 ; LINUX-I386-LABEL: test11c: 1529 ; LINUX-I386: mov{{l|q}} %gs: 1530 ; LINUX-I386: calll __stack_chk_fail 1531 1532 ; LINUX-X64-LABEL: test11c: 1533 ; LINUX-X64: mov{{l|q}} %fs: 1534 ; LINUX-X64: callq __stack_chk_fail 1535 1536 ; LINUX-KERNEL-X64-LABEL: test11c: 1537 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1538 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1539 1540 ; DARWIN-X64-LABEL: test11c: 1541 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1542 ; DARWIN-X64: callq ___stack_chk_fail 1543 1544 ; MSVC-I386-LABEL: test11c: 1545 ; MSVC-I386: movl ___security_cookie, 1546 ; MSVC-I386: calll @__security_check_cookie@4 1547 %c = alloca %struct.pair, align 4 1548 %b = alloca i32*, align 8 1549 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 1 1550 store i32* %y, i32** %b, align 8 1551 %0 = load i32*, i32** %b, align 8 1552 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32* %0) 1553 ret void 1554 } 1555 1556 ; test11d: Addr-of struct element. (GEP followed by store). 1557 ; sspreq attribute 1558 ; Requires protector. 1559 ; Function Attrs: sspreq 1560 define void @test11d() #2 { 1561 entry: 1562 ; LINUX-I386-LABEL: test11d: 1563 ; LINUX-I386: mov{{l|q}} %gs: 1564 ; LINUX-I386: calll __stack_chk_fail 1565 1566 ; LINUX-X64-LABEL: test11d: 1567 ; LINUX-X64: mov{{l|q}} %fs: 1568 ; LINUX-X64: callq __stack_chk_fail 1569 1570 ; LINUX-KERNEL-X64-LABEL: test11d: 1571 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1572 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1573 1574 ; DARWIN-X64-LABEL: test11d: 1575 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1576 ; DARWIN-X64: callq ___stack_chk_fail 1577 1578 ; MSVC-I386-LABEL: test11d: 1579 ; MSVC-I386: movl ___security_cookie, 1580 ; MSVC-I386: calll @__security_check_cookie@4 1581 %c = alloca %struct.pair, align 4 1582 %b = alloca i32*, align 8 1583 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 1 1584 store i32* %y, i32** %b, align 8 1585 %0 = load i32*, i32** %b, align 8 1586 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32* %0) 1587 ret void 1588 } 1589 1590 ; test12a: Addr-of struct element, GEP followed by ptrtoint. 1591 ; no ssp attribute 1592 ; Requires no protector. 1593 define void @test12a() { 1594 entry: 1595 ; LINUX-I386-LABEL: test12a: 1596 ; LINUX-I386-NOT: calll __stack_chk_fail 1597 ; LINUX-I386: .cfi_endproc 1598 1599 ; LINUX-X64-LABEL: test12a: 1600 ; LINUX-X64-NOT: callq __stack_chk_fail 1601 ; LINUX-X64: .cfi_endproc 1602 1603 ; LINUX-KERNEL-X64-LABEL: test12a: 1604 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1605 ; LINUX-KERNEL-X64: .cfi_endproc 1606 1607 ; DARWIN-X64-LABEL: test12a: 1608 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1609 ; DARWIN-X64: .cfi_endproc 1610 1611 ; MSVC-I386-LABEL: test12a: 1612 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1613 ; MSVC-I386: retl 1614 %c = alloca %struct.pair, align 4 1615 %b = alloca i32*, align 8 1616 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 1 1617 %0 = ptrtoint i32* %y to i64 1618 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 %0) 1619 ret void 1620 } 1621 1622 ; test12b: Addr-of struct element, GEP followed by ptrtoint. 1623 ; ssp attribute 1624 ; Requires no protector. 1625 ; Function Attrs: ssp 1626 define void @test12b() #0 { 1627 entry: 1628 ; LINUX-I386-LABEL: test12b: 1629 ; LINUX-I386-NOT: calll __stack_chk_fail 1630 ; LINUX-I386: .cfi_endproc 1631 1632 ; LINUX-X64-LABEL: test12b: 1633 ; LINUX-X64-NOT: callq __stack_chk_fail 1634 ; LINUX-X64: .cfi_endproc 1635 1636 ; LINUX-KERNEL-X64-LABEL: test12b: 1637 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1638 ; LINUX-KERNEL-X64: .cfi_endproc 1639 1640 ; DARWIN-X64-LABEL: test12b: 1641 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1642 ; DARWIN-X64: .cfi_endproc 1643 1644 ; MSVC-I386-LABEL: test12b: 1645 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1646 ; MSVC-I386: retl 1647 %c = alloca %struct.pair, align 4 1648 %b = alloca i32*, align 8 1649 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 1 1650 %0 = ptrtoint i32* %y to i64 1651 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 %0) 1652 ret void 1653 } 1654 1655 ; test12c: Addr-of struct element, GEP followed by ptrtoint. 1656 ; sspstrong attribute 1657 ; Function Attrs: sspstrong 1658 define void @test12c() #1 { 1659 entry: 1660 ; LINUX-I386-LABEL: test12c: 1661 ; LINUX-I386: mov{{l|q}} %gs: 1662 ; LINUX-I386: calll __stack_chk_fail 1663 1664 ; LINUX-X64-LABEL: test12c: 1665 ; LINUX-X64: mov{{l|q}} %fs: 1666 ; LINUX-X64: callq __stack_chk_fail 1667 1668 ; LINUX-KERNEL-X64-LABEL: test12c: 1669 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1670 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1671 1672 ; DARWIN-X64-LABEL: test12c: 1673 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1674 ; DARWIN-X64: callq ___stack_chk_fail 1675 1676 ; MSVC-I386-LABEL: test12c: 1677 ; MSVC-I386: movl ___security_cookie, 1678 ; MSVC-I386: calll @__security_check_cookie@4 1679 %c = alloca %struct.pair, align 4 1680 %b = alloca i32*, align 8 1681 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 1 1682 %0 = ptrtoint i32* %y to i64 1683 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 %0) 1684 ret void 1685 } 1686 1687 ; test12d: Addr-of struct element, GEP followed by ptrtoint. 1688 ; sspreq attribute 1689 ; Requires protector. 1690 ; Function Attrs: sspreq 1691 define void @test12d() #2 { 1692 entry: 1693 ; LINUX-I386-LABEL: test12d: 1694 ; LINUX-I386: mov{{l|q}} %gs: 1695 ; LINUX-I386: calll __stack_chk_fail 1696 1697 ; LINUX-X64-LABEL: test12d: 1698 ; LINUX-X64: mov{{l|q}} %fs: 1699 ; LINUX-X64: callq __stack_chk_fail 1700 1701 ; LINUX-KERNEL-X64-LABEL: test12d: 1702 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1703 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1704 1705 ; DARWIN-X64-LABEL: test12d: 1706 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1707 ; DARWIN-X64: callq ___stack_chk_fail 1708 1709 ; MSVC-I386-LABEL: test12d: 1710 ; MSVC-I386: movl ___security_cookie, 1711 ; MSVC-I386: calll @__security_check_cookie@4 1712 %c = alloca %struct.pair, align 4 1713 %b = alloca i32*, align 8 1714 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 1 1715 %0 = ptrtoint i32* %y to i64 1716 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 %0) 1717 ret void 1718 } 1719 1720 ; test13a: Addr-of struct element, GEP followed by callinst. 1721 ; no ssp attribute 1722 ; Requires no protector. 1723 define void @test13a() { 1724 entry: 1725 ; LINUX-I386-LABEL: test13a: 1726 ; LINUX-I386-NOT: calll __stack_chk_fail 1727 ; LINUX-I386: .cfi_endproc 1728 1729 ; LINUX-X64-LABEL: test13a: 1730 ; LINUX-X64-NOT: callq __stack_chk_fail 1731 ; LINUX-X64: .cfi_endproc 1732 1733 ; LINUX-KERNEL-X64-LABEL: test13a: 1734 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1735 ; LINUX-KERNEL-X64: .cfi_endproc 1736 1737 ; DARWIN-X64-LABEL: test13a: 1738 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1739 ; DARWIN-X64: .cfi_endproc 1740 1741 ; MSVC-I386-LABEL: test13a: 1742 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1743 ; MSVC-I386: retl 1744 %c = alloca %struct.pair, align 4 1745 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i64 0, i32 1 1746 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32* %y) 1747 ret void 1748 } 1749 1750 ; test13b: Addr-of struct element, GEP followed by callinst. 1751 ; ssp attribute 1752 ; Requires no protector. 1753 ; Function Attrs: ssp 1754 define void @test13b() #0 { 1755 entry: 1756 ; LINUX-I386-LABEL: test13b: 1757 ; LINUX-I386-NOT: calll __stack_chk_fail 1758 ; LINUX-I386: .cfi_endproc 1759 1760 ; LINUX-X64-LABEL: test13b: 1761 ; LINUX-X64-NOT: callq __stack_chk_fail 1762 ; LINUX-X64: .cfi_endproc 1763 1764 ; LINUX-KERNEL-X64-LABEL: test13b: 1765 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1766 ; LINUX-KERNEL-X64: .cfi_endproc 1767 1768 ; DARWIN-X64-LABEL: test13b: 1769 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1770 ; DARWIN-X64: .cfi_endproc 1771 1772 ; MSVC-I386-LABEL: test13b: 1773 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1774 ; MSVC-I386: retl 1775 %c = alloca %struct.pair, align 4 1776 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i64 0, i32 1 1777 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32* %y) 1778 ret void 1779 } 1780 1781 ; test13c: Addr-of struct element, GEP followed by callinst. 1782 ; sspstrong attribute 1783 ; Requires protector. 1784 ; Function Attrs: sspstrong 1785 define void @test13c() #1 { 1786 entry: 1787 ; LINUX-I386-LABEL: test13c: 1788 ; LINUX-I386: mov{{l|q}} %gs: 1789 ; LINUX-I386: calll __stack_chk_fail 1790 1791 ; LINUX-X64-LABEL: test13c: 1792 ; LINUX-X64: mov{{l|q}} %fs: 1793 ; LINUX-X64: callq __stack_chk_fail 1794 1795 ; LINUX-KERNEL-X64-LABEL: test13c: 1796 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1797 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1798 1799 ; DARWIN-X64-LABEL: test13c: 1800 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1801 ; DARWIN-X64: callq ___stack_chk_fail 1802 1803 ; MSVC-I386-LABEL: test13c: 1804 ; MSVC-I386: movl ___security_cookie, 1805 ; MSVC-I386: calll @__security_check_cookie@4 1806 %c = alloca %struct.pair, align 4 1807 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i64 0, i32 1 1808 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32* %y) 1809 ret void 1810 } 1811 1812 ; test13d: Addr-of struct element, GEP followed by callinst. 1813 ; sspreq attribute 1814 ; Requires protector. 1815 ; Function Attrs: sspreq 1816 define void @test13d() #2 { 1817 entry: 1818 ; LINUX-I386-LABEL: test13d: 1819 ; LINUX-I386: mov{{l|q}} %gs: 1820 ; LINUX-I386: calll __stack_chk_fail 1821 1822 ; LINUX-X64-LABEL: test13d: 1823 ; LINUX-X64: mov{{l|q}} %fs: 1824 ; LINUX-X64: callq __stack_chk_fail 1825 1826 ; LINUX-KERNEL-X64-LABEL: test13d: 1827 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1828 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1829 1830 ; DARWIN-X64-LABEL: test13d: 1831 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1832 ; DARWIN-X64: callq ___stack_chk_fail 1833 1834 ; MSVC-I386-LABEL: test13d: 1835 ; MSVC-I386: movl ___security_cookie, 1836 ; MSVC-I386: calll @__security_check_cookie@4 1837 %c = alloca %struct.pair, align 4 1838 %y = getelementptr inbounds %struct.pair, %struct.pair* %c, i64 0, i32 1 1839 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32* %y) 1840 ret void 1841 } 1842 1843 ; test14a: Addr-of a local, optimized into a GEP (e.g., &a - 12) 1844 ; no ssp attribute 1845 ; Requires no protector. 1846 define void @test14a() { 1847 entry: 1848 ; LINUX-I386-LABEL: test14a: 1849 ; LINUX-I386-NOT: calll __stack_chk_fail 1850 ; LINUX-I386: .cfi_endproc 1851 1852 ; LINUX-X64-LABEL: test14a: 1853 ; LINUX-X64-NOT: callq __stack_chk_fail 1854 ; LINUX-X64: .cfi_endproc 1855 1856 ; LINUX-KERNEL-X64-LABEL: test14a: 1857 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1858 ; LINUX-KERNEL-X64: .cfi_endproc 1859 1860 ; DARWIN-X64-LABEL: test14a: 1861 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1862 ; DARWIN-X64: .cfi_endproc 1863 1864 ; MSVC-I386-LABEL: test14a: 1865 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1866 ; MSVC-I386: retl 1867 %a = alloca i32, align 4 1868 %add.ptr5 = getelementptr inbounds i32, i32* %a, i64 -12 1869 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) 1870 ret void 1871 } 1872 1873 ; test14b: Addr-of a local, optimized into a GEP (e.g., &a - 12) 1874 ; ssp attribute 1875 ; Requires no protector. 1876 ; Function Attrs: ssp 1877 define void @test14b() #0 { 1878 entry: 1879 ; LINUX-I386-LABEL: test14b: 1880 ; LINUX-I386-NOT: calll __stack_chk_fail 1881 ; LINUX-I386: .cfi_endproc 1882 1883 ; LINUX-X64-LABEL: test14b: 1884 ; LINUX-X64-NOT: callq __stack_chk_fail 1885 ; LINUX-X64: .cfi_endproc 1886 1887 ; LINUX-KERNEL-X64-LABEL: test14b: 1888 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1889 ; LINUX-KERNEL-X64: .cfi_endproc 1890 1891 ; DARWIN-X64-LABEL: test14b: 1892 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1893 ; DARWIN-X64: .cfi_endproc 1894 1895 ; MSVC-I386-LABEL: test14b: 1896 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1897 ; MSVC-I386: retl 1898 %a = alloca i32, align 4 1899 %add.ptr5 = getelementptr inbounds i32, i32* %a, i64 -12 1900 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) 1901 ret void 1902 } 1903 1904 ; test14c: Addr-of a local, optimized into a GEP (e.g., &a - 12) 1905 ; sspstrong attribute 1906 ; Requires protector. 1907 ; Function Attrs: sspstrong 1908 define void @test14c() #1 { 1909 entry: 1910 ; LINUX-I386-LABEL: test14c: 1911 ; LINUX-I386: mov{{l|q}} %gs: 1912 ; LINUX-I386: calll __stack_chk_fail 1913 1914 ; LINUX-X64-LABEL: test14c: 1915 ; LINUX-X64: mov{{l|q}} %fs: 1916 ; LINUX-X64: callq __stack_chk_fail 1917 1918 ; LINUX-KERNEL-X64-LABEL: test14c: 1919 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1920 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1921 1922 ; DARWIN-X64-LABEL: test14c: 1923 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1924 ; DARWIN-X64: callq ___stack_chk_fail 1925 1926 ; MSVC-I386-LABEL: test14c: 1927 ; MSVC-I386: movl ___security_cookie, 1928 ; MSVC-I386: calll @__security_check_cookie@4 1929 %a = alloca i32, align 4 1930 %add.ptr5 = getelementptr inbounds i32, i32* %a, i64 -12 1931 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) 1932 ret void 1933 } 1934 1935 ; test14d: Addr-of a local, optimized into a GEP (e.g., &a - 12) 1936 ; sspreq attribute 1937 ; Requires protector. 1938 ; Function Attrs: sspreq 1939 define void @test14d() #2 { 1940 entry: 1941 ; LINUX-I386-LABEL: test14d: 1942 ; LINUX-I386: mov{{l|q}} %gs: 1943 ; LINUX-I386: calll __stack_chk_fail 1944 1945 ; LINUX-X64-LABEL: test14d: 1946 ; LINUX-X64: mov{{l|q}} %fs: 1947 ; LINUX-X64: callq __stack_chk_fail 1948 1949 ; LINUX-KERNEL-X64-LABEL: test14d: 1950 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 1951 ; LINUX-KERNEL-X64: callq __stack_chk_fail 1952 1953 ; DARWIN-X64-LABEL: test14d: 1954 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 1955 ; DARWIN-X64: callq ___stack_chk_fail 1956 1957 ; MSVC-I386-LABEL: test14d: 1958 ; MSVC-I386: movl ___security_cookie, 1959 ; MSVC-I386: calll @__security_check_cookie@4 1960 %a = alloca i32, align 4 1961 %add.ptr5 = getelementptr inbounds i32, i32* %a, i64 -12 1962 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32* %add.ptr5) 1963 ret void 1964 } 1965 1966 ; test15a: Addr-of a local cast to a ptr of a different type 1967 ; (e.g., int a; ... ; float *b = &a;) 1968 ; no ssp attribute 1969 ; Requires no protector. 1970 define void @test15a() { 1971 entry: 1972 ; LINUX-I386-LABEL: test15a: 1973 ; LINUX-I386-NOT: calll __stack_chk_fail 1974 ; LINUX-I386: .cfi_endproc 1975 1976 ; LINUX-X64-LABEL: test15a: 1977 ; LINUX-X64-NOT: callq __stack_chk_fail 1978 ; LINUX-X64: .cfi_endproc 1979 1980 ; LINUX-KERNEL-X64-LABEL: test15a: 1981 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 1982 ; LINUX-KERNEL-X64: .cfi_endproc 1983 1984 ; DARWIN-X64-LABEL: test15a: 1985 ; DARWIN-X64-NOT: callq ___stack_chk_fail 1986 ; DARWIN-X64: .cfi_endproc 1987 1988 ; MSVC-I386-LABEL: test15a: 1989 ; MSVC-I386-NOT: calll @__security_check_cookie@4 1990 ; MSVC-I386: retl 1991 %a = alloca i32, align 4 1992 %b = alloca float*, align 8 1993 store i32 0, i32* %a, align 4 1994 %0 = bitcast i32* %a to float* 1995 store float* %0, float** %b, align 8 1996 %1 = load float*, float** %b, align 8 1997 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), float* %1) 1998 ret void 1999 } 2000 2001 ; test15b: Addr-of a local cast to a ptr of a different type 2002 ; (e.g., int a; ... ; float *b = &a;) 2003 ; ssp attribute 2004 ; Requires no protector. 2005 ; Function Attrs: ssp 2006 define void @test15b() #0 { 2007 entry: 2008 ; LINUX-I386-LABEL: test15b: 2009 ; LINUX-I386-NOT: calll __stack_chk_fail 2010 ; LINUX-I386: .cfi_endproc 2011 2012 ; LINUX-X64-LABEL: test15b: 2013 ; LINUX-X64-NOT: callq __stack_chk_fail 2014 ; LINUX-X64: .cfi_endproc 2015 2016 ; LINUX-KERNEL-X64-LABEL: test15b: 2017 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2018 ; LINUX-KERNEL-X64: .cfi_endproc 2019 2020 ; DARWIN-X64-LABEL: test15b: 2021 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2022 ; DARWIN-X64: .cfi_endproc 2023 2024 ; MSVC-I386-LABEL: test15b: 2025 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2026 ; MSVC-I386: retl 2027 %a = alloca i32, align 4 2028 %b = alloca float*, align 8 2029 store i32 0, i32* %a, align 4 2030 %0 = bitcast i32* %a to float* 2031 store float* %0, float** %b, align 8 2032 %1 = load float*, float** %b, align 8 2033 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), float* %1) 2034 ret void 2035 } 2036 2037 ; test15c: Addr-of a local cast to a ptr of a different type 2038 ; (e.g., int a; ... ; float *b = &a;) 2039 ; sspstrong attribute 2040 ; Requires protector. 2041 ; Function Attrs: sspstrong 2042 define void @test15c() #1 { 2043 entry: 2044 ; LINUX-I386-LABEL: test15c: 2045 ; LINUX-I386: mov{{l|q}} %gs: 2046 ; LINUX-I386: calll __stack_chk_fail 2047 2048 ; LINUX-X64-LABEL: test15c: 2049 ; LINUX-X64: mov{{l|q}} %fs: 2050 ; LINUX-X64: callq __stack_chk_fail 2051 2052 ; LINUX-KERNEL-X64-LABEL: test15c: 2053 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2054 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2055 2056 ; DARWIN-X64-LABEL: test15c: 2057 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2058 ; DARWIN-X64: callq ___stack_chk_fail 2059 2060 ; MSVC-I386-LABEL: test15c: 2061 ; MSVC-I386: movl ___security_cookie, 2062 ; MSVC-I386: calll @__security_check_cookie@4 2063 %a = alloca i32, align 4 2064 %b = alloca float*, align 8 2065 store i32 0, i32* %a, align 4 2066 %0 = bitcast i32* %a to float* 2067 store float* %0, float** %b, align 8 2068 %1 = load float*, float** %b, align 8 2069 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), float* %1) 2070 ret void 2071 } 2072 2073 ; test15d: Addr-of a local cast to a ptr of a different type 2074 ; (e.g., int a; ... ; float *b = &a;) 2075 ; sspreq attribute 2076 ; Requires protector. 2077 ; Function Attrs: sspreq 2078 define void @test15d() #2 { 2079 entry: 2080 ; LINUX-I386-LABEL: test15d: 2081 ; LINUX-I386: mov{{l|q}} %gs: 2082 ; LINUX-I386: calll __stack_chk_fail 2083 2084 ; LINUX-X64-LABEL: test15d: 2085 ; LINUX-X64: mov{{l|q}} %fs: 2086 ; LINUX-X64: callq __stack_chk_fail 2087 2088 ; LINUX-KERNEL-X64-LABEL: test15d: 2089 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2090 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2091 2092 ; DARWIN-X64-LABEL: test15d: 2093 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2094 ; DARWIN-X64: callq ___stack_chk_fail 2095 2096 ; MSVC-I386-LABEL: test15d: 2097 ; MSVC-I386: movl ___security_cookie, 2098 ; MSVC-I386: calll @__security_check_cookie@4 2099 %a = alloca i32, align 4 2100 %b = alloca float*, align 8 2101 store i32 0, i32* %a, align 4 2102 %0 = bitcast i32* %a to float* 2103 store float* %0, float** %b, align 8 2104 %1 = load float*, float** %b, align 8 2105 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), float* %1) 2106 ret void 2107 } 2108 2109 ; test16a: Addr-of a local cast to a ptr of a different type (optimized) 2110 ; (e.g., int a; ... ; float *b = &a;) 2111 ; no ssp attribute 2112 ; Requires no protector. 2113 define void @test16a() { 2114 entry: 2115 ; LINUX-I386-LABEL: test16a: 2116 ; LINUX-I386-NOT: calll __stack_chk_fail 2117 ; LINUX-I386: .cfi_endproc 2118 2119 ; LINUX-X64-LABEL: test16a: 2120 ; LINUX-X64-NOT: callq __stack_chk_fail 2121 ; LINUX-X64: .cfi_endproc 2122 2123 ; LINUX-KERNEL-X64-LABEL: test16a: 2124 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2125 ; LINUX-KERNEL-X64: .cfi_endproc 2126 2127 ; DARWIN-X64-LABEL: test16a: 2128 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2129 ; DARWIN-X64: .cfi_endproc 2130 2131 ; MSVC-I386-LABEL: test16a: 2132 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2133 ; MSVC-I386: retl 2134 %a = alloca i32, align 4 2135 store i32 0, i32* %a, align 4 2136 %0 = bitcast i32* %a to float* 2137 call void @funfloat(float* %0) 2138 ret void 2139 } 2140 2141 ; test16b: Addr-of a local cast to a ptr of a different type (optimized) 2142 ; (e.g., int a; ... ; float *b = &a;) 2143 ; ssp attribute 2144 ; Requires no protector. 2145 ; Function Attrs: ssp 2146 define void @test16b() #0 { 2147 entry: 2148 ; LINUX-I386-LABEL: test16b: 2149 ; LINUX-I386-NOT: calll __stack_chk_fail 2150 ; LINUX-I386: .cfi_endproc 2151 2152 ; LINUX-X64-LABEL: test16b: 2153 ; LINUX-X64-NOT: callq __stack_chk_fail 2154 ; LINUX-X64: .cfi_endproc 2155 2156 ; LINUX-KERNEL-X64-LABEL: test16b: 2157 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2158 ; LINUX-KERNEL-X64: .cfi_endproc 2159 2160 ; DARWIN-X64-LABEL: test16b: 2161 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2162 ; DARWIN-X64: .cfi_endproc 2163 2164 ; MSVC-I386-LABEL: test16b: 2165 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2166 ; MSVC-I386: retl 2167 %a = alloca i32, align 4 2168 store i32 0, i32* %a, align 4 2169 %0 = bitcast i32* %a to float* 2170 call void @funfloat(float* %0) 2171 ret void 2172 } 2173 2174 ; test16c: Addr-of a local cast to a ptr of a different type (optimized) 2175 ; (e.g., int a; ... ; float *b = &a;) 2176 ; sspstrong attribute 2177 ; Requires protector. 2178 ; Function Attrs: sspstrong 2179 define void @test16c() #1 { 2180 entry: 2181 ; LINUX-I386-LABEL: test16c: 2182 ; LINUX-I386: mov{{l|q}} %gs: 2183 ; LINUX-I386: calll __stack_chk_fail 2184 2185 ; LINUX-X64-LABEL: test16c: 2186 ; LINUX-X64: mov{{l|q}} %fs: 2187 ; LINUX-X64: callq __stack_chk_fail 2188 2189 ; LINUX-KERNEL-X64-LABEL: test16c: 2190 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2191 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2192 2193 ; DARWIN-X64-LABEL: test16c: 2194 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2195 ; DARWIN-X64: callq ___stack_chk_fail 2196 2197 ; MSVC-I386-LABEL: test16c: 2198 ; MSVC-I386: movl ___security_cookie, 2199 ; MSVC-I386: calll @__security_check_cookie@4 2200 %a = alloca i32, align 4 2201 store i32 0, i32* %a, align 4 2202 %0 = bitcast i32* %a to float* 2203 call void @funfloat(float* %0) 2204 ret void 2205 } 2206 2207 ; test16d: Addr-of a local cast to a ptr of a different type (optimized) 2208 ; (e.g., int a; ... ; float *b = &a;) 2209 ; sspreq attribute 2210 ; Requires protector. 2211 ; Function Attrs: sspreq 2212 define void @test16d() #2 { 2213 entry: 2214 ; LINUX-I386-LABEL: test16d: 2215 ; LINUX-I386: mov{{l|q}} %gs: 2216 ; LINUX-I386: calll __stack_chk_fail 2217 2218 ; LINUX-X64-LABEL: test16d: 2219 ; LINUX-X64: mov{{l|q}} %fs: 2220 ; LINUX-X64: callq __stack_chk_fail 2221 2222 ; LINUX-KERNEL-X64-LABEL: test16d: 2223 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2224 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2225 2226 ; DARWIN-X64-LABEL: test16d: 2227 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2228 ; DARWIN-X64: callq ___stack_chk_fail 2229 2230 ; MSVC-I386-LABEL: test16d: 2231 ; MSVC-I386: movl ___security_cookie, 2232 ; MSVC-I386: calll @__security_check_cookie@4 2233 %a = alloca i32, align 4 2234 store i32 0, i32* %a, align 4 2235 %0 = bitcast i32* %a to float* 2236 call void @funfloat(float* %0) 2237 ret void 2238 } 2239 2240 ; test17a: Addr-of a vector nested in a struct 2241 ; no ssp attribute 2242 ; Requires no protector. 2243 define void @test17a() { 2244 entry: 2245 ; LINUX-I386-LABEL: test17a: 2246 ; LINUX-I386-NOT: calll __stack_chk_fail 2247 ; LINUX-I386: .cfi_endproc 2248 2249 ; LINUX-X64-LABEL: test17a: 2250 ; LINUX-X64-NOT: callq __stack_chk_fail 2251 ; LINUX-X64: .cfi_endproc 2252 2253 ; LINUX-KERNEL-X64-LABEL: test17a: 2254 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2255 ; LINUX-KERNEL-X64: .cfi_endproc 2256 2257 ; DARWIN-X64-LABEL: test17a: 2258 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2259 ; DARWIN-X64: .cfi_endproc 2260 2261 ; MSVC-I386-LABEL: test17a: 2262 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2263 ; MSVC-I386: retl 2264 %c = alloca %struct.vec, align 16 2265 %y = getelementptr inbounds %struct.vec, %struct.vec* %c, i64 0, i32 0 2266 %add.ptr = getelementptr inbounds <4 x i32>, <4 x i32>* %y, i64 -12 2267 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) 2268 ret void 2269 } 2270 2271 ; test17b: Addr-of a vector nested in a struct 2272 ; ssp attribute 2273 ; Requires no protector. 2274 ; Function Attrs: ssp 2275 define void @test17b() #0 { 2276 entry: 2277 ; LINUX-I386-LABEL: test17b: 2278 ; LINUX-I386-NOT: calll __stack_chk_fail 2279 ; LINUX-I386: .cfi_endproc 2280 2281 ; LINUX-X64-LABEL: test17b: 2282 ; LINUX-X64-NOT: callq __stack_chk_fail 2283 ; LINUX-X64: .cfi_endproc 2284 2285 ; LINUX-KERNEL-X64-LABEL: test17b: 2286 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2287 ; LINUX-KERNEL-X64: .cfi_endproc 2288 2289 ; DARWIN-X64-LABEL: test17b: 2290 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2291 ; DARWIN-X64: .cfi_endproc 2292 2293 ; MSVC-I386-LABEL: test17b: 2294 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2295 ; MSVC-I386: retl 2296 %c = alloca %struct.vec, align 16 2297 %y = getelementptr inbounds %struct.vec, %struct.vec* %c, i64 0, i32 0 2298 %add.ptr = getelementptr inbounds <4 x i32>, <4 x i32>* %y, i64 -12 2299 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) 2300 ret void 2301 } 2302 2303 ; test17c: Addr-of a vector nested in a struct 2304 ; sspstrong attribute 2305 ; Requires protector. 2306 ; Function Attrs: sspstrong 2307 define void @test17c() #1 { 2308 entry: 2309 ; LINUX-I386-LABEL: test17c: 2310 ; LINUX-I386: mov{{l|q}} %gs: 2311 ; LINUX-I386: calll __stack_chk_fail 2312 2313 ; LINUX-X64-LABEL: test17c: 2314 ; LINUX-X64: mov{{l|q}} %fs: 2315 ; LINUX-X64: callq __stack_chk_fail 2316 2317 ; LINUX-KERNEL-X64-LABEL: test17c: 2318 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2319 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2320 2321 ; DARWIN-X64-LABEL: test17c: 2322 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2323 ; DARWIN-X64: callq ___stack_chk_fail 2324 2325 ; MSVC-I386-LABEL: test17c: 2326 ; MSVC-I386: movl ___security_cookie, 2327 ; MSVC-I386: calll @__security_check_cookie@4 2328 %c = alloca %struct.vec, align 16 2329 %y = getelementptr inbounds %struct.vec, %struct.vec* %c, i64 0, i32 0 2330 %add.ptr = getelementptr inbounds <4 x i32>, <4 x i32>* %y, i64 -12 2331 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) 2332 ret void 2333 } 2334 2335 ; test17d: Addr-of a vector nested in a struct 2336 ; sspreq attribute 2337 ; Requires protector. 2338 ; Function Attrs: sspreq 2339 define void @test17d() #2 { 2340 entry: 2341 ; LINUX-I386-LABEL: test17d: 2342 ; LINUX-I386: mov{{l|q}} %gs: 2343 ; LINUX-I386: calll __stack_chk_fail 2344 2345 ; LINUX-X64-LABEL: test17d: 2346 ; LINUX-X64: mov{{l|q}} %fs: 2347 ; LINUX-X64: callq __stack_chk_fail 2348 2349 ; LINUX-KERNEL-X64-LABEL: test17d: 2350 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2351 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2352 2353 ; DARWIN-X64-LABEL: test17d: 2354 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2355 ; DARWIN-X64: callq ___stack_chk_fail 2356 2357 ; MSVC-I386-LABEL: test17d: 2358 ; MSVC-I386: movl ___security_cookie, 2359 ; MSVC-I386: calll @__security_check_cookie@4 2360 %c = alloca %struct.vec, align 16 2361 %y = getelementptr inbounds %struct.vec, %struct.vec* %c, i64 0, i32 0 2362 %add.ptr = getelementptr inbounds <4 x i32>, <4 x i32>* %y, i64 -12 2363 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), <4 x i32>* %add.ptr) 2364 ret void 2365 } 2366 2367 ; test18a: Addr-of a variable passed into an invoke instruction. 2368 ; no ssp attribute 2369 ; Requires no protector. 2370 define i32 @test18a() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 2371 entry: 2372 ; LINUX-I386-LABEL: test18a: 2373 ; LINUX-I386-NOT: calll __stack_chk_fail 2374 ; LINUX-I386: .cfi_endproc 2375 2376 ; LINUX-X64-LABEL: test18a: 2377 ; LINUX-X64-NOT: callq __stack_chk_fail 2378 ; LINUX-X64: .cfi_endproc 2379 2380 ; LINUX-KERNEL-X64-LABEL: test18a: 2381 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2382 ; LINUX-KERNEL-X64: .cfi_endproc 2383 2384 ; DARWIN-X64-LABEL: test18a: 2385 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2386 ; DARWIN-X64: .cfi_endproc 2387 2388 ; MSVC-I386-LABEL: test18a: 2389 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2390 ; MSVC-I386: retl 2391 %a = alloca i32, align 4 2392 %exn.slot = alloca i8* 2393 %ehselector.slot = alloca i32 2394 store i32 0, i32* %a, align 4 2395 invoke void @_Z3exceptPi(i32* %a) 2396 to label %invoke.cont unwind label %lpad 2397 2398 invoke.cont: 2399 ret i32 0 2400 2401 lpad: 2402 %0 = landingpad { i8*, i32 } 2403 catch i8* null 2404 ret i32 0 2405 } 2406 2407 ; test18b: Addr-of a variable passed into an invoke instruction. 2408 ; ssp attribute 2409 ; Requires no protector. 2410 ; Function Attrs: ssp 2411 define i32 @test18b() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 2412 entry: 2413 ; LINUX-I386-LABEL: test18b: 2414 ; LINUX-I386-NOT: calll __stack_chk_fail 2415 ; LINUX-I386: .cfi_endproc 2416 2417 ; LINUX-X64-LABEL: test18b: 2418 ; LINUX-X64-NOT: callq __stack_chk_fail 2419 ; LINUX-X64: .cfi_endproc 2420 2421 ; LINUX-KERNEL-X64-LABEL: test18b: 2422 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2423 ; LINUX-KERNEL-X64: .cfi_endproc 2424 2425 ; DARWIN-X64-LABEL: test18b: 2426 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2427 ; DARWIN-X64: .cfi_endproc 2428 2429 ; MSVC-I386-LABEL: test18b: 2430 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2431 ; MSVC-I386: retl 2432 %a = alloca i32, align 4 2433 %exn.slot = alloca i8* 2434 %ehselector.slot = alloca i32 2435 store i32 0, i32* %a, align 4 2436 invoke void @_Z3exceptPi(i32* %a) 2437 to label %invoke.cont unwind label %lpad 2438 2439 invoke.cont: 2440 ret i32 0 2441 2442 lpad: 2443 %0 = landingpad { i8*, i32 } 2444 catch i8* null 2445 ret i32 0 2446 } 2447 2448 ; test18c: Addr-of a variable passed into an invoke instruction. 2449 ; sspstrong attribute 2450 ; Requires protector. 2451 ; Function Attrs: sspstrong 2452 define i32 @test18c() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 2453 entry: 2454 ; LINUX-I386-LABEL: test18c: 2455 ; LINUX-I386: mov{{l|q}} %gs: 2456 ; LINUX-I386: calll __stack_chk_fail 2457 2458 ; LINUX-X64-LABEL: test18c: 2459 ; LINUX-X64: mov{{l|q}} %fs: 2460 ; LINUX-X64: callq __stack_chk_fail 2461 2462 ; LINUX-KERNEL-X64-LABEL: test18c: 2463 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2464 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2465 2466 ; DARWIN-X64-LABEL: test18c: 2467 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2468 ; DARWIN-X64: callq ___stack_chk_fail 2469 2470 ; MSVC-I386-LABEL: test18c: 2471 ; MSVC-I386: movl ___security_cookie, 2472 ; MSVC-I386: calll @__security_check_cookie@4 2473 %a = alloca i32, align 4 2474 %exn.slot = alloca i8* 2475 %ehselector.slot = alloca i32 2476 store i32 0, i32* %a, align 4 2477 invoke void @_Z3exceptPi(i32* %a) 2478 to label %invoke.cont unwind label %lpad 2479 2480 invoke.cont: 2481 ret i32 0 2482 2483 lpad: 2484 %0 = landingpad { i8*, i32 } 2485 catch i8* null 2486 ret i32 0 2487 } 2488 2489 ; test18d: Addr-of a variable passed into an invoke instruction. 2490 ; sspreq attribute 2491 ; Requires protector. 2492 ; Function Attrs: sspreq 2493 define i32 @test18d() #2 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 2494 entry: 2495 ; LINUX-I386-LABEL: test18d: 2496 ; LINUX-I386: mov{{l|q}} %gs: 2497 ; LINUX-I386: calll __stack_chk_fail 2498 2499 ; LINUX-X64-LABEL: test18d: 2500 ; LINUX-X64: mov{{l|q}} %fs: 2501 ; LINUX-X64: callq __stack_chk_fail 2502 2503 ; LINUX-KERNEL-X64-LABEL: test18d: 2504 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2505 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2506 2507 ; DARWIN-X64-LABEL: test18d: 2508 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2509 ; DARWIN-X64: callq ___stack_chk_fail 2510 2511 ; MSVC-I386-LABEL: test18d: 2512 ; MSVC-I386: movl ___security_cookie, 2513 ; MSVC-I386: calll @__security_check_cookie@4 2514 %a = alloca i32, align 4 2515 %exn.slot = alloca i8* 2516 %ehselector.slot = alloca i32 2517 store i32 0, i32* %a, align 4 2518 invoke void @_Z3exceptPi(i32* %a) 2519 to label %invoke.cont unwind label %lpad 2520 2521 invoke.cont: 2522 ret i32 0 2523 2524 lpad: 2525 %0 = landingpad { i8*, i32 } 2526 catch i8* null 2527 ret i32 0 2528 } 2529 ; test19a: Addr-of a struct element passed into an invoke instruction. 2530 ; (GEP followed by an invoke) 2531 ; no ssp attribute 2532 ; Requires no protector. 2533 define i32 @test19a() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 2534 entry: 2535 ; LINUX-I386-LABEL: test19a: 2536 ; LINUX-I386-NOT: calll __stack_chk_fail 2537 ; LINUX-I386: .cfi_endproc 2538 2539 ; LINUX-X64-LABEL: test19a: 2540 ; LINUX-X64-NOT: callq __stack_chk_fail 2541 ; LINUX-X64: .cfi_endproc 2542 2543 ; LINUX-KERNEL-X64-LABEL: test19a: 2544 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2545 ; LINUX-KERNEL-X64: .cfi_endproc 2546 2547 ; DARWIN-X64-LABEL: test19a: 2548 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2549 ; DARWIN-X64: .cfi_endproc 2550 2551 ; MSVC-I386-LABEL: test19a: 2552 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2553 ; MSVC-I386: retl 2554 %c = alloca %struct.pair, align 4 2555 %exn.slot = alloca i8* 2556 %ehselector.slot = alloca i32 2557 %a = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 0 2558 store i32 0, i32* %a, align 4 2559 %a1 = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 0 2560 invoke void @_Z3exceptPi(i32* %a1) 2561 to label %invoke.cont unwind label %lpad 2562 2563 invoke.cont: 2564 ret i32 0 2565 2566 lpad: 2567 %0 = landingpad { i8*, i32 } 2568 catch i8* null 2569 ret i32 0 2570 } 2571 2572 ; test19b: Addr-of a struct element passed into an invoke instruction. 2573 ; (GEP followed by an invoke) 2574 ; ssp attribute 2575 ; Requires no protector. 2576 ; Function Attrs: ssp 2577 define i32 @test19b() #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 2578 entry: 2579 ; LINUX-I386-LABEL: test19b: 2580 ; LINUX-I386-NOT: calll __stack_chk_fail 2581 ; LINUX-I386: .cfi_endproc 2582 2583 ; LINUX-X64-LABEL: test19b: 2584 ; LINUX-X64-NOT: callq __stack_chk_fail 2585 ; LINUX-X64: .cfi_endproc 2586 2587 ; LINUX-KERNEL-X64-LABEL: test19b: 2588 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2589 ; LINUX-KERNEL-X64: .cfi_endproc 2590 2591 ; DARWIN-X64-LABEL: test19b: 2592 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2593 ; DARWIN-X64: .cfi_endproc 2594 2595 ; MSVC-I386-LABEL: test19b: 2596 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2597 ; MSVC-I386: retl 2598 %c = alloca %struct.pair, align 4 2599 %exn.slot = alloca i8* 2600 %ehselector.slot = alloca i32 2601 %a = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 0 2602 store i32 0, i32* %a, align 4 2603 %a1 = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 0 2604 invoke void @_Z3exceptPi(i32* %a1) 2605 to label %invoke.cont unwind label %lpad 2606 2607 invoke.cont: 2608 ret i32 0 2609 2610 lpad: 2611 %0 = landingpad { i8*, i32 } 2612 catch i8* null 2613 ret i32 0 2614 } 2615 2616 ; test19c: Addr-of a struct element passed into an invoke instruction. 2617 ; (GEP followed by an invoke) 2618 ; sspstrong attribute 2619 ; Requires protector. 2620 ; Function Attrs: sspstrong 2621 define i32 @test19c() #1 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 2622 entry: 2623 ; LINUX-I386-LABEL: test19c: 2624 ; LINUX-I386: mov{{l|q}} %gs: 2625 ; LINUX-I386: calll __stack_chk_fail 2626 2627 ; LINUX-X64-LABEL: test19c: 2628 ; LINUX-X64: mov{{l|q}} %fs: 2629 ; LINUX-X64: callq __stack_chk_fail 2630 2631 ; LINUX-KERNEL-X64-LABEL: test19c: 2632 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2633 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2634 2635 ; DARWIN-X64-LABEL: test19c: 2636 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2637 ; DARWIN-X64: callq ___stack_chk_fail 2638 2639 ; MSVC-I386-LABEL: test19c: 2640 ; MSVC-I386: movl ___security_cookie, 2641 ; MSVC-I386: calll @__security_check_cookie@4 2642 %c = alloca %struct.pair, align 4 2643 %exn.slot = alloca i8* 2644 %ehselector.slot = alloca i32 2645 %a = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 0 2646 store i32 0, i32* %a, align 4 2647 %a1 = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 0 2648 invoke void @_Z3exceptPi(i32* %a1) 2649 to label %invoke.cont unwind label %lpad 2650 2651 invoke.cont: 2652 ret i32 0 2653 2654 lpad: 2655 %0 = landingpad { i8*, i32 } 2656 catch i8* null 2657 ret i32 0 2658 } 2659 2660 ; test19d: Addr-of a struct element passed into an invoke instruction. 2661 ; (GEP followed by an invoke) 2662 ; sspreq attribute 2663 ; Requires protector. 2664 ; Function Attrs: sspreq 2665 define i32 @test19d() #2 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 2666 entry: 2667 ; LINUX-I386-LABEL: test19d: 2668 ; LINUX-I386: mov{{l|q}} %gs: 2669 ; LINUX-I386: calll __stack_chk_fail 2670 ; LINUX-I386-NOT: calll __stack_chk_fail 2671 2672 ; LINUX-X64-LABEL: test19d: 2673 ; LINUX-X64: mov{{l|q}} %fs: 2674 ; LINUX-X64: callq __stack_chk_fail 2675 ; LINUX-X64-NOT: callq __stack_chk_fail 2676 2677 ; LINUX-KERNEL-X64-LABEL: test19d: 2678 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2679 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2680 ; LINUX-KERNEL-X64-NOT: callq ___stack_chk_fail 2681 2682 ; DARWIN-X64-LABEL: test19d: 2683 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2684 ; DARWIN-X64: callq ___stack_chk_fail 2685 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2686 2687 ; MSVC-I386-LABEL: test19d: 2688 ; MSVC-I386: movl ___security_cookie, 2689 ; MSVC-I386: calll @__security_check_cookie@4 2690 %c = alloca %struct.pair, align 4 2691 %exn.slot = alloca i8* 2692 %ehselector.slot = alloca i32 2693 %a = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 0 2694 store i32 0, i32* %a, align 4 2695 %a1 = getelementptr inbounds %struct.pair, %struct.pair* %c, i32 0, i32 0 2696 invoke void @_Z3exceptPi(i32* %a1) 2697 to label %invoke.cont unwind label %lpad 2698 2699 invoke.cont: 2700 ret i32 0 2701 2702 lpad: 2703 %0 = landingpad { i8*, i32 } 2704 catch i8* null 2705 ret i32 0 2706 } 2707 2708 ; test20a: Addr-of a pointer 2709 ; no ssp attribute 2710 ; Requires no protector. 2711 define void @test20a() { 2712 entry: 2713 ; LINUX-I386-LABEL: test20a: 2714 ; LINUX-I386-NOT: calll __stack_chk_fail 2715 ; LINUX-I386: .cfi_endproc 2716 2717 ; LINUX-X64-LABEL: test20a: 2718 ; LINUX-X64-NOT: callq __stack_chk_fail 2719 ; LINUX-X64: .cfi_endproc 2720 2721 ; LINUX-KERNEL-X64-LABEL: test20a: 2722 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2723 ; LINUX-KERNEL-X64: .cfi_endproc 2724 2725 ; DARWIN-X64-LABEL: test20a: 2726 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2727 ; DARWIN-X64: .cfi_endproc 2728 2729 ; MSVC-I386-LABEL: test20a: 2730 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2731 ; MSVC-I386: retl 2732 %a = alloca i32*, align 8 2733 %b = alloca i32**, align 8 2734 %call = call i32* @getp() 2735 store i32* %call, i32** %a, align 8 2736 store i32** %a, i32*** %b, align 8 2737 %0 = load i32**, i32*** %b, align 8 2738 call void @funcall2(i32** %0) 2739 ret void 2740 } 2741 2742 ; test20b: Addr-of a pointer 2743 ; ssp attribute 2744 ; Requires no protector. 2745 ; Function Attrs: ssp 2746 define void @test20b() #0 { 2747 entry: 2748 ; LINUX-I386-LABEL: test20b: 2749 ; LINUX-I386-NOT: calll __stack_chk_fail 2750 ; LINUX-I386: .cfi_endproc 2751 2752 ; LINUX-X64-LABEL: test20b: 2753 ; LINUX-X64-NOT: callq __stack_chk_fail 2754 ; LINUX-X64: .cfi_endproc 2755 2756 ; LINUX-KERNEL-X64-LABEL: test20b: 2757 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2758 ; LINUX-KERNEL-X64: .cfi_endproc 2759 2760 ; DARWIN-X64-LABEL: test20b: 2761 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2762 ; DARWIN-X64: .cfi_endproc 2763 2764 ; MSVC-I386-LABEL: test20b: 2765 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2766 ; MSVC-I386: retl 2767 %a = alloca i32*, align 8 2768 %b = alloca i32**, align 8 2769 %call = call i32* @getp() 2770 store i32* %call, i32** %a, align 8 2771 store i32** %a, i32*** %b, align 8 2772 %0 = load i32**, i32*** %b, align 8 2773 call void @funcall2(i32** %0) 2774 ret void 2775 } 2776 2777 ; test20c: Addr-of a pointer 2778 ; sspstrong attribute 2779 ; Requires protector. 2780 ; Function Attrs: sspstrong 2781 define void @test20c() #1 { 2782 entry: 2783 ; LINUX-I386-LABEL: test20c: 2784 ; LINUX-I386: mov{{l|q}} %gs: 2785 ; LINUX-I386: calll __stack_chk_fail 2786 2787 ; LINUX-X64-LABEL: test20c: 2788 ; LINUX-X64: mov{{l|q}} %fs: 2789 ; LINUX-X64: callq __stack_chk_fail 2790 2791 ; LINUX-KERNEL-X64-LABEL: test20c: 2792 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2793 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2794 2795 ; DARWIN-X64-LABEL: test20c: 2796 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2797 ; DARWIN-X64: callq ___stack_chk_fail 2798 2799 ; MSVC-I386-LABEL: test20c: 2800 ; MSVC-I386: movl ___security_cookie, 2801 ; MSVC-I386: calll @__security_check_cookie@4 2802 %a = alloca i32*, align 8 2803 %b = alloca i32**, align 8 2804 %call = call i32* @getp() 2805 store i32* %call, i32** %a, align 8 2806 store i32** %a, i32*** %b, align 8 2807 %0 = load i32**, i32*** %b, align 8 2808 call void @funcall2(i32** %0) 2809 ret void 2810 } 2811 2812 ; test20d: Addr-of a pointer 2813 ; sspreq attribute 2814 ; Requires protector. 2815 ; Function Attrs: sspreq 2816 define void @test20d() #2 { 2817 entry: 2818 ; LINUX-I386-LABEL: test20d: 2819 ; LINUX-I386: mov{{l|q}} %gs: 2820 ; LINUX-I386: calll __stack_chk_fail 2821 2822 ; LINUX-X64-LABEL: test20d: 2823 ; LINUX-X64: mov{{l|q}} %fs: 2824 ; LINUX-X64: callq __stack_chk_fail 2825 2826 ; LINUX-KERNEL-X64-LABEL: test20d: 2827 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2828 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2829 2830 ; DARWIN-X64-LABEL: test20d: 2831 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2832 ; DARWIN-X64: callq ___stack_chk_fail 2833 2834 ; MSVC-I386-LABEL: test20d: 2835 ; MSVC-I386: movl ___security_cookie, 2836 ; MSVC-I386: calll @__security_check_cookie@4 2837 %a = alloca i32*, align 8 2838 %b = alloca i32**, align 8 2839 %call = call i32* @getp() 2840 store i32* %call, i32** %a, align 8 2841 store i32** %a, i32*** %b, align 8 2842 %0 = load i32**, i32*** %b, align 8 2843 call void @funcall2(i32** %0) 2844 ret void 2845 } 2846 2847 ; test21a: Addr-of a casted pointer 2848 ; no ssp attribute 2849 ; Requires no protector. 2850 define void @test21a() { 2851 entry: 2852 ; LINUX-I386-LABEL: test21a: 2853 ; LINUX-I386-NOT: calll __stack_chk_fail 2854 ; LINUX-I386: .cfi_endproc 2855 2856 ; LINUX-X64-LABEL: test21a: 2857 ; LINUX-X64-NOT: callq __stack_chk_fail 2858 ; LINUX-X64: .cfi_endproc 2859 2860 ; LINUX-KERNEL-X64-LABEL: test21a: 2861 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2862 ; LINUX-KERNEL-X64: .cfi_endproc 2863 2864 ; DARWIN-X64-LABEL: test21a: 2865 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2866 ; DARWIN-X64: .cfi_endproc 2867 2868 ; MSVC-I386-LABEL: test21a: 2869 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2870 ; MSVC-I386: retl 2871 %a = alloca i32*, align 8 2872 %b = alloca float**, align 8 2873 %call = call i32* @getp() 2874 store i32* %call, i32** %a, align 8 2875 %0 = bitcast i32** %a to float** 2876 store float** %0, float*** %b, align 8 2877 %1 = load float**, float*** %b, align 8 2878 call void @funfloat2(float** %1) 2879 ret void 2880 } 2881 2882 ; test21b: Addr-of a casted pointer 2883 ; ssp attribute 2884 ; Requires no protector. 2885 ; Function Attrs: ssp 2886 define void @test21b() #0 { 2887 entry: 2888 ; LINUX-I386-LABEL: test21b: 2889 ; LINUX-I386-NOT: calll __stack_chk_fail 2890 ; LINUX-I386: .cfi_endproc 2891 2892 ; LINUX-X64-LABEL: test21b: 2893 ; LINUX-X64-NOT: callq __stack_chk_fail 2894 ; LINUX-X64: .cfi_endproc 2895 2896 ; LINUX-KERNEL-X64-LABEL: test21b: 2897 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 2898 ; LINUX-KERNEL-X64: .cfi_endproc 2899 2900 ; DARWIN-X64-LABEL: test21b: 2901 ; DARWIN-X64-NOT: callq ___stack_chk_fail 2902 ; DARWIN-X64: .cfi_endproc 2903 2904 ; MSVC-I386-LABEL: test21b: 2905 ; MSVC-I386-NOT: calll @__security_check_cookie@4 2906 ; MSVC-I386: retl 2907 %a = alloca i32*, align 8 2908 %b = alloca float**, align 8 2909 %call = call i32* @getp() 2910 store i32* %call, i32** %a, align 8 2911 %0 = bitcast i32** %a to float** 2912 store float** %0, float*** %b, align 8 2913 %1 = load float**, float*** %b, align 8 2914 call void @funfloat2(float** %1) 2915 ret void 2916 } 2917 2918 ; test21c: Addr-of a casted pointer 2919 ; sspstrong attribute 2920 ; Requires protector. 2921 ; Function Attrs: sspstrong 2922 define void @test21c() #1 { 2923 entry: 2924 ; LINUX-I386-LABEL: test21c: 2925 ; LINUX-I386: mov{{l|q}} %gs: 2926 ; LINUX-I386: calll __stack_chk_fail 2927 2928 ; LINUX-X64-LABEL: test21c: 2929 ; LINUX-X64: mov{{l|q}} %fs: 2930 ; LINUX-X64: callq __stack_chk_fail 2931 2932 ; LINUX-KERNEL-X64-LABEL: test21c: 2933 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2934 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2935 2936 ; DARWIN-X64-LABEL: test21c: 2937 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2938 ; DARWIN-X64: callq ___stack_chk_fail 2939 2940 ; MSVC-I386-LABEL: test21c: 2941 ; MSVC-I386: movl ___security_cookie, 2942 ; MSVC-I386: calll @__security_check_cookie@4 2943 %a = alloca i32*, align 8 2944 %b = alloca float**, align 8 2945 %call = call i32* @getp() 2946 store i32* %call, i32** %a, align 8 2947 %0 = bitcast i32** %a to float** 2948 store float** %0, float*** %b, align 8 2949 %1 = load float**, float*** %b, align 8 2950 call void @funfloat2(float** %1) 2951 ret void 2952 } 2953 2954 ; test21d: Addr-of a casted pointer 2955 ; sspreq attribute 2956 ; Requires protector. 2957 ; Function Attrs: sspreq 2958 define void @test21d() #2 { 2959 entry: 2960 ; LINUX-I386-LABEL: test21d: 2961 ; LINUX-I386: mov{{l|q}} %gs: 2962 ; LINUX-I386: calll __stack_chk_fail 2963 2964 ; LINUX-X64-LABEL: test21d: 2965 ; LINUX-X64: mov{{l|q}} %fs: 2966 ; LINUX-X64: callq __stack_chk_fail 2967 2968 ; LINUX-KERNEL-X64-LABEL: test21d: 2969 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 2970 ; LINUX-KERNEL-X64: callq __stack_chk_fail 2971 2972 ; DARWIN-X64-LABEL: test21d: 2973 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 2974 ; DARWIN-X64: callq ___stack_chk_fail 2975 2976 ; MSVC-I386-LABEL: test21d: 2977 ; MSVC-I386: movl ___security_cookie, 2978 ; MSVC-I386: calll @__security_check_cookie@4 2979 %a = alloca i32*, align 8 2980 %b = alloca float**, align 8 2981 %call = call i32* @getp() 2982 store i32* %call, i32** %a, align 8 2983 %0 = bitcast i32** %a to float** 2984 store float** %0, float*** %b, align 8 2985 %1 = load float**, float*** %b, align 8 2986 call void @funfloat2(float** %1) 2987 ret void 2988 } 2989 2990 ; test22a: [2 x i8] in a class 2991 ; no ssp attribute 2992 ; Requires no protector. 2993 define signext i8 @test22a() { 2994 entry: 2995 ; LINUX-I386-LABEL: test22a: 2996 ; LINUX-I386-NOT: calll __stack_chk_fail 2997 ; LINUX-I386: .cfi_endproc 2998 2999 ; LINUX-X64-LABEL: test22a: 3000 ; LINUX-X64-NOT: callq __stack_chk_fail 3001 ; LINUX-X64: .cfi_endproc 3002 3003 ; LINUX-KERNEL-X64-LABEL: test22a: 3004 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3005 ; LINUX-KERNEL-X64: .cfi_endproc 3006 3007 ; DARWIN-X64-LABEL: test22a: 3008 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3009 ; DARWIN-X64: .cfi_endproc 3010 3011 ; MSVC-I386-LABEL: test22a: 3012 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3013 ; MSVC-I386: retl 3014 %a = alloca %class.A, align 1 3015 %array = getelementptr inbounds %class.A, %class.A* %a, i32 0, i32 0 3016 %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %array, i32 0, i64 0 3017 %0 = load i8, i8* %arrayidx, align 1 3018 ret i8 %0 3019 } 3020 3021 ; test22b: [2 x i8] in a class 3022 ; ssp attribute 3023 ; Requires no protector. 3024 ; Function Attrs: ssp 3025 define signext i8 @test22b() #0 { 3026 entry: 3027 ; LINUX-I386-LABEL: test22b: 3028 ; LINUX-I386-NOT: calll __stack_chk_fail 3029 ; LINUX-I386: .cfi_endproc 3030 3031 ; LINUX-X64-LABEL: test22b: 3032 ; LINUX-X64-NOT: callq __stack_chk_fail 3033 ; LINUX-X64: .cfi_endproc 3034 3035 ; LINUX-KERNEL-X64-LABEL: test22b: 3036 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3037 ; LINUX-KERNEL-X64: .cfi_endproc 3038 3039 ; DARWIN-X64-LABEL: test22b: 3040 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3041 ; DARWIN-X64: .cfi_endproc 3042 3043 ; MSVC-I386-LABEL: test22b: 3044 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3045 ; MSVC-I386: retl 3046 %a = alloca %class.A, align 1 3047 %array = getelementptr inbounds %class.A, %class.A* %a, i32 0, i32 0 3048 %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %array, i32 0, i64 0 3049 %0 = load i8, i8* %arrayidx, align 1 3050 ret i8 %0 3051 } 3052 3053 ; test22c: [2 x i8] in a class 3054 ; sspstrong attribute 3055 ; Requires protector. 3056 ; Function Attrs: sspstrong 3057 define signext i8 @test22c() #1 { 3058 entry: 3059 ; LINUX-I386-LABEL: test22c: 3060 ; LINUX-I386: mov{{l|q}} %gs: 3061 ; LINUX-I386: calll __stack_chk_fail 3062 3063 ; LINUX-X64-LABEL: test22c: 3064 ; LINUX-X64: mov{{l|q}} %fs: 3065 ; LINUX-X64: callq __stack_chk_fail 3066 3067 ; LINUX-KERNEL-X64-LABEL: test22c: 3068 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3069 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3070 3071 ; DARWIN-X64-LABEL: test22c: 3072 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3073 ; DARWIN-X64: callq ___stack_chk_fail 3074 3075 ; MSVC-I386-LABEL: test22c: 3076 ; MSVC-I386: movl ___security_cookie, 3077 ; MSVC-I386: calll @__security_check_cookie@4 3078 %a = alloca %class.A, align 1 3079 %array = getelementptr inbounds %class.A, %class.A* %a, i32 0, i32 0 3080 %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %array, i32 0, i64 0 3081 %0 = load i8, i8* %arrayidx, align 1 3082 ret i8 %0 3083 } 3084 3085 ; test22d: [2 x i8] in a class 3086 ; sspreq attribute 3087 ; Requires protector. 3088 ; Function Attrs: sspreq 3089 define signext i8 @test22d() #2 { 3090 entry: 3091 ; LINUX-I386-LABEL: test22d: 3092 ; LINUX-I386: mov{{l|q}} %gs: 3093 ; LINUX-I386: calll __stack_chk_fail 3094 3095 ; LINUX-X64-LABEL: test22d: 3096 ; LINUX-X64: mov{{l|q}} %fs: 3097 ; LINUX-X64: callq __stack_chk_fail 3098 3099 ; LINUX-KERNEL-X64-LABEL: test22d: 3100 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3101 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3102 3103 ; DARWIN-X64-LABEL: test22d: 3104 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3105 ; DARWIN-X64: callq ___stack_chk_fail 3106 3107 ; MSVC-I386-LABEL: test22d: 3108 ; MSVC-I386: movl ___security_cookie, 3109 ; MSVC-I386: calll @__security_check_cookie@4 3110 %a = alloca %class.A, align 1 3111 %array = getelementptr inbounds %class.A, %class.A* %a, i32 0, i32 0 3112 %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %array, i32 0, i64 0 3113 %0 = load i8, i8* %arrayidx, align 1 3114 ret i8 %0 3115 } 3116 3117 ; test23a: [2 x i8] nested in several layers of structs and unions 3118 ; no ssp attribute 3119 ; Requires no protector. 3120 define signext i8 @test23a() { 3121 entry: 3122 ; LINUX-I386-LABEL: test23a: 3123 ; LINUX-I386-NOT: calll __stack_chk_fail 3124 ; LINUX-I386: .cfi_endproc 3125 3126 ; LINUX-X64-LABEL: test23a: 3127 ; LINUX-X64-NOT: callq __stack_chk_fail 3128 ; LINUX-X64: .cfi_endproc 3129 3130 ; LINUX-KERNEL-X64-LABEL: test23a: 3131 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3132 ; LINUX-KERNEL-X64: .cfi_endproc 3133 3134 ; DARWIN-X64-LABEL: test23a: 3135 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3136 ; DARWIN-X64: .cfi_endproc 3137 3138 ; MSVC-I386-LABEL: test23a: 3139 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3140 ; MSVC-I386: retl 3141 %x = alloca %struct.deep, align 1 3142 %b = getelementptr inbounds %struct.deep, %struct.deep* %x, i32 0, i32 0 3143 %c = bitcast %union.anon* %b to %struct.anon* 3144 %d = getelementptr inbounds %struct.anon, %struct.anon* %c, i32 0, i32 0 3145 %e = getelementptr inbounds %struct.anon.0, %struct.anon.0* %d, i32 0, i32 0 3146 %array = bitcast %union.anon.1* %e to [2 x i8]* 3147 %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %array, i32 0, i64 0 3148 %0 = load i8, i8* %arrayidx, align 1 3149 ret i8 %0 3150 } 3151 3152 ; test23b: [2 x i8] nested in several layers of structs and unions 3153 ; ssp attribute 3154 ; Requires no protector. 3155 ; Function Attrs: ssp 3156 define signext i8 @test23b() #0 { 3157 entry: 3158 ; LINUX-I386-LABEL: test23b: 3159 ; LINUX-I386-NOT: calll __stack_chk_fail 3160 ; LINUX-I386: .cfi_endproc 3161 3162 ; LINUX-X64-LABEL: test23b: 3163 ; LINUX-X64-NOT: callq __stack_chk_fail 3164 ; LINUX-X64: .cfi_endproc 3165 3166 ; LINUX-KERNEL-X64-LABEL: test23b: 3167 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3168 ; LINUX-KERNEL-X64: .cfi_endproc 3169 3170 ; DARWIN-X64-LABEL: test23b: 3171 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3172 ; DARWIN-X64: .cfi_endproc 3173 3174 ; MSVC-I386-LABEL: test23b: 3175 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3176 ; MSVC-I386: retl 3177 %x = alloca %struct.deep, align 1 3178 %b = getelementptr inbounds %struct.deep, %struct.deep* %x, i32 0, i32 0 3179 %c = bitcast %union.anon* %b to %struct.anon* 3180 %d = getelementptr inbounds %struct.anon, %struct.anon* %c, i32 0, i32 0 3181 %e = getelementptr inbounds %struct.anon.0, %struct.anon.0* %d, i32 0, i32 0 3182 %array = bitcast %union.anon.1* %e to [2 x i8]* 3183 %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %array, i32 0, i64 0 3184 %0 = load i8, i8* %arrayidx, align 1 3185 ret i8 %0 3186 } 3187 3188 ; test23c: [2 x i8] nested in several layers of structs and unions 3189 ; sspstrong attribute 3190 ; Requires protector. 3191 ; Function Attrs: sspstrong 3192 define signext i8 @test23c() #1 { 3193 entry: 3194 ; LINUX-I386-LABEL: test23c: 3195 ; LINUX-I386: mov{{l|q}} %gs: 3196 ; LINUX-I386: calll __stack_chk_fail 3197 3198 ; LINUX-X64-LABEL: test23c: 3199 ; LINUX-X64: mov{{l|q}} %fs: 3200 ; LINUX-X64: callq __stack_chk_fail 3201 3202 ; LINUX-KERNEL-X64-LABEL: test23c: 3203 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3204 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3205 3206 ; DARWIN-X64-LABEL: test23c: 3207 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3208 ; DARWIN-X64: callq ___stack_chk_fail 3209 3210 ; MSVC-I386-LABEL: test23c: 3211 ; MSVC-I386: movl ___security_cookie, 3212 ; MSVC-I386: calll @__security_check_cookie@4 3213 %x = alloca %struct.deep, align 1 3214 %b = getelementptr inbounds %struct.deep, %struct.deep* %x, i32 0, i32 0 3215 %c = bitcast %union.anon* %b to %struct.anon* 3216 %d = getelementptr inbounds %struct.anon, %struct.anon* %c, i32 0, i32 0 3217 %e = getelementptr inbounds %struct.anon.0, %struct.anon.0* %d, i32 0, i32 0 3218 %array = bitcast %union.anon.1* %e to [2 x i8]* 3219 %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %array, i32 0, i64 0 3220 %0 = load i8, i8* %arrayidx, align 1 3221 ret i8 %0 3222 } 3223 3224 ; test23d: [2 x i8] nested in several layers of structs and unions 3225 ; sspreq attribute 3226 ; Requires protector. 3227 ; Function Attrs: sspreq 3228 define signext i8 @test23d() #2 { 3229 entry: 3230 ; LINUX-I386-LABEL: test23d: 3231 ; LINUX-I386: mov{{l|q}} %gs: 3232 ; LINUX-I386: calll __stack_chk_fail 3233 3234 ; LINUX-X64-LABEL: test23d: 3235 ; LINUX-X64: mov{{l|q}} %fs: 3236 ; LINUX-X64: callq __stack_chk_fail 3237 3238 ; LINUX-KERNEL-X64-LABEL: test23d: 3239 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3240 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3241 3242 ; DARWIN-X64-LABEL: test23d: 3243 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3244 ; DARWIN-X64: callq ___stack_chk_fail 3245 3246 ; MSVC-I386-LABEL: test23d: 3247 ; MSVC-I386: movl ___security_cookie, 3248 ; MSVC-I386: calll @__security_check_cookie@4 3249 %x = alloca %struct.deep, align 1 3250 %b = getelementptr inbounds %struct.deep, %struct.deep* %x, i32 0, i32 0 3251 %c = bitcast %union.anon* %b to %struct.anon* 3252 %d = getelementptr inbounds %struct.anon, %struct.anon* %c, i32 0, i32 0 3253 %e = getelementptr inbounds %struct.anon.0, %struct.anon.0* %d, i32 0, i32 0 3254 %array = bitcast %union.anon.1* %e to [2 x i8]* 3255 %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %array, i32 0, i64 0 3256 %0 = load i8, i8* %arrayidx, align 1 3257 ret i8 %0 3258 } 3259 3260 ; test24a: Variable sized alloca 3261 ; no ssp attribute 3262 ; Requires no protector. 3263 define void @test24a(i32 %n) { 3264 entry: 3265 ; LINUX-I386-LABEL: test24a: 3266 ; LINUX-I386-NOT: calll __stack_chk_fail 3267 ; LINUX-I386: .cfi_endproc 3268 3269 ; LINUX-X64-LABEL: test24a: 3270 ; LINUX-X64-NOT: callq __stack_chk_fail 3271 ; LINUX-X64: .cfi_endproc 3272 3273 ; LINUX-KERNEL-X64-LABEL: test24a: 3274 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3275 ; LINUX-KERNEL-X64: .cfi_endproc 3276 3277 ; DARWIN-X64-LABEL: test24a: 3278 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3279 ; DARWIN-X64: .cfi_endproc 3280 3281 ; MSVC-I386-LABEL: test24a: 3282 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3283 ; MSVC-I386: retl 3284 %n.addr = alloca i32, align 4 3285 %a = alloca i32*, align 8 3286 store i32 %n, i32* %n.addr, align 4 3287 %0 = load i32, i32* %n.addr, align 4 3288 %conv = sext i32 %0 to i64 3289 %1 = alloca i8, i64 %conv 3290 %2 = bitcast i8* %1 to i32* 3291 store i32* %2, i32** %a, align 8 3292 ret void 3293 } 3294 3295 ; test24b: Variable sized alloca 3296 ; ssp attribute 3297 ; Requires protector. 3298 ; Function Attrs: ssp 3299 define void @test24b(i32 %n) #0 { 3300 entry: 3301 ; LINUX-I386-LABEL: test24b: 3302 ; LINUX-I386: mov{{l|q}} %gs: 3303 ; LINUX-I386: calll __stack_chk_fail 3304 3305 ; LINUX-X64-LABEL: test24b: 3306 ; LINUX-X64: mov{{l|q}} %fs: 3307 ; LINUX-X64: callq __stack_chk_fail 3308 3309 ; LINUX-KERNEL-X64-LABEL: test24b: 3310 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3311 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3312 3313 ; DARWIN-X64-LABEL: test24b: 3314 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3315 ; DARWIN-X64: callq ___stack_chk_fail 3316 3317 ; MSVC-I386-LABEL: test24b: 3318 ; MSVC-I386: movl ___security_cookie, 3319 ; MSVC-I386: calll @__security_check_cookie@4 3320 %n.addr = alloca i32, align 4 3321 %a = alloca i32*, align 8 3322 store i32 %n, i32* %n.addr, align 4 3323 %0 = load i32, i32* %n.addr, align 4 3324 %conv = sext i32 %0 to i64 3325 %1 = alloca i8, i64 %conv 3326 %2 = bitcast i8* %1 to i32* 3327 store i32* %2, i32** %a, align 8 3328 ret void 3329 } 3330 3331 ; test24c: Variable sized alloca 3332 ; sspstrong attribute 3333 ; Requires protector. 3334 ; Function Attrs: sspstrong 3335 define void @test24c(i32 %n) #1 { 3336 entry: 3337 ; LINUX-I386-LABEL: test24c: 3338 ; LINUX-I386: mov{{l|q}} %gs: 3339 ; LINUX-I386: calll __stack_chk_fail 3340 3341 ; LINUX-X64-LABEL: test24c: 3342 ; LINUX-X64: mov{{l|q}} %fs: 3343 ; LINUX-X64: callq __stack_chk_fail 3344 3345 ; LINUX-KERNEL-X64-LABEL: test24c: 3346 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3347 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3348 3349 ; DARWIN-X64-LABEL: test24c: 3350 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3351 ; DARWIN-X64: callq ___stack_chk_fail 3352 3353 ; MSVC-I386-LABEL: test24c: 3354 ; MSVC-I386: movl ___security_cookie, 3355 ; MSVC-I386: calll @__security_check_cookie@4 3356 %n.addr = alloca i32, align 4 3357 %a = alloca i32*, align 8 3358 store i32 %n, i32* %n.addr, align 4 3359 %0 = load i32, i32* %n.addr, align 4 3360 %conv = sext i32 %0 to i64 3361 %1 = alloca i8, i64 %conv 3362 %2 = bitcast i8* %1 to i32* 3363 store i32* %2, i32** %a, align 8 3364 ret void 3365 } 3366 3367 ; test24d: Variable sized alloca 3368 ; sspreq attribute 3369 ; Requires protector. 3370 ; Function Attrs: sspreq 3371 define void @test24d(i32 %n) #2 { 3372 entry: 3373 ; LINUX-I386-LABEL: test24d: 3374 ; LINUX-I386: mov{{l|q}} %gs: 3375 ; LINUX-I386: calll __stack_chk_fail 3376 3377 ; LINUX-X64-LABEL: test24d: 3378 ; LINUX-X64: mov{{l|q}} %fs: 3379 ; LINUX-X64: callq __stack_chk_fail 3380 3381 ; LINUX-KERNEL-X64-LABEL: test24d: 3382 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3383 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3384 3385 ; DARWIN-X64-LABEL: test24d: 3386 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3387 ; DARWIN-X64: callq ___stack_chk_fail 3388 3389 ; MSVC-I386-LABEL: test24d: 3390 ; MSVC-I386: movl ___security_cookie, 3391 ; MSVC-I386: calll @__security_check_cookie@4 3392 %n.addr = alloca i32, align 4 3393 %a = alloca i32*, align 8 3394 store i32 %n, i32* %n.addr, align 4 3395 %0 = load i32, i32* %n.addr, align 4 3396 %conv = sext i32 %0 to i64 3397 %1 = alloca i8, i64 %conv 3398 %2 = bitcast i8* %1 to i32* 3399 store i32* %2, i32** %a, align 8 3400 ret void 3401 } 3402 3403 ; test25a: array of [4 x i32] 3404 ; no ssp attribute 3405 ; Requires no protector. 3406 define i32 @test25a() { 3407 entry: 3408 ; LINUX-I386-LABEL: test25a: 3409 ; LINUX-I386-NOT: calll __stack_chk_fail 3410 ; LINUX-I386: .cfi_endproc 3411 3412 ; LINUX-X64-LABEL: test25a: 3413 ; LINUX-X64-NOT: callq __stack_chk_fail 3414 ; LINUX-X64: .cfi_endproc 3415 3416 ; LINUX-KERNEL-X64-LABEL: test25a: 3417 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3418 ; LINUX-KERNEL-X64: .cfi_endproc 3419 3420 ; DARWIN-X64-LABEL: test25a: 3421 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3422 ; DARWIN-X64: .cfi_endproc 3423 3424 ; MSVC-I386-LABEL: test25a: 3425 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3426 ; MSVC-I386: retl 3427 %a = alloca [4 x i32], align 16 3428 %arrayidx = getelementptr inbounds [4 x i32], [4 x i32]* %a, i32 0, i64 0 3429 %0 = load i32, i32* %arrayidx, align 4 3430 ret i32 %0 3431 } 3432 3433 ; test25b: array of [4 x i32] 3434 ; ssp attribute 3435 ; Requires no protector, except for Darwin which _does_ require a protector. 3436 ; Function Attrs: ssp 3437 define i32 @test25b() #0 { 3438 entry: 3439 ; LINUX-I386-LABEL: test25b: 3440 ; LINUX-I386-NOT: calll __stack_chk_fail 3441 ; LINUX-I386: .cfi_endproc 3442 3443 ; LINUX-X64-LABEL: test25b: 3444 ; LINUX-X64-NOT: callq __stack_chk_fail 3445 ; LINUX-X64: .cfi_endproc 3446 3447 ; LINUX-KERNEL-X64-LABEL: test25b: 3448 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3449 ; LINUX-KERNEL-X64: .cfi_endproc 3450 3451 ; DARWIN-X64-LABEL: test25b: 3452 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3453 ; DARWIN-X64: callq ___stack_chk_fail 3454 3455 ; MSVC-I386-LABEL: test25b: 3456 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3457 ; MSVC-I386: retl 3458 %a = alloca [4 x i32], align 16 3459 %arrayidx = getelementptr inbounds [4 x i32], [4 x i32]* %a, i32 0, i64 0 3460 %0 = load i32, i32* %arrayidx, align 4 3461 ret i32 %0 3462 } 3463 3464 ; test25c: array of [4 x i32] 3465 ; sspstrong attribute 3466 ; Requires protector. 3467 ; Function Attrs: sspstrong 3468 define i32 @test25c() #1 { 3469 entry: 3470 ; LINUX-I386-LABEL: test25c: 3471 ; LINUX-I386: mov{{l|q}} %gs: 3472 ; LINUX-I386: calll __stack_chk_fail 3473 3474 ; LINUX-X64-LABEL: test25c: 3475 ; LINUX-X64: mov{{l|q}} %fs: 3476 ; LINUX-X64: callq __stack_chk_fail 3477 3478 ; LINUX-KERNEL-X64-LABEL: test25c: 3479 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3480 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3481 3482 ; DARWIN-X64-LABEL: test25c: 3483 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3484 ; DARWIN-X64: callq ___stack_chk_fail 3485 3486 ; MSVC-I386-LABEL: test25c: 3487 ; MSVC-I386: movl ___security_cookie, 3488 ; MSVC-I386: calll @__security_check_cookie@4 3489 %a = alloca [4 x i32], align 16 3490 %arrayidx = getelementptr inbounds [4 x i32], [4 x i32]* %a, i32 0, i64 0 3491 %0 = load i32, i32* %arrayidx, align 4 3492 ret i32 %0 3493 } 3494 3495 ; test25d: array of [4 x i32] 3496 ; sspreq attribute 3497 ; Requires protector. 3498 ; Function Attrs: sspreq 3499 define i32 @test25d() #2 { 3500 entry: 3501 ; LINUX-I386-LABEL: test25d: 3502 ; LINUX-I386: mov{{l|q}} %gs: 3503 ; LINUX-I386: calll __stack_chk_fail 3504 3505 ; LINUX-X64-LABEL: test25d: 3506 ; LINUX-X64: mov{{l|q}} %fs: 3507 ; LINUX-X64: callq __stack_chk_fail 3508 3509 ; LINUX-KERNEL-X64-LABEL: test25d: 3510 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3511 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3512 3513 ; DARWIN-X64-LABEL: test25d: 3514 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3515 ; DARWIN-X64: callq ___stack_chk_fail 3516 3517 ; MSVC-I386-LABEL: test25d: 3518 ; MSVC-I386: movl ___security_cookie, 3519 ; MSVC-I386: calll @__security_check_cookie@4 3520 %a = alloca [4 x i32], align 16 3521 %arrayidx = getelementptr inbounds [4 x i32], [4 x i32]* %a, i32 0, i64 0 3522 %0 = load i32, i32* %arrayidx, align 4 3523 ret i32 %0 3524 } 3525 3526 ; test26: Nested structure, no arrays, no address-of expressions. 3527 ; Verify that the resulting gep-of-gep does not incorrectly trigger 3528 ; a stack protector. 3529 ; ssptrong attribute 3530 ; Requires no protector. 3531 ; Function Attrs: sspstrong 3532 define void @test26() #1 { 3533 entry: 3534 ; LINUX-I386-LABEL: test26: 3535 ; LINUX-I386-NOT: calll __stack_chk_fail 3536 ; LINUX-I386: .cfi_endproc 3537 3538 ; LINUX-X64-LABEL: test26: 3539 ; LINUX-X64-NOT: callq __stack_chk_fail 3540 ; LINUX-X64: .cfi_endproc 3541 3542 ; LINUX-KERNEL-X64-LABEL: test26: 3543 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3544 ; LINUX-KERNEL-X64: .cfi_endproc 3545 3546 ; DARWIN-X64-LABEL: test26: 3547 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3548 ; DARWIN-X64: .cfi_endproc 3549 3550 ; MSVC-I386-LABEL: test26: 3551 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3552 ; MSVC-I386: retl 3553 %c = alloca %struct.nest, align 4 3554 %b = getelementptr inbounds %struct.nest, %struct.nest* %c, i32 0, i32 1 3555 %_a = getelementptr inbounds %struct.pair, %struct.pair* %b, i32 0, i32 0 3556 %0 = load i32, i32* %_a, align 4 3557 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %0) 3558 ret void 3559 } 3560 3561 ; test27: Address-of a structure taken in a function with a loop where 3562 ; the alloca is an incoming value to a PHI node and a use of that PHI 3563 ; node is also an incoming value. 3564 ; Verify that the address-of analysis does not get stuck in infinite 3565 ; recursion when chasing the alloca through the PHI nodes. 3566 ; Requires protector. 3567 ; Function Attrs: sspstrong 3568 define i32 @test27(i32 %arg) #1 { 3569 bb: 3570 ; LINUX-I386-LABEL: test27: 3571 ; LINUX-I386: mov{{l|q}} %gs: 3572 ; LINUX-I386: calll __stack_chk_fail 3573 3574 ; LINUX-X64-LABEL: test27: 3575 ; LINUX-X64: mov{{l|q}} %fs: 3576 ; LINUX-X64: callq __stack_chk_fail 3577 3578 ; LINUX-KERNEL-X64-LABEL: test27: 3579 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3580 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3581 3582 ; DARWIN-X64-LABEL: test27: 3583 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3584 ; DARWIN-X64: callq ___stack_chk_fail 3585 3586 ; MSVC-I386-LABEL: test27: 3587 ; MSVC-I386: movl ___security_cookie, 3588 ; MSVC-I386: calll @__security_check_cookie@4 3589 %tmp = alloca %struct.small*, align 8 3590 %tmp1 = call i32 (...) @dummy(%struct.small** %tmp) 3591 %tmp2 = load %struct.small*, %struct.small** %tmp, align 8 3592 %tmp3 = ptrtoint %struct.small* %tmp2 to i64 3593 %tmp4 = trunc i64 %tmp3 to i32 3594 %tmp5 = icmp sgt i32 %tmp4, 0 3595 br i1 %tmp5, label %bb6, label %bb21 3596 3597 bb6: ; preds = %bb17, %bb 3598 %tmp7 = phi %struct.small* [ %tmp19, %bb17 ], [ %tmp2, %bb ] 3599 %tmp8 = phi i64 [ %tmp20, %bb17 ], [ 1, %bb ] 3600 %tmp9 = phi i32 [ %tmp14, %bb17 ], [ %tmp1, %bb ] 3601 %tmp10 = getelementptr inbounds %struct.small, %struct.small* %tmp7, i64 0, i32 0 3602 %tmp11 = load i8, i8* %tmp10, align 1 3603 %tmp12 = icmp eq i8 %tmp11, 1 3604 %tmp13 = add nsw i32 %tmp9, 8 3605 %tmp14 = select i1 %tmp12, i32 %tmp13, i32 %tmp9 3606 %tmp15 = trunc i64 %tmp8 to i32 3607 %tmp16 = icmp eq i32 %tmp15, %tmp4 3608 br i1 %tmp16, label %bb21, label %bb17 3609 3610 bb17: ; preds = %bb6 3611 %tmp18 = getelementptr inbounds %struct.small*, %struct.small** %tmp, i64 %tmp8 3612 %tmp19 = load %struct.small*, %struct.small** %tmp18, align 8 3613 %tmp20 = add i64 %tmp8, 1 3614 br label %bb6 3615 3616 bb21: ; preds = %bb6, %bb 3617 %tmp22 = phi i32 [ %tmp1, %bb ], [ %tmp14, %bb6 ] 3618 %tmp23 = call i32 (...) @dummy(i32 %tmp22) 3619 ret i32 undef 3620 } 3621 3622 ; test28a: An array of [32 x i8] and a requested ssp-buffer-size of 33. 3623 ; Requires no protector. 3624 ; Function Attrs: ssp stack-protector-buffer-size=33 3625 define i32 @test28a() #3 { 3626 entry: 3627 ; LINUX-I386-LABEL: test28a: 3628 ; LINUX-I386-NOT: calll __stack_chk_fail 3629 ; LINUX-I386: .cfi_endproc 3630 3631 ; LINUX-X64-LABEL: test28a: 3632 ; LINUX-X64-NOT: callq __stack_chk_fail 3633 ; LINUX-X64: .cfi_endproc 3634 3635 ; LINUX-KERNEL-X64-LABEL: test28a: 3636 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3637 ; LINUX-KERNEL-X64: .cfi_endproc 3638 3639 ; DARWIN-X64-LABEL: test28a: 3640 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3641 ; DARWIN-X64: .cfi_endproc 3642 3643 ; MSVC-I386-LABEL: test28a: 3644 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3645 ; MSVC-I386: retl 3646 %test = alloca [32 x i8], align 16 3647 %arraydecay = getelementptr inbounds [32 x i8], [32 x i8]* %test, i32 0, i32 0 3648 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay) 3649 ret i32 %call 3650 } 3651 3652 ; test28b: An array of [33 x i8] and a requested ssp-buffer-size of 33. 3653 ; Requires protector. 3654 ; Function Attrs: ssp stack-protector-buffer-size=33 3655 define i32 @test28b() #3 { 3656 entry: 3657 ; LINUX-I386-LABEL: test28b: 3658 ; LINUX-I386: mov{{l|q}} %gs: 3659 ; LINUX-I386: calll __stack_chk_fail 3660 3661 ; LINUX-X64-LABEL: test28b: 3662 ; LINUX-X64: mov{{l|q}} %fs: 3663 ; LINUX-X64: callq __stack_chk_fail 3664 3665 ; LINUX-KERNEL-X64-LABEL: test28b: 3666 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3667 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3668 3669 ; DARWIN-X64-LABEL: test28b: 3670 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3671 ; DARWIN-X64: callq ___stack_chk_fail 3672 3673 ; MSVC-I386-LABEL: test28b: 3674 ; MSVC-I386: movl ___security_cookie, 3675 ; MSVC-I386: calll @__security_check_cookie@4 3676 %test = alloca [33 x i8], align 16 3677 %arraydecay = getelementptr inbounds [33 x i8], [33 x i8]* %test, i32 0, i32 0 3678 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay) 3679 ret i32 %call 3680 } 3681 3682 ; test29a: An array of [4 x i8] and a requested ssp-buffer-size of 5. 3683 ; Requires no protector. 3684 ; Function Attrs: ssp stack-protector-buffer-size=5 3685 define i32 @test29a() #4 { 3686 entry: 3687 ; LINUX-I386-LABEL: test29a: 3688 ; LINUX-I386-NOT: calll __stack_chk_fail 3689 ; LINUX-I386: .cfi_endproc 3690 3691 ; LINUX-X64-LABEL: test29a: 3692 ; LINUX-X64-NOT: callq __stack_chk_fail 3693 ; LINUX-X64: .cfi_endproc 3694 3695 ; LINUX-KERNEL-X64-LABEL: test29a: 3696 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3697 ; LINUX-KERNEL-X64: .cfi_endproc 3698 3699 ; DARWIN-X64-LABEL: test29a: 3700 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3701 ; DARWIN-X64: .cfi_endproc 3702 3703 ; MSVC-I386-LABEL: test29a: 3704 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3705 ; MSVC-I386: retl 3706 %test = alloca [4 x i8], align 1 3707 %arraydecay = getelementptr inbounds [4 x i8], [4 x i8]* %test, i32 0, i32 0 3708 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay) 3709 ret i32 %call 3710 } 3711 3712 ; test29b: An array of [5 x i8] and a requested ssp-buffer-size of 5. 3713 ; Requires protector. 3714 ; Function Attrs: ssp stack-protector-buffer-size=5 3715 define i32 @test29b() #4 { 3716 entry: 3717 ; LINUX-I386-LABEL: test29b: 3718 ; LINUX-I386: mov{{l|q}} %gs: 3719 ; LINUX-I386: calll __stack_chk_fail 3720 3721 ; LINUX-X64-LABEL: test29b: 3722 ; LINUX-X64: mov{{l|q}} %fs: 3723 ; LINUX-X64: callq __stack_chk_fail 3724 3725 ; LINUX-KERNEL-X64-LABEL: test29b: 3726 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3727 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3728 3729 ; DARWIN-X64-LABEL: test29b: 3730 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3731 ; DARWIN-X64: callq ___stack_chk_fail 3732 3733 ; MSVC-I386-LABEL: test29b: 3734 ; MSVC-I386: movl ___security_cookie, 3735 ; MSVC-I386: calll @__security_check_cookie@4 3736 %test = alloca [5 x i8], align 1 3737 %arraydecay = getelementptr inbounds [5 x i8], [5 x i8]* %test, i32 0, i32 0 3738 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %arraydecay) 3739 ret i32 %call 3740 } 3741 3742 ; test30a: An structure containing an i32 and an array of [5 x i8]. 3743 ; Requested ssp-buffer-size of 6. 3744 ; Requires no protector. 3745 ; Function Attrs: ssp stack-protector-buffer-size=6 3746 define i32 @test30a() #5 { 3747 entry: 3748 ; LINUX-I386-LABEL: test30a: 3749 ; LINUX-I386-NOT: calll __stack_chk_fail 3750 ; LINUX-I386: .cfi_endproc 3751 3752 ; LINUX-X64-LABEL: test30a: 3753 ; LINUX-X64-NOT: callq __stack_chk_fail 3754 ; LINUX-X64: .cfi_endproc 3755 3756 ; LINUX-KERNEL-X64-LABEL: test30a: 3757 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3758 ; LINUX-KERNEL-X64: .cfi_endproc 3759 3760 ; DARWIN-X64-LABEL: test30a: 3761 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3762 ; DARWIN-X64: .cfi_endproc 3763 3764 ; MSVC-I386-LABEL: test30a: 3765 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3766 ; MSVC-I386: retl 3767 %test = alloca %struct.small_char, align 4 3768 %test.coerce = alloca { i64, i8 } 3769 %0 = bitcast { i64, i8 }* %test.coerce to i8* 3770 %1 = bitcast %struct.small_char* %test to i8* 3771 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %1, i64 12, i32 0, i1 false) 3772 %2 = getelementptr { i64, i8 }, { i64, i8 }* %test.coerce, i32 0, i32 0 3773 %3 = load i64, i64* %2, align 1 3774 %4 = getelementptr { i64, i8 }, { i64, i8 }* %test.coerce, i32 0, i32 1 3775 %5 = load i8, i8* %4, align 1 3776 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 %3, i8 %5) 3777 ret i32 %call 3778 } 3779 3780 ; test30b: An structure containing an i32 and an array of [5 x i8]. 3781 ; Requested ssp-buffer-size of 5. 3782 ; Requires protector. 3783 ; Function Attrs: ssp stack-protector-buffer-size=5 3784 define i32 @test30b() #4 { 3785 entry: 3786 ; LINUX-I386-LABEL: test30b: 3787 ; LINUX-I386: mov{{l|q}} %gs: 3788 ; LINUX-I386: calll __stack_chk_fail 3789 3790 ; LINUX-X64-LABEL: test30b: 3791 ; LINUX-X64: mov{{l|q}} %fs: 3792 ; LINUX-X64: callq __stack_chk_fail 3793 3794 ; LINUX-KERNEL-X64-LABEL: test30b: 3795 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3796 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3797 3798 ; DARWIN-X64-LABEL: test30b: 3799 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3800 ; DARWIN-X64: callq ___stack_chk_fail 3801 3802 ; MSVC-I386-LABEL: test30b: 3803 ; MSVC-I386: movl ___security_cookie, 3804 ; MSVC-I386: calll @__security_check_cookie@4 3805 %test = alloca %struct.small_char, align 4 3806 %test.coerce = alloca { i64, i8 } 3807 %0 = bitcast { i64, i8 }* %test.coerce to i8* 3808 %1 = bitcast %struct.small_char* %test to i8* 3809 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %1, i64 12, i32 0, i1 false) 3810 %2 = getelementptr { i64, i8 }, { i64, i8 }* %test.coerce, i32 0, i32 0 3811 %3 = load i64, i64* %2, align 1 3812 %4 = getelementptr { i64, i8 }, { i64, i8 }* %test.coerce, i32 0, i32 1 3813 %5 = load i8, i8* %4, align 1 3814 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i64 %3, i8 %5) 3815 ret i32 %call 3816 } 3817 3818 ; test31a: An alloca of size 5. 3819 ; Requested ssp-buffer-size of 6. 3820 ; Requires no protector. 3821 ; Function Attrs: ssp stack-protector-buffer-size=6 3822 define i32 @test31a() #5 { 3823 entry: 3824 ; LINUX-I386-LABEL: test31a: 3825 ; LINUX-I386-NOT: calll __stack_chk_fail 3826 ; LINUX-I386: .cfi_endproc 3827 3828 ; LINUX-X64-LABEL: test31a: 3829 ; LINUX-X64-NOT: callq __stack_chk_fail 3830 ; LINUX-X64: .cfi_endproc 3831 3832 ; LINUX-KERNEL-X64-LABEL: test31a: 3833 ; LINUX-KERNEL-X64-NOT: callq __stack_chk_fail 3834 ; LINUX-KERNEL-X64: .cfi_endproc 3835 3836 ; DARWIN-X64-LABEL: test31a: 3837 ; DARWIN-X64-NOT: callq ___stack_chk_fail 3838 ; DARWIN-X64: .cfi_endproc 3839 3840 ; MSVC-I386-LABEL: test31a: 3841 ; MSVC-I386-NOT: calll @__security_check_cookie@4 3842 ; MSVC-I386: retl 3843 %test = alloca i8*, align 8 3844 %0 = alloca i8, i64 4 3845 store i8* %0, i8** %test, align 8 3846 %1 = load i8*, i8** %test, align 8 3847 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %1) 3848 ret i32 %call 3849 } 3850 3851 ; test31b: An alloca of size 5. 3852 ; Requested ssp-buffer-size of 5. 3853 ; Requires protector. 3854 define i32 @test31b() #4 { 3855 entry: 3856 ; LINUX-I386-LABEL: test31b: 3857 ; LINUX-I386: mov{{l|q}} %gs: 3858 ; LINUX-I386: calll __stack_chk_fail 3859 3860 ; LINUX-X64-LABEL: test31b: 3861 ; LINUX-X64: mov{{l|q}} %fs: 3862 ; LINUX-X64: callq __stack_chk_fail 3863 3864 ; LINUX-KERNEL-X64-LABEL: test31b: 3865 ; LINUX-KERNEL-X64: mov{{l|q}} %gs: 3866 ; LINUX-KERNEL-X64: callq __stack_chk_fail 3867 3868 ; DARWIN-X64-LABEL: test31b: 3869 ; DARWIN-X64: mov{{l|q}} ___stack_chk_guard 3870 ; DARWIN-X64: callq ___stack_chk_fail 3871 3872 ; MSVC-I386-LABEL: test31b: 3873 ; MSVC-I386: movl ___security_cookie, 3874 ; MSVC-I386: calll @__security_check_cookie@4 3875 %test = alloca i8*, align 8 3876 %0 = alloca i8, i64 5 3877 store i8* %0, i8** %test, align 8 3878 %1 = load i8*, i8** %test, align 8 3879 %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i8* %1) 3880 ret i32 %call 3881 } 3882 3883 define void @__stack_chk_fail() #1 !dbg !6 { 3884 entry: 3885 ret void 3886 } 3887 3888 define void @test32() #1 !dbg !7 { 3889 entry: 3890 %0 = alloca [5 x i8], align 1 3891 ret void 3892 } 3893 3894 declare double @testi_aux() 3895 declare i8* @strcpy(i8*, i8*) 3896 declare i32 @printf(i8*, ...) 3897 declare void @funcall(i32*) 3898 declare void @funcall2(i32**) 3899 declare void @funfloat(float*) 3900 declare void @funfloat2(float**) 3901 declare void @_Z3exceptPi(i32*) 3902 declare i32 @__gxx_personality_v0(...) 3903 declare i32* @getp() 3904 declare i32 @dummy(...) 3905 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) 3906 3907 attributes #0 = { ssp } 3908 attributes #1 = { sspstrong } 3909 attributes #2 = { sspreq } 3910 attributes #3 = { ssp "stack-protector-buffer-size"="33" } 3911 attributes #4 = { ssp "stack-protector-buffer-size"="5" } 3912 attributes #5 = { ssp "stack-protector-buffer-size"="6" } 3913 3914 !llvm.dbg.cu = !{!0} 3915 !llvm.module.flags = !{!3, !4} 3916 !llvm.ident = !{!5} 3917 3918 !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1) 3919 !1 = !DIFile(filename: "test.c", directory: "/tmp") 3920 !2 = !{} 3921 !3 = !{i32 2, !"Dwarf Version", i32 4} 3922 !4 = !{i32 2, !"Debug Info Version", i32 3} 3923 !5 = !{!"clang version x.y.z"} 3924 !6 = distinct !DISubprogram(name: "__stack_chk_fail", scope: !1, unit: !0) 3925 !7 = distinct !DISubprogram(name: "foo", scope: !1, unit: !0) 3926