Skip to content

Commit 60c4f82

Browse files
authored
[InstrProfiling] No runtime registration for ELF, COFF, Mach-O and XCOFF (#77225)
Whether runtime registration is needed is not dependent on the OS but the file format. For ELF, COFF, Mach-O or XCOFF, we can always use the linker support. This is important for baremetal platforms such as RTOS and UEFI platforms where there is no OS but we still don't want to use runtime registration and rely on linker support instead.
1 parent 0359acf commit 60c4f82

File tree

3 files changed

+16
-16
lines changed

3 files changed

+16
-16
lines changed

llvm/lib/Transforms/Instrumentation/InstrProfiling.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,12 +1189,10 @@ static inline Constant *getFuncAddrForProfData(Function *Fn) {
11891189
}
11901190

11911191
static bool needsRuntimeRegistrationOfSectionRange(const Triple &TT) {
1192-
// Don't do this for Darwin. compiler-rt uses linker magic.
1193-
if (TT.isOSDarwin())
1194-
return false;
1195-
// Use linker script magic to get data/cnts/name start/end.
1196-
if (TT.isOSAIX() || TT.isOSLinux() || TT.isOSFreeBSD() || TT.isOSNetBSD() ||
1197-
TT.isOSSolaris() || TT.isOSFuchsia() || TT.isPS() || TT.isOSWindows())
1192+
// compiler-rt uses linker support to get data/counters/name start/end for
1193+
// ELF, COFF, Mach-O and XCOFF.
1194+
if (TT.isOSBinFormatELF() || TT.isOSBinFormatCOFF() ||
1195+
TT.isOSBinFormatMachO() || TT.isOSBinFormatXCOFF())
11981196
return false;
11991197

12001198
return true;

llvm/test/Instrumentation/InstrProfiling/platform.ll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
; RUN: opt < %s -mtriple=x86_64-pc-solaris -passes=instrprof -S | FileCheck %s -check-prefixes=SOLARIS,ELF
99
; RUN: opt < %s -mtriple=x86_64-pc-windows -passes=instrprof -S | FileCheck %s -check-prefix=WINDOWS
1010
; RUN: opt < %s -mtriple=powerpc64-ibm-aix-xcoff -passes=instrprof -S | FileCheck %s -check-prefix=AIX
11+
; RUN: opt < %s -mtriple=arm-elf -passes=instrprof -S | FileCheck %s -check-prefix=BAREMETAL
1112

1213
@__profn_foo = private constant [3 x i8] c"foo"
1314
; MACHO-NOT: __profn_foo
@@ -46,6 +47,7 @@ declare void @llvm.instrprof.increment(ptr, i64, i32, i32)
4647
; PS4-NOT: define internal void @__llvm_profile_register_functions
4748
; WINDOWS-NOT: define internal void @__llvm_profile_register_functions
4849
; AIX-NOT: define internal void @__llvm_profile_register_functions
50+
; BAREMETAL-NOT: define internal void @__llvm_profile_register_functions
4951

5052
;; PR38340: When dynamic registration is used, we had a bug where we'd register
5153
;; something that's not a __profd_* variable.
@@ -57,3 +59,4 @@ declare void @llvm.instrprof.increment(ptr, i64, i32, i32)
5759
; PS4-NOT: define internal void @__llvm_profile_init
5860
; WINDOWS-NOT: define internal void @__llvm_profile_init
5961
; AIX-NOT: define internal void @__llvm_profile_init
62+
; BAREMETAL-NOT: define internal void @__llvm_profile_init

llvm/test/Instrumentation/InstrProfiling/profiling.ll

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
;; Test runtime symbols and various linkages.
22

33
; 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
54
; RUN: opt < %s -mtriple=x86_64-unknown-linux -passes=instrprof -S | FileCheck %s --check-prefixes=ELF,ELFRT
65
; RUN: opt < %s -mtriple=x86_64-unknown-fuchsia -passes=instrprof -S | FileCheck %s --check-prefixes=ELF,ELFRT
76
; RUN: opt < %s -mtriple=x86_64-scei-ps4 -passes=instrprof -S | FileCheck %s --check-prefixes=ELF,PS
87
; RUN: opt < %s -mtriple=x86_64-sie-ps5 -passes=instrprof -S | FileCheck %s --check-prefixes=ELF,PS
98
; RUN: opt < %s -mtriple=x86_64-pc-win32-coff -passes=instrprof -S | FileCheck %s --check-prefixes=COFF
109
; RUN: opt < %s -mtriple=powerpc64-ibm-aix-xcoff -passes=instrprof -S | FileCheck %s --check-prefixes=XCOFF
1110
; RUN: opt < %s -mtriple=x86_64-pc-freebsd13 -passes=instrprof -S | FileCheck %s --check-prefixes=ELF
11+
; RUN: opt < %s -mtriple=wasm32-unknown-unknown -passes=instrprof -S | FileCheck %s --check-prefix=WASM
1212

1313
; MACHO: @__llvm_profile_runtime = external hidden global i32
14-
; ELF_GENERIC: @__llvm_profile_runtime = external hidden global i32
1514
; ELF-NOT: @__llvm_profile_runtime = external global i32
1615
; XCOFF-NOT: @__llvm_profile_runtime = external hidden global i32
1716
; COFF: @__llvm_profile_runtime = external hidden global i32
17+
; WASM: @__llvm_profile_runtime = external hidden global i32
1818

1919
; ELF: $__profc_foo = comdat nodeduplicate
2020
; ELF: $__profc_foo_weak = comdat nodeduplicate
@@ -98,10 +98,10 @@ define available_externally void @foo_extern() {
9898
declare void @llvm.instrprof.increment(ptr, i64, i32, i32)
9999

100100
; ELF: @llvm.compiler.used = appending global {{.*}} [{{.*}}ptr @__profd_foo, ptr @__profd_foo_weak, ptr @"__profd_linkage.ll:foo_internal", ptr @__profd_foo_inline, ptr @__profd_foo_extern{{.*}}]
101-
; ELF_GENERIC: @llvm.compiler.used = appending global [6 x ptr] [ptr @__llvm_profile_runtime, ptr @__profd_foo, ptr @__profd_foo_weak, ptr @"__profd_linkage.ll:foo_internal", ptr @__profd_foo_inline, ptr @__profd_foo_extern]
102101
; MACHO: @llvm.compiler.used = appending global [6 x ptr] [ptr @__llvm_profile_runtime_user, ptr @__profd_foo, {{.*}}
103102
; COFF: @llvm.compiler.used = appending global [6 x ptr] [ptr @__llvm_profile_runtime_user, ptr @__profd_foo, ptr @__profd_foo_weak, ptr @"__profd_linkage.ll:foo_internal", ptr @__profd_foo_inline, ptr @__profd_foo_extern]
104103
; XCOFF: @llvm.used = appending global [6 x ptr] [ptr @__profd_foo, ptr @__profd_foo_weak, ptr @"__profd_linkage.ll:foo_internal", ptr @__profd_foo_inline, ptr @__profd_foo_extern, ptr @__llvm_prf_nm]
104+
; WASM: @llvm.used = appending global [7 x ptr] [ptr @__llvm_profile_runtime_user, ptr @__profd_foo, ptr @__profd_foo_weak, ptr @"__profd_linkage.ll:foo_internal", ptr @__profd_foo_inline, ptr @__profd_foo_extern, ptr @__llvm_prf_nm]
105105

106106
; MACHO: define linkonce_odr hidden i32 @__llvm_profile_runtime_user() {{.*}} {
107107
; MACHO: %[[REG:.*]] = load i32, ptr @__llvm_profile_runtime
@@ -114,12 +114,11 @@ declare void @llvm.instrprof.increment(ptr, i64, i32, i32)
114114
; PS: %[[REG:.*]] = load i32, ptr @__llvm_profile_runtime
115115
; XCOFF-NOT: define .* __llvm_profile_runtime_user
116116

117-
; ELF_GENERIC: define internal void @__llvm_profile_register_functions() unnamed_addr {
118-
; ELF_GENERIC-NEXT: call void @__llvm_profile_register_function(ptr @__llvm_profile_runtime)
119-
; ELF_GENERIC-NEXT: call void @__llvm_profile_register_function(ptr @__profd_foo)
120-
; ELF_GENERIC-NEXT: call void @__llvm_profile_register_function(ptr @__profd_foo_weak)
121-
; ELF_GENERIC: call void @__llvm_profile_register_names_function(ptr @__llvm_prf_nm
122-
; ELF_GENERIC-NEXT: ret void
123-
; ELF_GENERIC-NEXT: }
117+
; WASM: define internal void @__llvm_profile_register_functions() unnamed_addr {
118+
; WASM-NEXT: call void @__llvm_profile_register_function(ptr @__profd_foo)
119+
; WASM-NEXT: call void @__llvm_profile_register_function(ptr @__profd_foo_weak)
120+
; WASM: call void @__llvm_profile_register_names_function(ptr @__llvm_prf_nm
121+
; WASM-NEXT: ret void
122+
; WASM-NEXT: }
124123

125124
; XCOFF-NOT: internal void @__llvm_profile_register_functions()

0 commit comments

Comments
 (0)