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 !llvm.module.flags = !{!0} | |
4 !0 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} | |
5 | |
6 target datalayout = "p:32:32:32" | 3 target datalayout = "p:32:32:32" |
7 | 4 |
8 | 5 |
9 %struct = type { i32, i32 } | 6 %struct = type { i32, i32 } |
10 | 7 |
11 declare %struct* @addr_taken_func(%struct*) | 8 declare %struct* @addr_taken_func(%struct*) |
12 | 9 |
13 @addr_of_func = global %struct* (%struct*)* @addr_taken_func | 10 @addr_of_func = global %struct* (%struct*)* @addr_taken_func |
14 ; CHECK: @addr_of_func = global %struct* (%struct*)* bitcast (i32 (i32)* @addr_t
aken_func to %struct* (%struct*)*) | 11 ; CHECK: @addr_of_func = global %struct* (%struct*)* bitcast (i32 (i32)* @addr_t
aken_func to %struct* (%struct*)*) |
15 | 12 |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 | 489 |
493 define void @debug_declare(i32 %val) { | 490 define void @debug_declare(i32 %val) { |
494 ; We normally expect llvm.dbg.declare to be used on an alloca. | 491 ; We normally expect llvm.dbg.declare to be used on an alloca. |
495 %var = alloca i32 | 492 %var = alloca i32 |
496 tail call void @llvm.dbg.declare(metadata !{i32* %var}, metadata !{}) | 493 tail call void @llvm.dbg.declare(metadata !{i32* %var}, metadata !{}) |
497 tail call void @llvm.dbg.declare(metadata !{i32 %val}, metadata !{}) | 494 tail call void @llvm.dbg.declare(metadata !{i32 %val}, metadata !{}) |
498 ret void | 495 ret void |
499 } | 496 } |
500 ; CHECK: define void @debug_declare(i32 %val) { | 497 ; CHECK: define void @debug_declare(i32 %val) { |
501 ; CHECK-NEXT: %var = alloca i8, i32 4 | 498 ; CHECK-NEXT: %var = alloca i8, i32 4 |
502 ; CHECK-NEXT: call void @llvm.dbg.declare(metadata !{i8* %var}, metadata !1) | 499 ; CHECK-NEXT: call void @llvm.dbg.declare(metadata !{i8* %var}, metadata !2) |
503 ; This case is currently not converted. | 500 ; This case is currently not converted. |
504 ; CHECK-NEXT: call void @llvm.dbg.declare(metadata !{null}, metadata !1) | 501 ; CHECK-NEXT: call void @llvm.dbg.declare(metadata !{null}, metadata !2) |
505 ; CHECK-NEXT: ret void | 502 ; CHECK-NEXT: ret void |
506 | 503 |
507 ; For now, debugging info for values is lost. replaceAllUsesWith() | 504 ; For now, debugging info for values is lost. replaceAllUsesWith() |
508 ; does not work for metadata references -- it converts them to nulls. | 505 ; does not work for metadata references -- it converts them to nulls. |
509 ; This makes dbg.value too tricky to handle for now. | 506 ; This makes dbg.value too tricky to handle for now. |
510 define void @debug_value(i32 %val, i8* %ptr) { | 507 define void @debug_value(i32 %val, i8* %ptr) { |
511 tail call void @llvm.dbg.value(metadata !{i32 %val}, i64 1, metadata !{}) | 508 tail call void @llvm.dbg.value(metadata !{i32 %val}, i64 1, metadata !{}) |
512 tail call void @llvm.dbg.value(metadata !{i8* %ptr}, i64 2, metadata !{}) | 509 tail call void @llvm.dbg.value(metadata !{i8* %ptr}, i64 2, metadata !{}) |
513 ret void | 510 ret void |
514 } | 511 } |
515 ; CHECK: define void @debug_value(i32 %val, i32 %ptr) { | 512 ; CHECK: define void @debug_value(i32 %val, i32 %ptr) { |
516 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !{null}, i64 1, metadata !1) | 513 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !{null}, i64 1, metadata !2) |
517 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !{null}, i64 2, metadata !1) | 514 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !{null}, i64 2, metadata !2) |
518 ; CHECK-NEXT: ret void | 515 ; CHECK-NEXT: ret void |
519 | 516 |
520 | 517 |
521 declare void @llvm.lifetime.start(i64 %size, i8* %ptr) | 518 declare void @llvm.lifetime.start(i64 %size, i8* %ptr) |
522 declare {}* @llvm.invariant.start(i64 %size, i8* %ptr) | 519 declare {}* @llvm.invariant.start(i64 %size, i8* %ptr) |
523 declare void @llvm.invariant.end({}* %start, i64 %size, i8* %ptr) | 520 declare void @llvm.invariant.end({}* %start, i64 %size, i8* %ptr) |
524 | 521 |
525 ; GVN can introduce the following horrible corner case of a lifetime | 522 ; GVN can introduce the following horrible corner case of a lifetime |
526 ; marker referencing a PHI node. But we convert the phi to i32 type, | 523 ; marker referencing a PHI node. But we convert the phi to i32 type, |
527 ; and lifetime.start doesn't work on an inttoptr converting an i32 phi | 524 ; and lifetime.start doesn't work on an inttoptr converting an i32 phi |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 define void @typeid_for() { | 669 define void @typeid_for() { |
673 %bc = bitcast i32* @typeid to i8* | 670 %bc = bitcast i32* @typeid to i8* |
674 call i32 @llvm.eh.typeid.for(i8* %bc) | 671 call i32 @llvm.eh.typeid.for(i8* %bc) |
675 ret void | 672 ret void |
676 } | 673 } |
677 ; CHECK: define void @typeid_for() { | 674 ; CHECK: define void @typeid_for() { |
678 ; CHECK-NEXT: %typeid.bc = bitcast i32* @typeid to i8* | 675 ; CHECK-NEXT: %typeid.bc = bitcast i32* @typeid to i8* |
679 ; CHECK-NEXT: call i32 @llvm.eh.typeid.for(i8* %typeid.bc) | 676 ; CHECK-NEXT: call i32 @llvm.eh.typeid.for(i8* %typeid.bc) |
680 | 677 |
681 | 678 |
| 679 ; Subprogram debug metadata may refer to a function. |
| 680 ; Make sure those are updated too. |
| 681 ; Regenerate the debug info from the following C program: |
| 682 ; void nop(void *ptr) { |
| 683 ; } |
| 684 |
| 685 define void @nop(i8* %ptr) { |
| 686 tail call void @llvm.dbg.value(metadata !{i8* %ptr}, i64 0, metadata !10), !db
g !14 |
| 687 ret void, !dbg !15 |
| 688 } |
| 689 ; CHECK: define void @nop(i32 %ptr) { |
| 690 ; CHECK-NEXT: call void @llvm.dbg.value{{.*}} |
| 691 ; CHECK-NEXT: ret void |
| 692 |
| 693 |
682 ; CHECK: attributes {{.*}}[[NOUNWIND]] = { nounwind } | 694 ; CHECK: attributes {{.*}}[[NOUNWIND]] = { nounwind } |
| 695 |
| 696 !llvm.dbg.cu = !{!0} |
| 697 !llvm.module.flags = !{!11, !12} |
| 698 !llvm.ident = !{!13} |
| 699 |
| 700 !0 = metadata !{i32 786449, metadata !1, i32 12, metadata !"clang version 3.5.0"
, i1 true, metadata !"", i32 0, metadata !2, metadata !2, metadata !3, metadata
!2, metadata !2, metadata !"", i32 1} ; [ DW_TAG_compile_unit ] [/home/foo/test_
min.c] [DW_LANG_C99] |
| 701 !1 = metadata !{metadata !"test_min.c", metadata !"/home/foo"} |
| 702 !2 = metadata !{} |
| 703 !3 = metadata !{metadata !4} |
| 704 !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata !"nop", metadata
!"nop", metadata !"", i32 1, metadata !6, i1 false, i1 true, i32 0, i32 0, null,
i32 256, i1 true, void (i8*)* @nop, null, null, metadata !9, i32 1} ; [ DW_TAG_
subprogram ] [line 1] [def] [nop] |
| 705 !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/home/
foo/test_min.c] |
| 706 !6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64
0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type
] [line 0, size 0, align 0, offset 0] [from ] |
| 707 !7 = metadata !{null, metadata !8} |
| 708 !8 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 32, i64 32, i64
0, i32 0, null} ; [ DW_TAG_pointer_type ] [line 0, size 32, align 32, offset 0]
[from ] |
| 709 !9 = metadata !{metadata !10} |
| 710 !10 = metadata !{i32 786689, metadata !4, metadata !"ptr", metadata !5, i32 1677
7217, metadata !8, i32 0, i32 0} ; [ DW_TAG_arg_variable ] [ptr] [line 1] |
| 711 !11 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} |
| 712 !12 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} |
| 713 !13 = metadata !{metadata !"clang version 3.5.0"} |
| 714 !14 = metadata !{i32 1, i32 16, metadata !4, null} |
| 715 !15 = metadata !{i32 2, i32 1, metadata !4, null} |
| 716 |
| 717 ; CHECK: !4 = metadata !{{{.*}}nop{{.*}}, void (i32)* @nop, {{.*}}} ; [ DW_TAG_s
ubprogram ] [line 1] [def] [nop] |
OLD | NEW |