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 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 %val = call i16* asm "foo", "=r,r"(i8* %ptr) | 386 %val = call i16* asm "foo", "=r,r"(i8* %ptr) |
387 ret i16* %val | 387 ret i16* %val |
388 } | 388 } |
389 | 389 |
390 define i16** @inline_asm2(i8** %ptr) { | 390 define i16** @inline_asm2(i8** %ptr) { |
391 %val = call i16** asm "foo", "=r,r"(i8** %ptr) | 391 %val = call i16** asm "foo", "=r,r"(i8** %ptr) |
392 ret i16** %val | 392 ret i16** %val |
393 } | 393 } |
394 | 394 |
395 | 395 |
396 declare void @llvm.dbg.declare(metadata, metadata) | 396 declare void @llvm.dbg.declare(metadata, metadata, metadata) |
397 declare void @llvm.dbg.value(metadata, i64, 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 tail call void @llvm.dbg.declare(metadata !{i32* %var}, metadata !{}) | 402 call void @llvm.dbg.declare(metadata !{i32* %var}, metadata !2, metadata !14) |
403 tail call void @llvm.dbg.declare(metadata !{i32 %val}, metadata !{}) | 403 call void @llvm.dbg.declare(metadata !{i32 %val}, metadata !2, metadata !14) |
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) | 408 ; CHECK-NEXT: call void @llvm.dbg.declare(metadata !{i32* %var}, metadata !2, me
tadata !14) |
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) | 410 ; CHECK-NEXT: call void @llvm.dbg.declare(metadata !{null}, metadata !2, metadat
a !14) |
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 !{}) | 417 tail call void @llvm.dbg.value(metadata !{i32 %val}, i64 1, metadata !1, metad
ata !14) |
418 tail call void @llvm.dbg.value(metadata !{i8* %ptr}, i64 2, metadata !{}) | 418 tail call void @llvm.dbg.value(metadata !{i8* %ptr}, i64 2, metadata !1, metad
ata !14) |
419 ret void | 419 ret void |
420 } | 420 } |
421 ; CHECK: define void @debug_value(i32 %val, i32 %ptr) { | 421 ; CHECK: define void @debug_value(i32 %val, i32 %ptr) { |
422 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !{null}, i64 1, metadata !2) | 422 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !{null}, i64 1, metadata !1, me
tadata !14) |
423 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !{null}, i64 2, metadata !2) | 423 ; CHECK-NEXT: call void @llvm.dbg.value(metadata !{null}, i64 2, metadata !1, me
tadata !14) |
424 ; CHECK-NEXT: ret void | 424 ; CHECK-NEXT: ret void |
425 | 425 |
426 | 426 |
427 declare void @llvm.lifetime.start(i64 %size, i8* %ptr) | 427 declare void @llvm.lifetime.start(i64 %size, i8* %ptr) |
428 declare {}* @llvm.invariant.start(i64 %size, i8* %ptr) | 428 declare {}* @llvm.invariant.start(i64 %size, i8* %ptr) |
429 declare void @llvm.invariant.end({}* %start, i64 %size, i8* %ptr) | 429 declare void @llvm.invariant.end({}* %start, i64 %size, i8* %ptr) |
430 | 430 |
431 ; GVN can introduce the following horrible corner case of a lifetime | 431 ; GVN can introduce the following horrible corner case of a lifetime |
432 ; marker referencing a PHI node. But we convert the phi to i32 type, | 432 ; marker referencing a PHI node. But we convert the phi to i32 type, |
433 ; and lifetime.start doesn't work on an inttoptr converting an i32 phi | 433 ; and lifetime.start doesn't work on an inttoptr converting an i32 phi |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
592 ; CHECK-NEXT: call i32 @llvm.eh.typeid.for(i8* %typeid.bc) | 592 ; CHECK-NEXT: call i32 @llvm.eh.typeid.for(i8* %typeid.bc) |
593 | 593 |
594 | 594 |
595 ; Subprogram debug metadata may refer to a function. | 595 ; Subprogram debug metadata may refer to a function. |
596 ; Make sure those are updated too. | 596 ; Make sure those are updated too. |
597 ; Regenerate the debug info from the following C program: | 597 ; Regenerate the debug info from the following C program: |
598 ; void nop(void *ptr) { | 598 ; void nop(void *ptr) { |
599 ; } | 599 ; } |
600 | 600 |
601 define void @nop(i8* %ptr) { | 601 define void @nop(i8* %ptr) { |
602 tail call void @llvm.dbg.value(metadata !{i8* %ptr}, i64 0, metadata !10), !db
g !14 | 602 tail call void @llvm.dbg.value(metadata !{i8* %ptr}, i64 0, metadata !10, meta
data !14), !dbg !15 |
603 ret void, !dbg !15 | 603 ret void, !dbg !16 |
604 } | 604 } |
605 ; CHECK: define void @nop(i32 %ptr) { | 605 ; CHECK: define void @nop(i32 %ptr) { |
606 ; CHECK-NEXT: call void @llvm.dbg.value{{.*}} | 606 ; CHECK-NEXT: call void @llvm.dbg.value{{.*}} |
607 ; CHECK-NEXT: ret void | 607 ; CHECK-NEXT: ret void |
608 | 608 |
609 | 609 |
610 ; CHECK: attributes {{.*}}[[NOUNWIND]] = { nounwind } | 610 ; CHECK: attributes {{.*}}[[NOUNWIND]] = { nounwind } |
611 | 611 |
612 !llvm.dbg.cu = !{!0} | 612 !llvm.dbg.cu = !{!0} |
613 !llvm.module.flags = !{!11, !12} | 613 !llvm.module.flags = !{!11, !12} |
614 !llvm.ident = !{!13} | 614 !llvm.ident = !{!13} |
615 | 615 |
616 !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] | 616 !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] |
617 !1 = metadata !{metadata !"test_min.c", metadata !"/home/foo"} | 617 !1 = metadata !{metadata !"test_debug.c", metadata !"/home/foo"} |
618 !2 = metadata !{} | 618 !2 = metadata !{} |
619 !3 = metadata !{metadata !4} | 619 !3 = metadata !{metadata !4} |
620 !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] | 620 !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] |
621 !5 = metadata !{i32 786473, metadata !1} ; [ DW_TAG_file_type ] [/home/
foo/test_min.c] | 621 !5 = metadata !{metadata !"0x29", metadata !1} ; [ DW_TAG_file_type ] [/home/
foo/test_debug.c] |
622 !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 ] | 622 !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 ] |
623 !7 = metadata !{null, metadata !8} | 623 !7 = metadata !{null, metadata !8} |
624 !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 ] | 624 !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 ] |
625 !9 = metadata !{metadata !10} | 625 !9 = metadata !{metadata !10} |
626 !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] | 626 !10 = metadata !{metadata !"0x101\00ptr\0016777217\000", metadata !4, metadata !
5, metadata !8} ; [ DW_TAG_arg_variable ] [ptr] [line 1] |
627 !11 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} | 627 !11 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} |
628 !12 = metadata !{i32 2, metadata !"Debug Info Version", i32 1} | 628 !12 = metadata !{i32 2, metadata !"Debug Info Version", i32 2} |
629 !13 = metadata !{metadata !"clang version 3.5.0"} | 629 !13 = metadata !{metadata !"clang version 3.6.0"} |
630 !14 = metadata !{i32 1, i32 16, metadata !4, null} | 630 !14 = metadata !{metadata !"0x102"} ; [ DW_TAG_expression ] |
631 !15 = metadata !{i32 2, i32 1, metadata !4, null} | 631 !15 = metadata !{i32 1, i32 16, metadata !4, null} |
| 632 !16 = metadata !{i32 2, i32 1, metadata !4, null} |
632 | 633 |
633 ; CHECK: !4 = metadata !{{{.*}}nop{{.*}}, void (i32)* @nop, {{.*}}} ; [ DW_TAG_s
ubprogram ] [line 1] [def] [nop] | 634 ; CHECK: !4 = metadata !{{{.*}}nop{{.*}}, void (i32)* @nop, {{.*}}} ; [ DW_TAG_s
ubprogram ] [line 1] [def] [nop] |
OLD | NEW |