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