Index: lld/trunk/COFF/ICF.cpp =================================================================== --- lld/trunk/COFF/ICF.cpp +++ lld/trunk/COFF/ICF.cpp @@ -82,10 +82,8 @@ 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. Index: lld/trunk/test/COFF/icf-executable.s =================================================================== --- lld/trunk/test/COFF/icf-executable.s +++ lld/trunk/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