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 |