From 8f6eb8bd5e5fc2a7d9d7f41d288b5fb5e1d8b5dc Mon Sep 17 00:00:00 2001 From: Rainer Orth Date: Thu, 20 Jun 2019 21:27:06 +0000 Subject: [PATCH] [profile] Solaris ld supports __start___llvm_prof_data etc. labels Currently, many profiling tests on Solaris FAIL like Command Output (stderr): -- Undefined first referenced symbol in file __llvm_profile_register_names_function /tmp/lit_tmp_Nqu4eh/infinite_loop-9dc638.o __llvm_profile_register_function /tmp/lit_tmp_Nqu4eh/infinite_loop-9dc638.o Solaris 11.4 ld supports the non-standard GNU ld extension of adding __start_SECNAME and __stop_SECNAME labels to sections whose names are valid as C identifiers. Given that we already use Solaris 11.4-only features like ld -z gnu-version-script-compat and fully working .preinit_array support in compiler-rt, we don't need to worry about older versions of Solaris ld. The patch documents that support (although the comment in lib/Transforms/Instrumentation/InstrProfiling.cpp (needsRuntimeRegistrationOfSectionRange) is quite cryptic what it's actually about), and adapts the affected testcase not to expect the alternativeq __llvm_profile_register_functions and __llvm_profile_init. It fixes all affected tests. Tested on amd64-pc-solaris2.11. Differential Revision: https://reviews.llvm.org/D41111 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@363984 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Instrumentation/InstrProfiling.cpp | 3 ++- test/Instrumentation/InstrProfiling/platform.ll | 7 ++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/Transforms/Instrumentation/InstrProfiling.cpp b/lib/Transforms/Instrumentation/InstrProfiling.cpp index 4ed431b216e..63c2b807896 100644 --- a/lib/Transforms/Instrumentation/InstrProfiling.cpp +++ b/lib/Transforms/Instrumentation/InstrProfiling.cpp @@ -713,7 +713,8 @@ static bool needsRuntimeRegistrationOfSectionRange(const Triple &TT) { return false; // Use linker script magic to get data/cnts/name start/end. if (TT.isOSLinux() || TT.isOSFreeBSD() || TT.isOSNetBSD() || - TT.isOSFuchsia() || TT.isPS4CPU() || TT.isOSWindows()) + TT.isOSSolaris() || TT.isOSFuchsia() || TT.isPS4CPU() || + TT.isOSWindows()) return false; return true; diff --git a/test/Instrumentation/InstrProfiling/platform.ll b/test/Instrumentation/InstrProfiling/platform.ll index 4c54aea9aec..8c546075963 100644 --- a/test/Instrumentation/InstrProfiling/platform.ll +++ b/test/Instrumentation/InstrProfiling/platform.ll @@ -42,19 +42,16 @@ declare void @llvm.instrprof.increment(i8*, i64, i32, i32) ; MACHO-NOT: define internal void @__llvm_profile_register_functions ; LINUX-NOT: define internal void @__llvm_profile_register_functions ; FREEBSD-NOT: define internal void @__llvm_profile_register_functions +; SOLARIS-NOT: define internal void @__llvm_profile_register_functions ; PS4-NOT: define internal void @__llvm_profile_register_functions ; WINDOWS-NOT: define internal void @__llvm_profile_register_functions ;; PR38340: When dynamic registration is used, we had a bug where we'd register ;; something that's not a __profd_* variable. -; SOLARIS: define internal void @__llvm_profile_register_functions -; SOLARIS-NOT: __llvm_profile_runtime_user -; SOLARIS: ret void - ; MACHO-NOT: define internal void @__llvm_profile_init ; LINUX-NOT: define internal void @__llvm_profile_init ; FREEBSD-NOT: define internal void @__llvm_profile_init +; SOLARIS-NOT: define internal void @__llvm_profile_init ; PS4-NOT: define internal void @__llvm_profile_init ; WINDOWS-NOT: define internal void @__llvm_profile_init -; SOLARIS: define internal void @__llvm_profile_init -- 2.40.0