COFF: Stop requiring comdat sections to have an external leader to participate in ICF.
This requirement was added in r254578 to fix pr25686. However, it appears to have originated from a misdiagnosis of the problem: link.exe refused to merge the two sections because they are non-executable, not because they have internal leaders. If I set up a similar scenario with functions instead of globals I see that link.exe merges them. Differential Revision: https://reviews.llvm.org/D40236 llvm-svn: 318682
This commit is contained in:
parent
8f54ae15a0
commit
d01571353d
|
@ -82,10 +82,8 @@ bool ICF::isEligible(SectionChunk *C) {
|
|||
if (!C->isCOMDAT() || !C->isLive() || Writable)
|
||||
return false;
|
||||
|
||||
// Code sections with external symbols are eligible.
|
||||
bool Global = C->Sym && C->Sym->isExternal();
|
||||
bool Executable = C->getPermissions() & llvm::COFF::IMAGE_SCN_MEM_EXECUTE;
|
||||
if (Global && Executable)
|
||||
// Code sections are eligible.
|
||||
if (C->getPermissions() & llvm::COFF::IMAGE_SCN_MEM_EXECUTE)
|
||||
return true;
|
||||
|
||||
// .xdata unwind info sections are eligble.
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
# RUN: llvm-mc -triple=x86_64-windows-msvc %s -filetype=obj -o %t.obj
|
||||
# RUN: lld-link -entry:main %t.obj -out:%t.exe -verbose 2>&1 | FileCheck %s
|
||||
|
||||
# CHECK: Selected internal
|
||||
# CHECK: Removed f2
|
||||
|
||||
.section .text,"xr",one_only,internal
|
||||
internal:
|
||||
.globl main
|
||||
main:
|
||||
call f2
|
||||
ret
|
||||
|
||||
.section .text,"xr",one_only,f2
|
||||
.globl f2
|
||||
f2:
|
||||
call main
|
||||
ret
|
Loading…
Reference in New Issue