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.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