272 lines · plain
1; REQUIRES: x86-registered-target2; RUN: opt < %s -passes=pseudo-probe -function-sections -S -o %t3; RUN: FileCheck %s < %t --check-prefix=CHECK-IL4; RUN: llc %t -mtriple=x86_64-- -stop-after=pseudo-probe-inserter -o - | FileCheck %s --check-prefix=CHECK-MIR5; For ELF.6; RUN: llc %t -function-sections -mtriple=x86_64-unknown-linux-gnu -filetype=asm -o %t17; RUN: FileCheck %s < %t1 --check-prefixes=CHECK-ASM,CHECK-ASM-ELF8; RUN: llc %t -function-sections -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t29; RUN: llvm-readelf -S -g %t2 | FileCheck %s --check-prefix=CHECK-SEC-ELF10; RUN: llvm-mc %t1 -triple=x86_64-unknown-linux-gnu -filetype=obj -o %t311; RUN: llvm-readelf -S -g %t3 | FileCheck %s --check-prefix=CHECK-SEC-ELF12 13; RUN: llc %t -function-sections -mtriple=x86_64-unknown-linux-gnu -unique-section-names=0 -filetype=obj -o %t414; RUN: llvm-readelf -S %t4 | FileCheck %s --check-prefix=CHECK-SEC2-ELF15 16; For COFF.17; RUN: llc %t -function-sections -mtriple=x86_64-unknown-windows-msvc -filetype=asm -o %t118; RUN: FileCheck %s < %t1 --check-prefixes=CHECK-ASM,CHECK-ASM-COFF19; RUN: llc %t -function-sections -mtriple=x86_64-unknown-windows-msvc -filetype=obj -o %t220; RUN: llvm-readobj -Ss %t2 | FileCheck %s --check-prefix=CHECK-SEC-COFF21; RUN: llvm-mc %t1 -triple=x86_64-unknown-windows-msvc -filetype=obj -o %t322; RUN: llvm-readobj -Ss %t3 | FileCheck %s --check-prefix=CHECK-SEC-COFF23;; Check the generation of pseudoprobe intrinsic call.24 25@a = dso_local global i32 0, align 426 27define void @foo(i32 %x) !dbg !3 {28bb0:29 %cmp = icmp eq i32 %x, 030; CHECK-IL-LABEL: void @foo(i32 %x) !dbg ![[#]] {31; CHECK-IL: call void @llvm.pseudoprobe(i64 [[#GUID:]], i64 1, i32 0, i64 -1), !dbg ![[#FAKELINE:]]32; CHECK-MIR: PSEUDO_PROBE [[#GUID:]], 1, 0, 033; CHECK-ASM: .pseudoprobe [[#GUID:]] 1 0 0 foo34 br i1 %cmp, label %bb1, label %bb235 36bb1:37; CHECK-IL: call void @llvm.pseudoprobe(i64 [[#GUID:]], i64 2, i32 0, i64 -1), !dbg ![[#FAKELINE]]38; CHECK-MIR: PSEUDO_PROBE [[#GUID]], 3, 0, 039; CHECK-MIR: PSEUDO_PROBE [[#GUID]], 4, 0, 040; CHECK-ASM: .pseudoprobe [[#GUID]] 3 0 0 foo41; CHECK-ASM: .pseudoprobe [[#GUID]] 4 0 0 foo42 store i32 6, ptr @a, align 443 br label %bb344 45bb2:46; CHECK-IL: call void @llvm.pseudoprobe(i64 [[#GUID:]], i64 3, i32 0, i64 -1), !dbg ![[#FAKELINE]]47; CHECK-MIR: PSEUDO_PROBE [[#GUID]], 2, 0, 048; CHECK-MIR: PSEUDO_PROBE [[#GUID]], 4, 0, 049; CHECK-ASM: .pseudoprobe [[#GUID]] 2 0 0 foo50; CHECK-ASM: .pseudoprobe [[#GUID]] 4 0 0 foo51 store i32 8, ptr @a, align 452 br label %bb353 54bb3:55; CHECK-IL: call void @llvm.pseudoprobe(i64 [[#GUID]], i64 4, i32 0, i64 -1), !dbg ![[#REALLINE:]]56 ret void, !dbg !1257}58 59declare void @bar(i32 %x)60 61define internal void @foo2(ptr %f) !dbg !4 {62entry:63; CHECK-IL-LABEL: void @foo2(ptr %f) !dbg ![[#]] {64; CHECK-IL: call void @llvm.pseudoprobe(i64 [[#GUID2:]], i64 1, i32 0, i64 -1)65; CHECK-MIR: PSEUDO_PROBE [[#GUID2:]], 1, 0, 066; CHECK-ASM: .pseudoprobe [[#GUID2:]] 1 0 0 foo267; Check pseudo_probe metadata attached to the indirect call instruction.68; CHECK-IL: call void %f(i32 1), !dbg ![[#PROBE0:]]69; CHECK-MIR: PSEUDO_PROBE [[#GUID2]], 2, 1, 070; CHECK-ASM: .pseudoprobe [[#GUID2]] 2 1 0 foo271 call void %f(i32 1), !dbg !1372; Check pseudo_probe metadata attached to the direct call instruction.73; CHECK-IL: call void @bar(i32 1), !dbg ![[#PROBE1:]]74; CHECK-MIR: PSEUDO_PROBE [[#GUID2]], 3, 2, 075; CHECK-ASM: .pseudoprobe [[#GUID2]] 3 2 0 foo276 call void @bar(i32 1)77 ret void78}79 80$foo3 = comdat any81 82define void @foo3(i32 %x) comdat {83entry:84 ret void85}86 87; CHECK-IL: Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite)88; CHECK-IL-NEXT: declare void @llvm.pseudoprobe(i64, i64, i32, i64)89 90; CHECK-IL: ![[#FOO:]] = distinct !DISubprogram(name: "foo"91; CHECK-IL: ![[#FAKELINE]] = !DILocation(line: 0, scope: ![[#FOO]])92; CHECK-IL: ![[#REALLINE]] = !DILocation(line: 2, scope: ![[#DISC0:]])93; CHECK-IL: ![[#DISC0]] = !DILexicalBlockFile(scope: ![[#FOO]], file: ![[#]], discriminator: 0)94; CHECK-IL: ![[#PROBE0]] = !DILocation(line: 2, column: 20, scope: ![[#SCOPE0:]])95;; A discriminator of 387973143 which is 0x17200017 in hexdecimal, stands for a direct call probe96;; with an index of 2.97; CHECK-IL: ![[#SCOPE0]] = !DILexicalBlockFile(scope: ![[#]], file: ![[#]], discriminator: 387973143)98; CHECK-IL: ![[#PROBE1]] = !DILocation(line: 0, scope: ![[#SCOPE1:]])99;; A discriminator of 455082015 which is 0x1b20001f in hexdecimal, stands for a direct call probe100;; with an index of 3.101; CHECK-IL: ![[#SCOPE1]] = !DILexicalBlockFile(scope: ![[#]], file: ![[#]], discriminator: 455082015)102 103; Check the generation of .pseudo_probe_desc section104; CHECK-ASM-ELF: .section .pseudo_probe_desc,"G",@progbits,.pseudo_probe_desc_foo,comdat105; CHECK-ASM-ELF-NEXT: .quad [[#GUID]]106; CHECK-ASM-ELF-NEXT: .quad [[#HASH:]]107; CHECK-ASM-ELF-NEXT: .byte 3108; CHECK-ASM-ELF-NEXT: .ascii "foo"109; CHECK-ASM-ELF-NEXT: .section .pseudo_probe_desc,"G",@progbits,.pseudo_probe_desc_foo2,comdat110; CHECK-ASM-ELF-NEXT: .quad [[#GUID2]]111; CHECK-ASM-ELF-NEXT: .quad [[#HASH2:]]112; CHECK-ASM-ELF-NEXT: .byte 4113; CHECK-ASM-ELF-NEXT: .ascii "foo2"114; CHECK-ASM-COFF: .section .pseudo_probe_desc,"drD",same_contents,.pseudo_probe_desc_foo115; CHECK-ASM-COFF-NEXT: .pseudo_probe_desc_foo:116; CHECK-ASM-COFF-NEXT: .quad [[#GUID]]117; CHECK-ASM-COFF-NEXT: .quad [[#HASH:]]118; CHECK-ASM-COFF-NEXT: .byte 3119; CHECK-ASM-COFF-NEXT: .ascii "foo"120; CHECK-ASM-COFF-NEXT: .section .pseudo_probe_desc,"drD",same_contents,.pseudo_probe_desc_foo2121; CHECK-ASM-COFF-NEXT: .pseudo_probe_desc_foo2:122; CHECK-ASM-COFF-NEXT: .quad [[#GUID2]]123; CHECK-ASM-COFF-NEXT: .quad [[#HASH2:]]124; CHECK-ASM-COFF-NEXT: .byte 4125; CHECK-ASM-COFF-NEXT: .ascii "foo2"126 127; CHECK-SEC-ELF: [Nr] Name Type {{.*}} ES Flg Lk Inf Al128; CHECK-SEC-ELF: [ 3] .text.foo PROGBITS {{.*}} 00 AX 0 0 16129; CHECK-SEC-ELF: [ 5] .text.foo2 PROGBITS {{.*}} 00 AX 0 0 16130; CHECK-SEC-ELF: [ 8] .text.foo3 PROGBITS {{.*}} 00 AXG 0 0 16131; CHECK-SEC-ELF-COUNT-3: .pseudo_probe_desc PROGBITS132; CHECK-SEC-ELF: .pseudo_probe PROGBITS {{.*}} 00 L 3 0 1133; CHECK-SEC-ELF-NEXT: .pseudo_probe PROGBITS {{.*}} 00 L 5 0 1134; CHECK-SEC-ELF-NEXT: .pseudo_probe PROGBITS {{.*}} 00 LG 8 0 1135; CHECK-SEC-ELF-NOT: .rela.pseudo_probe136 137; CHECK-SEC-ELF: COMDAT group section [ 7] `.group' [foo3] contains 2 sections:138; CHECK-SEC-ELF-NEXT: [Index] Name139; CHECK-SEC-ELF-NEXT: [ 8] .text.foo3140; CHECK-SEC-ELF-NEXT: [ 21] .pseudo_probe141; CHECK-SEC-ELF-EMPTY:142; CHECK-SEC-ELF-NEXT: COMDAT group section [ 10] `.group' [.pseudo_probe_desc_foo] contains 1 sections:143; CHECK-SEC-ELF-NEXT: [Index] Name144; CHECK-SEC-ELF-NEXT: [ 11] .pseudo_probe_desc145; CHECK-SEC-ELF-EMPTY:146; CHECK-SEC-ELF-NEXT: COMDAT group section [ 12] `.group' [.pseudo_probe_desc_foo2] contains 1 sections:147; CHECK-SEC-ELF-NEXT: [Index] Name148; CHECK-SEC-ELF-NEXT: [ 13] .pseudo_probe_desc149; CHECK-SEC-ELF-EMPTY:150; CHECK-SEC-ELF-NEXT: COMDAT group section [ 14] `.group' [.pseudo_probe_desc_foo3] contains 1 sections:151; CHECK-SEC-ELF-NEXT: [Index] Name152; CHECK-SEC-ELF-NEXT: [ 15] .pseudo_probe_desc153 154; CHECK-SEC2-ELF: [Nr] Name Type {{.*}} ES Flg Lk Inf Al155; CHECK-SEC2-ELF: [ 3] .text PROGBITS {{.*}} 00 AX 0 0 16156; CHECK-SEC2-ELF: [ 5] .text PROGBITS {{.*}} 00 AX 0 0 16157; CHECK-SEC2-ELF: [ 8] .text PROGBITS {{.*}} 00 AXG 0 0 16158; CHECK-SEC2-ELF-COUNT-3: .pseudo_probe_desc PROGBITS159; CHECK-SEC2-ELF: .pseudo_probe PROGBITS {{.*}} 00 L 3 0 1160; CHECK-SEC2-ELF-NEXT: .pseudo_probe PROGBITS {{.*}} 00 L 5 0 1161; CHECK-SEC2-ELF-NEXT: .pseudo_probe PROGBITS {{.*}} 00 LG 8 0 1162; CHECK-SEC2-ELF-NOT: .rela.pseudo_probe163 164; CHECK-SEC-COFF-LABEL: Sections [165; CHECK-SEC-COFF: Number: 4166; CHECK-SEC-COFF-NEXT: Name: .text167; CHECK-SEC-COFF: Number: 5168; CHECK-SEC-COFF-NEXT: Name: .text169; CHECK-SEC-COFF: Number: 6170; CHECK-SEC-COFF-NEXT: Name: .text171; CHECK-SEC-COFF: Number: 7172; CHECK-SEC-COFF-NEXT: Name: .pseudo_probe_desc173; CHECK-SEC-COFF: Characteristics [174; CHECK-SEC-COFF: IMAGE_SCN_CNT_INITIALIZED_DATA175; CHECK-SEC-COFF-NEXT: IMAGE_SCN_LNK_COMDAT176; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_DISCARDABLE177; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_READ178; CHECK-SEC-COFF: Number: 8179; CHECK-SEC-COFF-NEXT: Name: .pseudo_probe_desc180; CHECK-SEC-COFF: Characteristics [181; CHECK-SEC-COFF: IMAGE_SCN_CNT_INITIALIZED_DATA182; CHECK-SEC-COFF-NEXT: IMAGE_SCN_LNK_COMDAT183; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_DISCARDABLE184; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_READ185; CHECK-SEC-COFF: Number: 9186; CHECK-SEC-COFF-NEXT: Name: .pseudo_probe_desc187; CHECK-SEC-COFF: Characteristics [188; CHECK-SEC-COFF: IMAGE_SCN_CNT_INITIALIZED_DATA189; CHECK-SEC-COFF-NEXT: IMAGE_SCN_LNK_COMDAT190; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_DISCARDABLE191; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_READ192; CHECK-SEC-COFF: Number: 13193; CHECK-SEC-COFF-NEXT: Name: .pseudo_probe194; CHECK-SEC-COFF: Characteristics [195; CHECK-SEC-COFF: IMAGE_SCN_CNT_INITIALIZED_DATA196; CHECK-SEC-COFF-NEXT: IMAGE_SCN_LNK_COMDAT197; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_DISCARDABLE198; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_READ199; CHECK-SEC-COFF: Number: 14200; CHECK-SEC-COFF-NEXT: Name: .pseudo_probe201; CHECK-SEC-COFF: Characteristics [202; CHECK-SEC-COFF: IMAGE_SCN_CNT_INITIALIZED_DATA203; CHECK-SEC-COFF-NEXT: IMAGE_SCN_LNK_COMDAT204; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_DISCARDABLE205; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_READ206; CHECK-SEC-COFF: Number: 15207; CHECK-SEC-COFF-NEXT: Name: .pseudo_probe208; CHECK-SEC-COFF: Characteristics [209; CHECK-SEC-COFF: IMAGE_SCN_CNT_INITIALIZED_DATA210; CHECK-SEC-COFF-NEXT: IMAGE_SCN_LNK_COMDAT211; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_DISCARDABLE212; CHECK-SEC-COFF-NEXT: IMAGE_SCN_MEM_READ213; COMDAT symbols214; CHECK-SEC-COFF-LABEL: Symbols [215; CHECK-SEC-COFF: Name: foo216; CHECK-SEC-COFF: Section: .text (4)217; CHECK-SEC-COFF: }218; CHECK-SEC-COFF: Name: foo2219; CHECK-SEC-COFF: Section: .text (5)220; CHECK-SEC-COFF: }221; CHECK-SEC-COFF: Name: foo3222; CHECK-SEC-COFF: Section: .text (6)223; CHECK-SEC-COFF: }224; CHECK-SEC-COFF: Name: .pseudo_probe_desc_foo225; CHECK-SEC-COFF: Section: .pseudo_probe_desc (7)226; CHECK-SEC-COFF: StorageClass: Static227; CHECK-SEC-COFF: }228; CHECK-SEC-COFF: Name: .pseudo_probe_desc_foo2229; CHECK-SEC-COFF: Section: .pseudo_probe_desc (8)230; CHECK-SEC-COFF: StorageClass: Static231; CHECK-SEC-COFF: }232; CHECK-SEC-COFF: Name: .pseudo_probe_desc_foo3233; CHECK-SEC-COFF: Section: .pseudo_probe_desc (9)234; CHECK-SEC-COFF: StorageClass: Static235; CHECK-SEC-COFF: }236; Section symbols237; CHECK-SEC-COFF: Name: .pseudo_probe238; CHECK-SEC-COFF: Section: .pseudo_probe (13)239; CHECK-SEC-COFF: AuxSectionDef {240; CHECK-SEC-COFF: Selection: Associative241; CHECK-SEC-COFF-NEXT: AssocSection: .text (4)242; CHECK-SEC-COFF: }243; CHECK-SEC-COFF: Name: .pseudo_probe244; CHECK-SEC-COFF: Section: .pseudo_probe (14)245; CHECK-SEC-COFF: AuxSectionDef {246; CHECK-SEC-COFF: Selection: Associative247; CHECK-SEC-COFF-NEXT: AssocSection: .text (5)248; CHECK-SEC-COFF: }249; CHECK-SEC-COFF: Name: .pseudo_probe250; CHECK-SEC-COFF: Section: .pseudo_probe (15)251; CHECK-SEC-COFF: AuxSectionDef {252; CHECK-SEC-COFF: Selection: Associative253; CHECK-SEC-COFF-NEXT: AssocSection: .text (6)254 255!llvm.dbg.cu = !{!0}256!llvm.module.flags = !{!9, !10}257 258!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1)259!1 = !DIFile(filename: "test.c", directory: "")260!2 = !{}261!3 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !5, unit: !0, retainedNodes: !2)262!4 = distinct !DISubprogram(name: "foo2", scope: !1, file: !1, line: 2, type: !5, unit: !0, retainedNodes: !2)263!5 = !DISubroutineType(types: !6)264!6 = !{!7}265!7 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)266!9 = !{i32 2, !"Dwarf Version", i32 4}267!10 = !{i32 2, !"Debug Info Version", i32 3}268!11 = !{!"clang version 3.9.0"}269!12 = !DILocation(line: 2, scope: !14)270!13 = !DILocation(line: 2, column: 20, scope: !4)271!14 = !DILexicalBlockFile(scope: !3, file: !1, discriminator: 1)272