Don't print DISCARD sections as gced.

This is a small difference I noticed to gold and bfd. When given
--print-gc-sections, we print sections a linkerscript marks
DISCARD. The other linkers don't.

llvm-svn: 295467
This commit is contained in:
Rafael Espindola
2017-02-17 17:35:07 +00:00
parent e91e9dd7bb
commit ecbfd871f9
5 changed files with 22 additions and 16 deletions

View File

@@ -296,7 +296,8 @@ template <class ELFT>
void LinkerScript<ELFT>::discard(ArrayRef<InputSectionBase<ELFT> *> V) {
for (InputSectionBase<ELFT> *S : V) {
S->Live = false;
reportDiscarded(S);
if (S == In<ELFT>::ShStrTab)
error("discarding .shstrtab section is not allowed");
InputSection<ELFT> *IS = dyn_cast<InputSection<ELFT>>(S);
if (!IS || IS->DependentSections.empty())

View File

@@ -565,6 +565,13 @@ static bool canMergeToProgbits(unsigned Type) {
Type == SHT_NOTE;
}
template <class ELFT> static void reportDiscarded(InputSectionBase<ELFT> *IS) {
if (!Config->PrintGcSections)
return;
errs() << "removing unused section from '" << IS->Name << "' in file '"
<< IS->getFile()->getName() << "'\n";
}
template <class ELFT>
void OutputSectionFactory<ELFT>::addInputSec(InputSectionBase<ELFT> *IS,
StringRef OutsecName) {

View File

@@ -131,15 +131,6 @@ StringRef elf::getOutputSectionName(StringRef Name) {
return Name;
}
template <class ELFT> void elf::reportDiscarded(InputSectionBase<ELFT> *IS) {
if (IS == In<ELFT>::ShStrTab)
error("discarding .shstrtab section is not allowed");
if (!Config->PrintGcSections)
return;
errs() << "removing unused section from '" << IS->Name << "' in file '"
<< IS->getFile()->getName() << "'\n";
}
template <class ELFT> static bool needsInterpSection() {
return !Symtab<ELFT>::X->getSharedFiles().empty() &&
!Config->DynamicLinker.empty() &&
@@ -1867,8 +1858,3 @@ template bool elf::isRelroSection<ELF32LE>(const OutputSectionBase *);
template bool elf::isRelroSection<ELF32BE>(const OutputSectionBase *);
template bool elf::isRelroSection<ELF64LE>(const OutputSectionBase *);
template bool elf::isRelroSection<ELF64BE>(const OutputSectionBase *);
template void elf::reportDiscarded<ELF32LE>(InputSectionBase<ELF32LE> *);
template void elf::reportDiscarded<ELF32BE>(InputSectionBase<ELF32BE> *);
template void elf::reportDiscarded<ELF64LE>(InputSectionBase<ELF64LE> *);
template void elf::reportDiscarded<ELF64BE>(InputSectionBase<ELF64BE> *);

View File

@@ -52,7 +52,6 @@ llvm::StringRef getOutputSectionName(llvm::StringRef Name);
template <class ELFT>
bool allocateHeaders(std::vector<PhdrEntry> &,
llvm::ArrayRef<OutputSectionBase *>, uint64_t Min);
template <class ELFT> void reportDiscarded(InputSectionBase<ELFT> *IS);
template <class ELFT> uint32_t getMipsEFlags();

View File

@@ -0,0 +1,13 @@
# REQUIRES: x86
# RUN: echo "SECTIONS { /DISCARD/ : { *(.foo) } }" > %t.script
# RUN: llvm-mc -triple x86_64-pc-linux %s -o %t.o -filetype=obj
# RUN: ld.lld -o %t.so --gc-sections %t.o --print-gc-sections -shared 2>&1 | \
# RUN: FileCheck -check-prefix=CHECK %s
# RUN: ld.lld -o %t.so -T %t.script %t.o --print-gc-sections -shared 2>&1 | \
# RUN: FileCheck -check-prefix=QUIET --allow-empty %s
.section .foo,"a"
.quad 0
# CHECK: removing unused section from '.foo'
# QUIET-NOT: removing unused section from '.foo'