Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 ; RUN: opt %s -replace-ptrs-with-ints -S | FileCheck %s | 1 ; RUN: opt %s -replace-ptrs-with-ints -S | FileCheck %s |
| 2 | 2 |
| 3 target datalayout = "p:32:32:32" | 3 target datalayout = "p:32:32:32" |
| 4 | 4 |
| 5 | 5 |
| 6 %struct = type { i32, i32 } | 6 %struct = type { i32, i32 } |
| 7 | 7 |
| 8 declare %struct* @addr_taken_func(%struct*) | 8 declare %struct* @addr_taken_func(%struct*) |
| 9 | 9 |
| 10 @addr_of_func = global %struct* (%struct*)* @addr_taken_func | 10 @addr_of_func = global %struct* (%struct*)* @addr_taken_func |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 73 ; CHECK: define void @circular_reference_inttoptr(i32 %dest) { | 73 ; CHECK: define void @circular_reference_inttoptr(i32 %dest) { |
| 74 ; CHECK: store i32 undef, i32* %dest.asptr | 74 ; CHECK: store i32 undef, i32* %dest.asptr |
| 75 | 75 |
| 76 define i8* @forwards_reference(%struct** %ptr) { | 76 define i8* @forwards_reference(%struct** %ptr) { |
| 77 br label %block1 | 77 br label %block1 |
| 78 block2: | 78 block2: |
| 79 ; Forwards reference to %val. | 79 ; Forwards reference to %val. |
| 80 %cast = bitcast %struct* %val to i8* | 80 %cast = bitcast %struct* %val to i8* |
| 81 br label %block3 | 81 br label %block3 |
| 82 block1: | 82 block1: |
| 83 %val = load %struct** %ptr | 83 %val = load %struct*, %struct** %ptr |
| 84 br label %block2 | 84 br label %block2 |
| 85 block3: | 85 block3: |
| 86 ; Backwards reference to a forwards reference that has already been | 86 ; Backwards reference to a forwards reference that has already been |
| 87 ; resolved. | 87 ; resolved. |
| 88 ret i8* %cast | 88 ret i8* %cast |
| 89 } | 89 } |
| 90 ; CHECK: define i32 @forwards_reference(i32 %ptr) { | 90 ; CHECK: define i32 @forwards_reference(i32 %ptr) { |
| 91 ; CHECK-NEXT: br label %block1 | 91 ; CHECK-NEXT: br label %block1 |
| 92 ; CHECK: block2: | 92 ; CHECK: block2: |
| 93 ; CHECK-NEXT: br label %block3 | 93 ; CHECK-NEXT: br label %block3 |
| 94 ; CHECK: block1: | 94 ; CHECK: block1: |
| 95 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i32* | 95 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i32* |
| 96 ; CHECK-NEXT: %val = load i32* %ptr.asptr | 96 ; CHECK-NEXT: %val = load i32, i32* %ptr.asptr |
| 97 ; CHECK-NEXT: br label %block2 | 97 ; CHECK-NEXT: br label %block2 |
| 98 ; CHECK: block3: | 98 ; CHECK: block3: |
| 99 ; CHECK-NEXT: ret i32 %val | 99 ; CHECK-NEXT: ret i32 %val |
| 100 | 100 |
| 101 | 101 |
| 102 define i8* @phi_multiple_entry(i1 %arg, i8* %ptr) { | 102 define i8* @phi_multiple_entry(i1 %arg, i8* %ptr) { |
| 103 entry: | 103 entry: |
| 104 br i1 %arg, label %done, label %done | 104 br i1 %arg, label %done, label %done |
| 105 done: | 105 done: |
| 106 %result = phi i8* [ %ptr, %entry ], [ %ptr, %entry ] | 106 %result = phi i8* [ %ptr, %entry ], [ %ptr, %entry ] |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 188 ; CHECK-NEXT: ret i32 0 | 188 ; CHECK-NEXT: ret i32 0 |
| 189 | 189 |
| 190 define i32 @constant_pointer_undef() { | 190 define i32 @constant_pointer_undef() { |
| 191 %val = ptrtoint i32* undef to i32 | 191 %val = ptrtoint i32* undef to i32 |
| 192 ret i32 %val | 192 ret i32 %val |
| 193 } | 193 } |
| 194 ; CHECK: define i32 @constant_pointer_undef() { | 194 ; CHECK: define i32 @constant_pointer_undef() { |
| 195 ; CHECK-NEXT: ret i32 undef | 195 ; CHECK-NEXT: ret i32 undef |
| 196 | 196 |
| 197 define i16* @constant_pointer_null_load() { | 197 define i16* @constant_pointer_null_load() { |
| 198 %val = load i16** null | 198 %val = load i16*, i16** null |
| 199 ret i16* %val | 199 ret i16* %val |
| 200 } | 200 } |
| 201 ; CHECK: define i32 @constant_pointer_null_load() { | 201 ; CHECK: define i32 @constant_pointer_null_load() { |
| 202 ; CHECK-NEXT: %.asptr = inttoptr i32 0 to i32* | 202 ; CHECK-NEXT: %.asptr = inttoptr i32 0 to i32* |
| 203 ; CHECK-NEXT: %val = load i32* %.asptr | 203 ; CHECK-NEXT: %val = load i32, i32* %.asptr |
| 204 | 204 |
| 205 define i16* @constant_pointer_undef_load() { | 205 define i16* @constant_pointer_undef_load() { |
| 206 %val = load i16** undef | 206 %val = load i16*, i16** undef |
| 207 ret i16* %val | 207 ret i16* %val |
| 208 } | 208 } |
| 209 ; CHECK: define i32 @constant_pointer_undef_load() { | 209 ; CHECK: define i32 @constant_pointer_undef_load() { |
| 210 ; CHECK-NEXT: %.asptr = inttoptr i32 undef to i32* | 210 ; CHECK-NEXT: %.asptr = inttoptr i32 undef to i32* |
| 211 ; CHECK-NEXT: %val = load i32* %.asptr | 211 ; CHECK-NEXT: %val = load i32, i32* %.asptr |
| 212 | 212 |
| 213 | 213 |
| 214 define i8 @load(i8* %ptr) { | 214 define i8 @load(i8* %ptr) { |
| 215 %x = load i8* %ptr | 215 %x = load i8, i8* %ptr |
| 216 ret i8 %x | 216 ret i8 %x |
| 217 } | 217 } |
| 218 ; CHECK: define i8 @load(i32 %ptr) { | 218 ; CHECK: define i8 @load(i32 %ptr) { |
| 219 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i8* | 219 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i8* |
| 220 ; CHECK-NEXT: %x = load i8* %ptr.asptr | 220 ; CHECK-NEXT: %x = load i8, i8* %ptr.asptr |
| 221 | 221 |
| 222 define void @store(i8* %ptr, i8 %val) { | 222 define void @store(i8* %ptr, i8 %val) { |
| 223 store i8 %val, i8* %ptr | 223 store i8 %val, i8* %ptr |
| 224 ret void | 224 ret void |
| 225 } | 225 } |
| 226 ; CHECK: define void @store(i32 %ptr, i8 %val) { | 226 ; CHECK: define void @store(i32 %ptr, i8 %val) { |
| 227 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i8* | 227 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i8* |
| 228 ; CHECK-NEXT: store i8 %val, i8* %ptr.asptr | 228 ; CHECK-NEXT: store i8 %val, i8* %ptr.asptr |
| 229 | 229 |
| 230 | 230 |
| 231 define i8* @load_ptr(i8** %ptr) { | 231 define i8* @load_ptr(i8** %ptr) { |
| 232 %x = load i8** %ptr | 232 %x = load i8*, i8** %ptr |
| 233 ret i8* %x | 233 ret i8* %x |
| 234 } | 234 } |
| 235 ; CHECK: define i32 @load_ptr(i32 %ptr) { | 235 ; CHECK: define i32 @load_ptr(i32 %ptr) { |
| 236 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i32* | 236 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i32* |
| 237 ; CHECK-NEXT: %x = load i32* %ptr.asptr | 237 ; CHECK-NEXT: %x = load i32, i32* %ptr.asptr |
| 238 | 238 |
| 239 define void @store_ptr(i8** %ptr, i8* %val) { | 239 define void @store_ptr(i8** %ptr, i8* %val) { |
| 240 store i8* %val, i8** %ptr | 240 store i8* %val, i8** %ptr |
| 241 ret void | 241 ret void |
| 242 } | 242 } |
| 243 ; CHECK: define void @store_ptr(i32 %ptr, i32 %val) { | 243 ; CHECK: define void @store_ptr(i32 %ptr, i32 %val) { |
| 244 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i32* | 244 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i32* |
| 245 ; CHECK-NEXT: store i32 %val, i32* %ptr.asptr | 245 ; CHECK-NEXT: store i32 %val, i32* %ptr.asptr |
| 246 | 246 |
| 247 | 247 |
| 248 define i8 @load_attrs(i8* %ptr) { | 248 define i8 @load_attrs(i8* %ptr) { |
| 249 %x = load atomic volatile i8* %ptr seq_cst, align 128 | 249 %x = load atomic volatile i8, i8* %ptr seq_cst, align 128 |
| 250 ret i8 %x | 250 ret i8 %x |
| 251 } | 251 } |
| 252 ; CHECK: define i8 @load_attrs(i32 %ptr) { | 252 ; CHECK: define i8 @load_attrs(i32 %ptr) { |
| 253 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i8* | 253 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i8* |
| 254 ; CHECK-NEXT: %x = load atomic volatile i8* %ptr.asptr seq_cst, align 128 | 254 ; CHECK-NEXT: %x = load atomic volatile i8, i8* %ptr.asptr seq_cst, align 128 |
| 255 | 255 |
| 256 define void @store_attrs(i8* %ptr, i8 %val) { | 256 define void @store_attrs(i8* %ptr, i8 %val) { |
| 257 store atomic volatile i8 %val, i8* %ptr singlethread release, align 256 | 257 store atomic volatile i8 %val, i8* %ptr singlethread release, align 256 |
| 258 ret void | 258 ret void |
| 259 } | 259 } |
| 260 ; CHECK: define void @store_attrs(i32 %ptr, i8 %val) { | 260 ; CHECK: define void @store_attrs(i32 %ptr, i8 %val) { |
| 261 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i8* | 261 ; CHECK-NEXT: %ptr.asptr = inttoptr i32 %ptr to i8* |
| 262 ; CHECK-NEXT: store atomic volatile i8 %val, i8* %ptr.asptr singlethread release , align 256 | 262 ; CHECK-NEXT: store atomic volatile i8 %val, i8* %ptr.asptr singlethread release , align 256 |
| 263 | 263 |
| 264 | 264 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 320 | 320 |
| 321 define %struct* (%struct*)* @get_addr_of_func() { | 321 define %struct* (%struct*)* @get_addr_of_func() { |
| 322 ret %struct* (%struct*)* @addr_taken_func | 322 ret %struct* (%struct*)* @addr_taken_func |
| 323 } | 323 } |
| 324 ; CHECK: define i32 @get_addr_of_func() { | 324 ; CHECK: define i32 @get_addr_of_func() { |
| 325 ; CHECK-NEXT: %expanded = ptrtoint i32 (i32)* @addr_taken_func to i32 | 325 ; CHECK-NEXT: %expanded = ptrtoint i32 (i32)* @addr_taken_func to i32 |
| 326 ; CEHCK-NEXT: ret i32 %expanded | 326 ; CEHCK-NEXT: ret i32 %expanded |
| 327 | 327 |
| 328 | 328 |
| 329 define i32 @load_global() { | 329 define i32 @load_global() { |
| 330 %val = load i32* @var | 330 %val = load i32, i32* @var |
| 331 ret i32 %val | 331 ret i32 %val |
| 332 } | 332 } |
| 333 ; CHECK: define i32 @load_global() { | 333 ; CHECK: define i32 @load_global() { |
| 334 ; CHECK-NEXT: %val = load i32* @var | 334 ; CHECK-NEXT: %val = load i32, i32* @var |
| 335 ; CHECK-NEXT: ret i32 %val | 335 ; CHECK-NEXT: ret i32 %val |
| 336 | 336 |
| 337 define i16 @load_global_bitcast() { | 337 define i16 @load_global_bitcast() { |
| 338 %ptr = bitcast i32* @var to i16* | 338 %ptr = bitcast i32* @var to i16* |
| 339 %val = load i16* %ptr | 339 %val = load i16, i16* %ptr |
| 340 ret i16 %val | 340 ret i16 %val |
| 341 } | 341 } |
| 342 ; CHECK: define i16 @load_global_bitcast() { | 342 ; CHECK: define i16 @load_global_bitcast() { |
| 343 ; CHECK-NEXT: %var.bc = bitcast i32* @var to i16* | 343 ; CHECK-NEXT: %var.bc = bitcast i32* @var to i16* |
| 344 ; CHECK-NEXT: %val = load i16* %var.bc | 344 ; CHECK-NEXT: %val = load i16, i16* %var.bc |
| 345 ; CHECK-NEXT: ret i16 %val | 345 ; CHECK-NEXT: ret i16 %val |
| 346 | 346 |
| 347 | 347 |
| 348 ; Check that unsimplified allocas are properly handled: | 348 ; Check that unsimplified allocas are properly handled: |
| 349 declare void @receive_alloca(%struct* %ptr) | 349 declare void @receive_alloca(%struct* %ptr) |
| 350 | 350 |
| 351 define void @unsimplified_alloca() { | 351 define void @unsimplified_alloca() { |
| 352 %a = alloca %struct | 352 %a = alloca %struct |
| 353 call void @receive_alloca(%struct* %a) | 353 call void @receive_alloca(%struct* %a) |
| 354 unreachable | 354 unreachable |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 392 ret i16** %val | 392 ret i16** %val |
| 393 } | 393 } |
| 394 | 394 |
| 395 | 395 |
| 396 declare void @llvm.dbg.declare(metadata, metadata, metadata) | 396 declare void @llvm.dbg.declare(metadata, metadata, metadata) |
| 397 declare void @llvm.dbg.value(metadata, i64, metadata, metadata) | 397 declare void @llvm.dbg.value(metadata, i64, metadata, metadata) |
| 398 | 398 |
| 399 define void @debug_declare(i32 %val) { | 399 define void @debug_declare(i32 %val) { |
| 400 ; We normally expect llvm.dbg.declare to be used on an alloca. | 400 ; We normally expect llvm.dbg.declare to be used on an alloca. |
| 401 %var = alloca i32 | 401 %var = alloca i32 |
| 402 call void @llvm.dbg.declare(metadata !{i32* %var}, metadata !2, metadata !14) | 402 call void @llvm.dbg.declare(metadata i32* %var, metadata !11, metadata !12), ! dbg !13 |
| 403 call void @llvm.dbg.declare(metadata !{i32 %val}, metadata !2, metadata !14) | 403 call void @llvm.dbg.declare(metadata i32 %val, metadata !14, metadata !12), !d bg !13 |
| 404 ret void | 404 ret void |
| 405 } | 405 } |
| 406 ; CHECK: define void @debug_declare(i32 %val) { | 406 ; CHECK: define void @debug_declare(i32 %val) { |
| 407 ; CHECK-NEXT: %var = alloca i32 | 407 ; CHECK-NEXT: %var = alloca i32 |
| 408 ; CHECK-NEXT: call void @llvm.dbg.declare(metadata !{i32* %var}, metadata !2, me tadata !14) | 408 ; CHECK-NEXT: call void @llvm.dbg.declare(metadata i32* %var, metadata !11, meta data !12), !dbg !13 |
| 409 ; This case is currently not converted. | 409 ; This case is currently not converted. |
| 410 ; CHECK-NEXT: call void @llvm.dbg.declare(metadata !{null}, metadata !2, metadat a !14) | 410 ; CHECK-NEXT: call void @llvm.dbg.declare(metadata !2, metadata !14, metadata !1 2) |
| 411 ; CHECK-NEXT: ret void | 411 ; CHECK-NEXT: ret void |
| 412 | 412 |
| 413 ; For now, debugging info for values is lost. replaceAllUsesWith() | 413 ; For now, debugging info for values is lost. replaceAllUsesWith() |
| 414 ; does not work for metadata references -- it converts them to nulls. | 414 ; does not work for metadata references -- it converts them to nulls. |
| 415 ; This makes dbg.value too tricky to handle for now. | 415 ; This makes dbg.value too tricky to handle for now. |
| 416 define void @debug_value(i32 %val, i8* %ptr) { | 416 define void @debug_value(i32 %val, i8* %ptr) { |
| 417 tail call void @llvm.dbg.value(metadata !{i32 %val}, i64 1, metadata !1, metad ata !14) | 417 tail call void @llvm.dbg.value(metadata i32 %val, i64 1, metadata !11, metadat a !12), !dbg !18 |
| 418 tail call void @llvm.dbg.value(metadata !{i8* %ptr}, i64 2, metadata !1, metad ata !14) | 418 tail call void @llvm.dbg.value(metadata i8* %ptr, i64 2, metadata !14, metadat a !12), !dbg !18 |
| 419 | 419 |
| 420 ; check that we don't crash when encountering odd things: | 420 ; check that we don't crash when encountering odd things: |
| 421 tail call void @llvm.dbg.value(metadata !{i8* null}, i64 3, metadata !1, metad ata !14) | 421 tail call void @llvm.dbg.value(metadata i8* null, i64 3, metadata !11, metadat a !12), !dbg !18 |
| 422 tail call void @llvm.dbg.value(metadata !{i8* undef}, i64 4, metadata !1, meta data !14) | 422 tail call void @llvm.dbg.value(metadata i8* undef, i64 4, metadata !11, metada ta !12), !dbg !18 |
| 423 tail call void @llvm.dbg.value(metadata !{}, i64 5, metadata !1, metadata !14) | 423 tail call void @llvm.dbg.value(metadata !{}, i64 5, metadata !11, metadata !12 ), !dbg !18 |
| 424 ret void | 424 ret void |
| 425 } | 425 } |
| 426 ; CHECK: define void @debug_value(i32 %val, i32 %ptr) { | 426 ; CHECK: define void @debug_value(i32 %val, i32 %ptr) { |
| 427 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !{null}, i64 1, metadata !1, me tadata !14) | 427 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !2, i64 1, metadata !11, metada ta !12) |
| 428 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !{null}, i64 2, metadata !1, me tadata !14) | 428 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !2, i64 2, metadata !14, metada ta !12) |
| 429 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !15, i64 3, metadata !1, metada ta !14) | 429 ; CHECK-NEXT: call void @llvm.dbg.value(metadata i8* null, i64 3, metadata !11, metadata !12) |
| 430 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !16, i64 4, metadata !1, metada ta !14) | 430 ; CHECK-NEXT: call void @llvm.dbg.value(metadata i8* undef, i64 4, metadata !11, metadata !12) |
| 431 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !2, i64 5, metadata !1, metadat a !14) | 431 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !2, i64 5, metadata !11, metada ta !12) |
| 432 ; CHECK-NEXT: ret void | 432 ; CHECK-NEXT: ret void |
| 433 | 433 |
| 434 | 434 |
| 435 declare void @llvm.lifetime.start(i64 %size, i8* %ptr) | 435 declare void @llvm.lifetime.start(i64 %size, i8* %ptr) |
| 436 declare {}* @llvm.invariant.start(i64 %size, i8* %ptr) | 436 declare {}* @llvm.invariant.start(i64 %size, i8* %ptr) |
| 437 declare void @llvm.invariant.end({}* %start, i64 %size, i8* %ptr) | 437 declare void @llvm.invariant.end({}* %start, i64 %size, i8* %ptr) |
| 438 | 438 |
| 439 ; GVN can introduce the following horrible corner case of a lifetime | 439 ; GVN can introduce the following horrible corner case of a lifetime |
| 440 ; marker referencing a PHI node. But we convert the phi to i32 type, | 440 ; marker referencing a PHI node. But we convert the phi to i32 type, |
| 441 ; and lifetime.start doesn't work on an inttoptr converting an i32 phi | 441 ; and lifetime.start doesn't work on an inttoptr converting an i32 phi |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 486 ; CHECK-NEXT: ret void | 486 ; CHECK-NEXT: ret void |
| 487 | 487 |
| 488 | 488 |
| 489 ; "nocapture" and "noalias" only apply to pointers, so must be stripped. | 489 ; "nocapture" and "noalias" only apply to pointers, so must be stripped. |
| 490 define void @nocapture_attr(i8* nocapture noalias %ptr) { | 490 define void @nocapture_attr(i8* nocapture noalias %ptr) { |
| 491 ret void | 491 ret void |
| 492 } | 492 } |
| 493 ; CHECK: define void @nocapture_attr(i32 %ptr) { | 493 ; CHECK: define void @nocapture_attr(i32 %ptr) { |
| 494 | 494 |
| 495 | 495 |
| 496 define void @readonly_readnone(i8* readonly readnone) { | 496 define void @readonly_readnone(i8* readonly dereferenceable_or_null(4)) { |
| 497 ret void | 497 ret void |
| 498 } | 498 } |
| 499 ; CHECK-LABEL: define void @readonly_readnone(i32) | 499 ; CHECK-LABEL: define void @readonly_readnone(i32) |
| 500 | 500 |
| 501 define nonnull i8* @nonnull_ptr(i8* nonnull) { | 501 define nonnull i8* @nonnull_ptr(i8* nonnull) { |
| 502 ret i8* undef | 502 ret i8* undef |
| 503 } | 503 } |
| 504 ; CHECK-LABEL: define i32 @nonnull_ptr(i32) | 504 ; CHECK-LABEL: define i32 @nonnull_ptr(i32) |
| 505 | 505 |
| 506 define dereferenceable(16) i8* @dereferenceable_ptr(i8* dereferenceable(8)) { | 506 define dereferenceable(16) i8* @dereferenceable_ptr(i8* dereferenceable(8)) { |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 537 tail call void @tail_call() | 537 tail call void @tail_call() |
| 538 ret void | 538 ret void |
| 539 } | 539 } |
| 540 ; CHECK: define void @tail_call() | 540 ; CHECK: define void @tail_call() |
| 541 ; CHECK-NEXT: tail call void @tail_call() | 541 ; CHECK-NEXT: tail call void @tail_call() |
| 542 | 542 |
| 543 | 543 |
| 544 ; Just check that the pass does not crash on getelementptr. (The pass | 544 ; Just check that the pass does not crash on getelementptr. (The pass |
| 545 ; should not depend unnecessarily on ExpandGetElementPtr having been | 545 ; should not depend unnecessarily on ExpandGetElementPtr having been |
| 546 ; run.) | 546 ; run.) |
| 547 define i8* @getelementptr(i8* %ptr) { | 547 define i8* @getelementptr(i8, i8* %ptr) { |
| 548 %gep = getelementptr i8* %ptr, i32 10 | 548 %gep = getelementptr i8, i8* %ptr, i32 10 |
| 549 ret i8* %gep | 549 ret i8* %gep |
| 550 } | 550 } |
| 551 | 551 |
| 552 ; Just check that the pass does not crash on va_arg. | 552 ; Just check that the pass does not crash on va_arg. |
| 553 define i32* @va_arg(i8* %valist) { | 553 define i32* @va_arg(i8* %valist) { |
| 554 %r = va_arg i8* %valist, i32* | 554 %r = va_arg i8* %valist, i32* |
| 555 ret i32* %r | 555 ret i32* %r |
| 556 } | 556 } |
| 557 | 557 |
| 558 | 558 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 610 ; CHECK-NEXT: call i32 @llvm.eh.typeid.for(i8* %typeid.bc) | 610 ; CHECK-NEXT: call i32 @llvm.eh.typeid.for(i8* %typeid.bc) |
| 611 | 611 |
| 612 | 612 |
| 613 ; Subprogram debug metadata may refer to a function. | 613 ; Subprogram debug metadata may refer to a function. |
| 614 ; Make sure those are updated too. | 614 ; Make sure those are updated too. |
| 615 ; Regenerate the debug info from the following C program: | 615 ; Regenerate the debug info from the following C program: |
| 616 ; void nop(void *ptr) { | 616 ; void nop(void *ptr) { |
| 617 ; } | 617 ; } |
| 618 | 618 |
| 619 define void @nop(i8* %ptr) { | 619 define void @nop(i8* %ptr) { |
| 620 tail call void @llvm.dbg.value(metadata !{i8* %ptr}, i64 0, metadata !10, meta data !14), !dbg !15 | 620 tail call void @llvm.dbg.value(metadata i8* %ptr, i64 0, metadata !11, metadat a !12), !dbg !19 |
| 621 ret void, !dbg !16 | 621 ret void, !dbg !19 |
| 622 } | 622 } |
| 623 ; CHECK: define void @nop(i32 %ptr) { | 623 ; CHECK: define void @nop(i32 %ptr) { |
| 624 ; CHECK-NEXT: call void @llvm.dbg.value{{.*}} | 624 ; CHECK-NEXT: call void @llvm.dbg.value{{.*}} |
| 625 ; CHECK-NEXT: ret void | 625 ; CHECK-NEXT: ret void |
| 626 | 626 |
| 627 | 627 |
| 628 ; CHECK: attributes {{.*}}[[NOUNWIND]] = { nounwind } | 628 ; CHECK: attributes {{.*}}[[NOUNWIND]] = { nounwind } |
| 629 | 629 |
| 630 !llvm.dbg.cu = !{!0} | 630 !llvm.dbg.cu = !{!0} |
| 631 !llvm.module.flags = !{!11, !12} | 631 !llvm.module.flags = !{!8, !9} |
| 632 !llvm.ident = !{!13} | 632 !llvm.ident = !{!10} |
| 633 | 633 |
| 634 !0 = metadata !{metadata !"0x11\0012\00clang version 3.6.0", metadata !1, metada ta !2, metadata !2, metadata !3, metadata !2, metadata !2} ; [ DW_TAG_compile_un it ] [/home/foo/test_debug.c] [DW_LANG_C99] | 634 ; CHECK: !4 = !MDSubprogram(name: "debug_declare", scope: !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagProtot yped, isOptimized: false, function: void (i32)* @debug_declare, variables: !2) |
| 635 !1 = metadata !{metadata !"test_debug.c", metadata !"/home/foo"} | |
| 636 !2 = metadata !{} | |
| 637 !3 = metadata !{metadata !4} | |
| 638 !4 = metadata !{metadata !"0x2e\00nop\00nop\00\001\000\001\000\000\00256\001\001 ", metadata !1, metadata !5, metadata !6, null, void (i8*)* @nop, null, null, me tadata !9} ; [ DW_TAG_subprogram ] [line 1] [def] [nop] | |
|
jvoung (off chromium)
2015/05/26 20:39:45
If the test is now checking that "void (i32)* @deb
Derek Schuff
2015/05/26 22:01:33
Done.
| |
| 639 !5 = metadata !{metadata !"0x29", metadata !1} ; [ DW_TAG_file_type ] [/home/ foo/test_debug.c] | |
| 640 !6 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, m etadata !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, alig n 0, offset 0] [from ] | |
| 641 !7 = metadata !{null, metadata !8} | |
| 642 !8 = metadata !{metadata !"0xf\00\000\0032\0032\000\000", null, null, null} ; [ DW_TAG_pointer_type ] [line 0, size 32, align 32, offset 0] [from ] | |
| 643 !9 = metadata !{metadata !10} | |
| 644 !10 = metadata !{metadata !"0x101\00ptr\0016777217\000", metadata !4, metadata ! 5, metadata !8} ; [ DW_TAG_arg_variable ] [ptr] [line 1] | |
| 645 !11 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} | |
| 646 !12 = metadata !{i32 2, metadata !"Debug Info Version", i32 2} | |
| 647 !13 = metadata !{metadata !"clang version 3.6.0"} | |
| 648 !14 = metadata !{metadata !"0x102"} ; [ DW_TAG_expression ] | |
| 649 !15 = metadata !{i32 1, i32 16, metadata !4, null} | |
| 650 !16 = metadata !{i32 2, i32 1, metadata !4, null} | |
| 651 | 635 |
| 652 ; CHECK: !4 = metadata !{{{.*}}nop{{.*}}, void (i32)* @nop, {{.*}}} ; [ DW_TAG_s ubprogram ] [line 1] [def] [nop] | 636 !0 = !MDCompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3. 7.0 (trunk 235150) (llvm/trunk 235152)", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !2, retainedTypes: !2, subprograms: !3, globals: !2, imp orts: !2) |
| 637 !1 = !MDFile(filename: "foo.c", directory: "/s/llvm/cmakebuild") | |
| 638 !2 = !{} | |
| 639 !3 = !{!4} | |
| 640 !4 = !MDSubprogram(name: "debug_declare", scope: !1, file: !1, line: 1, type: !5 , isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isO ptimized: false, function: void (i32)* @debug_declare, variables: !2) | |
| 641 !5 = !MDSubroutineType(types: !6) | |
| 642 !6 = !{null, !7} | |
| 643 !7 = !MDBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) | |
| 644 !8 = !{i32 2, !"Dwarf Version", i32 4} | |
| 645 !9 = !{i32 2, !"Debug Info Version", i32 3} | |
| 646 !10 = !{!"clang version 3.7.0 (trunk 235150) (llvm/trunk 235152)"} | |
| 647 !11 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "val", arg: 1, scope: !4, file: !1, line: 1, type: !7) | |
| 648 !12 = !MDExpression() | |
| 649 !13 = !MDLocation(line: 1, column: 24, scope: !4) | |
| 650 | |
| 651 !14 = !MDLocalVariable(tag: DW_TAG_auto_variable, name: "var", scope: !4, file: !1, line: 2, type: !15) | |
| 652 !15 = !MDCompositeType(tag: DW_TAG_array_type, baseType: !7, align: 32, elements : !16) | |
| 653 !16 = !{!17} | |
| 654 !17 = !MDSubrange(count: -1) | |
| 655 !18 = !MDLocation(line: 2, column: 11, scope: !4) | |
| 656 !19 = !MDLocation(line: 2, column: 3, scope: !4) | |
| OLD | NEW |