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:
Peter Collingbourne 2017-11-20 18:51:29 +00:00
parent 8f54ae15a0
commit d01571353d
2 changed files with 20 additions and 4 deletions

View File

@ -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.

View File

@ -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