1;; Test runtime symbols and various linkages.
2
3; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -passes=instrprof -S | FileCheck %s --check-prefixes=MACHO
4; RUN: opt < %s -mtriple=x86_64 -passes=instrprof -S | FileCheck %s --check-prefix=ELF_GENERIC
5; RUN: opt < %s -mtriple=x86_64-unknown-linux -passes=instrprof -S | FileCheck %s --check-prefixes=ELF
6; RUN: opt < %s -mtriple=x86_64-unknown-fuchsia -passes=instrprof -S | FileCheck %s --check-prefixes=ELF
7; RUN: opt < %s  -mtriple=x86_64-pc-win32-coff -passes=instrprof -S | FileCheck %s --check-prefixes=COFF
8
9; MACHO: @__llvm_profile_runtime = external global i32
10; ELF_GENERIC: @__llvm_profile_runtime = external global i32
11; ELF-NOT: @__llvm_profile_runtime = external global i32
12
13; ELF: $__profc_foo = comdat nodeduplicate
14; ELF: $__profc_foo_weak = comdat nodeduplicate
15; ELF: $"__profc_linkage.ll:foo_internal" = comdat nodeduplicate
16; ELF: $__profc_foo_inline = comdat nodeduplicate
17; ELF: $__profc_foo_extern = comdat any
18
19@__profn_foo = private constant [3 x i8] c"foo"
20@__profn_foo_weak = weak hidden constant [8 x i8] c"foo_weak"
21@"__profn_linkage.ll:foo_internal" = private constant [23 x i8] c"linkage.ll:foo_internal"
22@__profn_foo_inline = linkonce_odr hidden constant [10 x i8] c"foo_inline"
23@__profn_foo_extern = linkonce_odr hidden constant [10 x i8] c"foo_extern"
24
25; ELF: @__profc_foo = private global {{.*}} section "__llvm_prf_cnts", comdat
26; ELF: @__profd_foo = private global {{.*}} section "__llvm_prf_data", comdat($__profc_foo)
27; MACHO: @__profc_foo = private global
28; MACHO: @__profd_foo = private global
29; COFF: @__profc_foo = private global
30; COFF-NOT: comdat
31; COFF: @__profd_foo = private global
32define void @foo() {
33  call void @llvm.instrprof.increment(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @__profn_foo, i32 0, i32 0), i64 0, i32 1, i32 0)
34  ret void
35}
36
37; ELF: @__profc_foo_weak = weak hidden global{{.*}}section "__llvm_prf_cnts", comdat, align 8
38; ELF: @__profd_foo_weak = private global{{.*}}section "__llvm_prf_data", comdat($__profc_foo_weak)
39; MACHO: @__profc_foo_weak = weak hidden global
40; MACHO: @__profd_foo_weak = weak hidden global
41; COFF: @__profc_foo_weak = weak hidden global
42; COFF: @__profd_foo_weak = private global
43define weak void @foo_weak() {
44  call void @llvm.instrprof.increment(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @__profn_foo_weak, i32 0, i32 0), i64 0, i32 1, i32 0)
45  ret void
46}
47
48; ELF: @"__profc_linkage.ll:foo_internal" = private global{{.*}}section "__llvm_prf_cnts", comdat, align 8
49; ELF: @"__profd_linkage.ll:foo_internal" = private global{{.*}}section "__llvm_prf_data", comdat($"__profc_linkage.ll:foo_internal"), align 8
50; MACHO: @"__profc_linkage.ll:foo_internal" = private global
51; MACHO: @"__profd_linkage.ll:foo_internal" = private global
52; COFF: @"__profc_linkage.ll:foo_internal" = private global
53; COFF: @"__profd_linkage.ll:foo_internal" = private global
54define internal void @foo_internal() {
55  call void @llvm.instrprof.increment(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @"__profn_linkage.ll:foo_internal", i32 0, i32 0), i64 0, i32 1, i32 0)
56  ret void
57}
58
59; ELF: @__profc_foo_inline = linkonce_odr hidden global{{.*}}section "__llvm_prf_cnts", comdat, align 8
60; ELF: @__profd_foo_inline = private global{{.*}}section "__llvm_prf_data", comdat($__profc_foo_inline), align 8
61; MACHO: @__profc_foo_inline = linkonce_odr hidden global
62; MACHO: @__profd_foo_inline = linkonce_odr hidden global
63; COFF: @__profc_foo_inline = linkonce_odr hidden global{{.*}} section ".lprfc$M", align 8
64; COFF: @__profd_foo_inline = private global{{.*}} section ".lprfd$M", align 8
65define linkonce_odr void @foo_inline() {
66  call void @llvm.instrprof.increment(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @__profn_foo_inline, i32 0, i32 0), i64 0, i32 1, i32 0)
67  ret void
68}
69
70; ELF: @__profc_foo_extern = linkonce_odr hidden global {{.*}}section "__llvm_prf_cnts", comdat, align 8
71; ELF: @__profd_foo_extern = private global {{.*}}section "__llvm_prf_data", comdat($__profc_foo_extern), align 8
72; MACHO: @__profc_foo_extern = linkonce_odr hidden global
73; MACHO: @__profd_foo_extern = linkonce_odr hidden global
74; COFF: @__profc_foo_extern = linkonce_odr hidden global {{.*}}section ".lprfc$M", comdat, align 8
75; COFF: @__profd_foo_extern = private global {{.*}}section ".lprfd$M", comdat($__profc_foo_extern), align 8
76define available_externally void @foo_extern() {
77  call void @llvm.instrprof.increment(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @__profn_foo_extern, i32 0, i32 0), i64 0, i32 1, i32 0)
78  ret void
79}
80
81declare void @llvm.instrprof.increment(i8*, i64, i32, i32)
82
83; ELF:         @llvm.compiler.used = appending global {{.*}} @__profd_foo {{.*}}
84; ELF_GENERIC: @llvm.compiler.used = appending global {{.*}} @__llvm_profile_runtime {{.*}} @__profd_foo {{.*}}
85; MACHO:       @llvm.compiler.used = appending global {{.*}} @__llvm_profile_runtime_user {{.*}} @__profd_foo {{.*}}
86; COFF:        @llvm.compiler.used = appending global {{.*}} @__llvm_profile_runtime_user {{.*}} @__profd_foo {{.*}}
87
88; MACHO: define linkonce_odr hidden i32 @__llvm_profile_runtime_user() {{.*}} {
89; MACHO:   %[[REG:.*]] = load i32, i32* @__llvm_profile_runtime
90; MACHO:   ret i32 %[[REG]]
91; MACHO: }
92; COFF: define linkonce_odr hidden i32 @__llvm_profile_runtime_user() {{.*}} comdat {
93; ELF-NOT: define linkonce_odr hidden i32 @__llvm_profile_runtime_user() {{.*}} {
94; ELF-NOT:   %[[REG:.*]] = load i32, i32* @__llvm_profile_runtime
95
96; ELF_GENERIC:      define internal void @__llvm_profile_register_functions() unnamed_addr {
97; ELF_GENERIC-NEXT:   call void @__llvm_profile_register_function(i8* bitcast (i32* @__llvm_profile_runtime to i8*))
98; ELF_GENERIC-NEXT:   call void @__llvm_profile_register_function(i8* bitcast ({ i64, i64, i64, i8*, i8*, i32, [2 x i16] }* @__profd_foo to i8*))
99; ELF_GENERIC-NEXT:   call void @__llvm_profile_register_function(i8* bitcast ({ i64, i64, i64, i8*, i8*, i32, [2 x i16] }* @__profd_foo_weak to i8*))
100; ELF_GENERIC:        call void @__llvm_profile_register_names_function(i8* getelementptr inbounds {{.*}} @__llvm_prf_nm
101; ELF_GENERIC-NEXT:   ret void
102; ELF_GENERIC-NEXT: }
103