mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-18 10:32:48 +02:00
[Linker] Support weak symbols in nodeduplicate COMDAT group
When a nodeduplicate COMDAT group contains a weak symbol, choose a non-weak symbol (or one of the weak ones) rather than reporting an error. This should address issue PR51394. With the current IR representation, a generic comdat nodeduplicate semantics is not representable for LTO. In the linker, sections and symbols are separate concepts. A dropped weak symbol does not force the defining input section to be dropped as well (though it can be collected by GC). In the IR, when a weak linkage symbol is dropped, its associate section content is dropped as well. For InstrProfiling, which is where ran into this issue in PR51394, the deduplication semantic is a sufficient workaround. Differential Revision: https://reviews.llvm.org/D108689
This commit is contained in:
parent
e415eb692a
commit
683bdb08a0
@ -177,9 +177,25 @@ bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName,
|
|||||||
// Go with Dst.
|
// Go with Dst.
|
||||||
LinkFromSrc = false;
|
LinkFromSrc = false;
|
||||||
break;
|
break;
|
||||||
case Comdat::SelectionKind::NoDeduplicate:
|
case Comdat::SelectionKind::NoDeduplicate: {
|
||||||
return emitError("Linking COMDATs named '" + ComdatName +
|
const GlobalVariable *DstGV;
|
||||||
"': nodeduplicate has been violated!");
|
const GlobalVariable *SrcGV;
|
||||||
|
if (getComdatLeader(DstM, ComdatName, DstGV) ||
|
||||||
|
getComdatLeader(*SrcM, ComdatName, SrcGV))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (SrcGV->isWeakForLinker()) {
|
||||||
|
// Go with Dst.
|
||||||
|
LinkFromSrc = false;
|
||||||
|
} else if (DstGV->isWeakForLinker()) {
|
||||||
|
// Go with Src.
|
||||||
|
LinkFromSrc = true;
|
||||||
|
} else {
|
||||||
|
return emitError("Linking COMDATs named '" + ComdatName +
|
||||||
|
"': nodeduplicate has been violated!");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case Comdat::SelectionKind::ExactMatch:
|
case Comdat::SelectionKind::ExactMatch:
|
||||||
case Comdat::SelectionKind::Largest:
|
case Comdat::SelectionKind::Largest:
|
||||||
case Comdat::SelectionKind::SameSize: {
|
case Comdat::SelectionKind::SameSize: {
|
||||||
|
@ -1,5 +1,14 @@
|
|||||||
; RUN: not llvm-link %s %p/Inputs/comdat3.ll -S -o - 2>&1 | FileCheck %s
|
; RUN: split-file %s %t.dir
|
||||||
|
; RUN: not llvm-link %t.dir/global.ll %t.dir/global.ll -S -o - 2>&1 | FileCheck %s
|
||||||
|
; RUN: llvm-link %t.dir/global.ll %t.dir/weak.ll -S -o - 2>&1
|
||||||
|
; RUN: llvm-link %t.dir/weak.ll %t.dir/global.ll -S -o - 2>&1
|
||||||
|
; RUN: llvm-link %t.dir/weak.ll %t.dir/weak.ll -S -o - 2>&1
|
||||||
|
|
||||||
|
;--- global.ll
|
||||||
$foo = comdat nodeduplicate
|
$foo = comdat nodeduplicate
|
||||||
@foo = global i64 43, comdat($foo)
|
@foo = global i64 43, comdat($foo)
|
||||||
; CHECK: Linking COMDATs named 'foo': nodeduplicate has been violated!
|
; CHECK: Linking COMDATs named 'foo': nodeduplicate has been violated!
|
||||||
|
|
||||||
|
;--- weak.ll
|
||||||
|
$foo = comdat nodeduplicate
|
||||||
|
@foo = weak global i64 43, comdat($foo)
|
||||||
|
Loading…
Reference in New Issue
Block a user