forked from OSchip/llvm-project
[PGO] Don't use comdat groups for counters & data on COFF
For COFF, a comdat group is really a symbol marked IMAGE_COMDAT_SELECT_ANY and zero or more other symbols marked IMAGE_COMDAT_SELECT_ASSOCIATIVE. Typically the associative symbols in the group are not external and are not referenced by other TUs, they are things like debug info, C++ dynamic initializers, or other section registration schemes. The Visual C++ linker reports a duplicate symbol error for symbols marked IMAGE_COMDAT_SELECT_ASSOCIATIVE even if they would be discarded after handling the leader symbol. Fixes coverage-inline.cpp in check-profile after r372020. llvm-svn: 372182
This commit is contained in:
parent
0c8e4a2e0d
commit
23e872a3d0
|
@ -757,20 +757,25 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
|
|||
// new comdat group for the counters and profiling data. If we use the comdat
|
||||
// of the parent function, that will result in relocations against discarded
|
||||
// sections.
|
||||
Comdat *Cmdt = nullptr;
|
||||
if (needsComdatForCounter(*Fn, *M)) {
|
||||
StringRef CmdtPrefix = getInstrProfComdatPrefix();
|
||||
bool NeedComdat = needsComdatForCounter(*Fn, *M);
|
||||
Comdat *Cmdt = nullptr; // Comdat group.
|
||||
if (NeedComdat) {
|
||||
if (TT.isOSBinFormatCOFF()) {
|
||||
// For COFF, the comdat group name must be the name of a symbol in the
|
||||
// group. Use the counter variable name, and upgrade its linkage to
|
||||
// something externally visible, like linkonce_odr. Use hidden visibility
|
||||
// to imply that this is dso local.
|
||||
CmdtPrefix = getInstrProfCountersVarPrefix();
|
||||
// For COFF, put the counters, data, and values each into their own
|
||||
// comdats. We can't use a group because the Visual C++ linker will
|
||||
// report duplicate symbol errors if there are multiple external symbols
|
||||
// with the same name marked IMAGE_COMDAT_SELECT_ASSOCIATIVE.
|
||||
Linkage = GlobalValue::LinkOnceODRLinkage;
|
||||
Visibility = GlobalValue::HiddenVisibility;
|
||||
} else {
|
||||
// Otherwise, create one comdat group for everything.
|
||||
Cmdt = M->getOrInsertComdat(getVarName(Inc, getInstrProfComdatPrefix()));
|
||||
}
|
||||
Cmdt = M->getOrInsertComdat(getVarName(Inc, CmdtPrefix));
|
||||
}
|
||||
auto MaybeSetComdat = [=](GlobalVariable *GV) {
|
||||
if (NeedComdat)
|
||||
GV->setComdat(Cmdt ? Cmdt : M->getOrInsertComdat(GV->getName()));
|
||||
};
|
||||
|
||||
uint64_t NumCounters = Inc->getNumCounters()->getZExtValue();
|
||||
LLVMContext &Ctx = M->getContext();
|
||||
|
@ -785,7 +790,7 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
|
|||
CounterPtr->setSection(
|
||||
getInstrProfSectionName(IPSK_cnts, TT.getObjectFormat()));
|
||||
CounterPtr->setAlignment(8);
|
||||
CounterPtr->setComdat(Cmdt);
|
||||
MaybeSetComdat(CounterPtr);
|
||||
CounterPtr->setLinkage(Linkage);
|
||||
|
||||
auto *Int8PtrTy = Type::getInt8PtrTy(Ctx);
|
||||
|
@ -807,7 +812,7 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
|
|||
ValuesVar->setSection(
|
||||
getInstrProfSectionName(IPSK_vals, TT.getObjectFormat()));
|
||||
ValuesVar->setAlignment(8);
|
||||
ValuesVar->setComdat(Cmdt);
|
||||
MaybeSetComdat(ValuesVar);
|
||||
ValuesPtrExpr =
|
||||
ConstantExpr::getBitCast(ValuesVar, Type::getInt8PtrTy(Ctx));
|
||||
}
|
||||
|
@ -840,7 +845,7 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) {
|
|||
Data->setVisibility(Visibility);
|
||||
Data->setSection(getInstrProfSectionName(IPSK_data, TT.getObjectFormat()));
|
||||
Data->setAlignment(INSTR_PROF_DATA_ALIGNMENT);
|
||||
Data->setComdat(Cmdt);
|
||||
MaybeSetComdat(Data);
|
||||
Data->setLinkage(Linkage);
|
||||
|
||||
PD.RegionCounters = CounterPtr;
|
||||
|
|
|
@ -21,7 +21,7 @@ $_Z3barIvEvv = comdat any
|
|||
|
||||
; COFF-NOT: __profn__Z3barIvEvv
|
||||
; COFF: @__profc__Z3barIvEvv = linkonce_odr hidden global [1 x i64] zeroinitializer, section "{{.*}}prfc$M", comdat, align 8
|
||||
; COFF: @__profd__Z3barIvEvv = linkonce_odr hidden global { i64, i64, i64*, i8*, i8*, i32, [2 x i16] } { i64 4947693190065689389, i64 0, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc__Z3barIvEvv, i32 0, i32 0), i8*{{.*}}, i8* null, i32 1, [2 x i16] zeroinitializer }, section "{{.*}}prfd{{.*}}", comdat($__profc__Z3barIvEvv), align 8
|
||||
; COFF: @__profd__Z3barIvEvv = linkonce_odr hidden global { i64, i64, i64*, i8*, i8*, i32, [2 x i16] } { i64 4947693190065689389, i64 0, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc__Z3barIvEvv, i32 0, i32 0), i8*{{.*}}, i8* null, i32 1, [2 x i16] zeroinitializer }, section "{{.*}}prfd{{.*}}", comdat, align 8
|
||||
|
||||
|
||||
declare void @llvm.instrprof.increment(i8*, i64, i32, i32) #1
|
||||
|
|
|
@ -18,7 +18,7 @@ $foo_inline = comdat any
|
|||
; ELF: @__profc_foo_inline = linkonce_odr hidden global{{.*}}, section "__llvm_prf_cnts", comdat($__profv_foo_inline), align 8
|
||||
; ELF: @__profd_foo_inline = linkonce_odr hidden global{{.*}}, section "__llvm_prf_data", comdat($__profv_foo_inline), align 8
|
||||
; COFF: @__profc_foo_inline = linkonce_odr hidden global{{.*}}, section ".lprfc$M", comdat, align 8
|
||||
; COFF: @__profd_foo_inline = linkonce_odr hidden global{{.*}}, section ".lprfd$M", comdat($__profc_foo_inline), align 8
|
||||
; COFF: @__profd_foo_inline = linkonce_odr hidden global{{.*}}, section ".lprfd$M", comdat, align 8
|
||||
define weak_odr void @foo_inline() comdat {
|
||||
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)
|
||||
ret void
|
||||
|
@ -31,7 +31,7 @@ $foo_extern = comdat any
|
|||
; ELF: @__profc_foo_extern = linkonce_odr hidden global{{.*}}, section "__llvm_prf_cnts", comdat($__profv_foo_extern)
|
||||
; ELF: @__profd_foo_extern = linkonce_odr hidden global{{.*}}, section "__llvm_prf_data", comdat($__profv_foo_extern)
|
||||
; COFF: @__profc_foo_extern = linkonce_odr hidden global{{.*}}, section ".lprfc$M", comdat, align 8
|
||||
; COFF: @__profd_foo_extern = linkonce_odr hidden global{{.*}}, section ".lprfd$M", comdat($__profc_foo_extern), align 8
|
||||
; COFF: @__profd_foo_extern = linkonce_odr hidden global{{.*}}, section ".lprfd$M", comdat, align 8
|
||||
define available_externally void @foo_extern() {
|
||||
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)
|
||||
ret void
|
||||
|
|
|
@ -58,7 +58,7 @@ define linkonce_odr void @foo_inline() {
|
|||
; MACHO: @__profc_foo_extern = linkonce_odr hidden global
|
||||
; MACHO: @__profd_foo_extern = linkonce_odr hidden global
|
||||
; COFF: @__profc_foo_extern = linkonce_odr hidden global {{.*}}section ".lprfc$M", comdat, align 8
|
||||
; COFF: @__profd_foo_extern = linkonce_odr hidden global {{.*}}section ".lprfd$M", comdat($__profc_foo_extern), align 8
|
||||
; COFF: @__profd_foo_extern = linkonce_odr hidden global {{.*}}section ".lprfd$M", comdat, align 8
|
||||
define available_externally void @foo_extern() {
|
||||
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)
|
||||
ret void
|
||||
|
|
Loading…
Reference in New Issue