Summary: The motivating use case is eliminating duplicate profile data registered for the same inline function in two object files. Before this change, users would observe multiple symbol definition errors with VC link, but links with LLD would succeed. Users (Mozilla) have reported that PGO works well with clang-cl and LLD, but when using LLD without this static registration, we would get into a "relocation against a discarded section" situation. I'm not sure what happens in that situation, but I suspect that duplicate, unused profile information was retained. If so, this change will reduce the size of such binaries with LLD. Now, Windows uses static registration and is in line with all the other platforms. Reviewers: davidxl, wmi, inglorion, void, calixte Subscribers: mgorny, krytarowski, eraman, fedor.sergeev, hiraditya, #sanitizers, dmajor, llvm-commits Tags: #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D57929 llvm-svn: 353547
61 lines
3.4 KiB
LLVM
61 lines
3.4 KiB
LLVM
;; Checks for platform specific section names and initialization code.
|
|
|
|
; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -instrprof -S | FileCheck %s -check-prefix=MACHO
|
|
; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -passes=instrprof -S | FileCheck %s -check-prefix=MACHO
|
|
; RUN: opt < %s -mtriple=x86_64-unknown-linux -instrprof -S | FileCheck %s -check-prefixes=LINUX,ELF
|
|
; RUN: opt < %s -mtriple=x86_64-unknown-linux -passes=instrprof -S | FileCheck %s -check-prefixes=LINUX,ELF
|
|
; RUN: opt < %s -mtriple=x86_64-unknown-freebsd -instrprof -S | FileCheck %s -check-prefixes=FREEBSD,ELF
|
|
; RUN: opt < %s -mtriple=x86_64-unknown-freebsd -passes=instrprof -S | FileCheck %s -check-prefixes=FREEBSD,ELF
|
|
; RUN: opt < %s -mtriple=x86_64-scei-ps4 -instrprof -S | FileCheck %s -check-prefixes=PS4,ELF
|
|
; RUN: opt < %s -mtriple=x86_64-scei-ps4 -passes=instrprof -S | FileCheck %s -check-prefixes=PS4,ELF
|
|
; RUN: opt < %s -mtriple=x86_64-pc-solaris -instrprof -S | FileCheck %s -check-prefixes=SOLARIS,ELF
|
|
; RUN: opt < %s -mtriple=x86_64-pc-solaris -passes=instrprof -S | FileCheck %s -check-prefixes=SOLARIS,ELF
|
|
; RUN: opt < %s -mtriple=x86_64-pc-windows -instrprof -S | FileCheck %s -check-prefix=WINDOWS
|
|
; RUN: opt < %s -mtriple=x86_64-pc-windows -passes=instrprof -S | FileCheck %s -check-prefix=WINDOWS
|
|
|
|
@__profn_foo = hidden constant [3 x i8] c"foo"
|
|
; MACHO-NOT: __profn_foo
|
|
; ELF-NOT: __profn_foo
|
|
; WINDOWS-NOT: __profn_foo
|
|
|
|
; MACHO: @__profc_foo = hidden global [1 x i64] zeroinitializer, section "__DATA,__llvm_prf_cnts", align 8
|
|
; ELF: @__profc_foo = hidden global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", align 8
|
|
; WINDOWS: @__profc_foo = internal global [1 x i64] zeroinitializer, section ".lprfc$M", align 8
|
|
|
|
; MACHO: @__profd_foo = hidden {{.*}}, section "__DATA,__llvm_prf_data,regular,live_support", align 8
|
|
; ELF: @__profd_foo = hidden {{.*}}, section "__llvm_prf_data", align 8
|
|
; WINDOWS: @__profd_foo = internal global {{.*}}, section ".lprfd$M", align 8
|
|
|
|
; ELF: @__llvm_prf_nm = private constant [{{.*}} x i8] c"{{.*}}", section "{{.*}}__llvm_prf_names", align 1
|
|
; WINDOWS: @__llvm_prf_nm = private constant [{{.*}} x i8] c"{{.*}}", section "{{.*}}lprfn$M", align 1
|
|
|
|
define void @foo() {
|
|
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)
|
|
ret void
|
|
}
|
|
|
|
declare void @llvm.instrprof.increment(i8*, i64, i32, i32)
|
|
|
|
;; Emit registration functions for platforms that don't find the
|
|
;; symbols by their sections.
|
|
|
|
; 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
|
|
; 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
|
|
; PS4-NOT: define internal void @__llvm_profile_init
|
|
; WINDOWS-NOT: define internal void @__llvm_profile_init
|
|
; SOLARIS: define internal void @__llvm_profile_init
|