From d01571353dfadbe5fb16f76b94ea591cc45f5b85 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Mon, 20 Nov 2017 18:51:29 +0000 Subject: [PATCH] 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 --- lld/COFF/ICF.cpp | 6 ++---- lld/test/COFF/icf-executable.s | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 lld/test/COFF/icf-executable.s diff --git a/lld/COFF/ICF.cpp b/lld/COFF/ICF.cpp index 5253911..3626743 100644 --- a/lld/COFF/ICF.cpp +++ b/lld/COFF/ICF.cpp @@ -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. diff --git a/lld/test/COFF/icf-executable.s b/lld/test/COFF/icf-executable.s new file mode 100644 index 0000000..7f923d2 --- /dev/null +++ b/lld/test/COFF/icf-executable.s @@ -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 -- 2.7.4