forked from OSchip/llvm-project
				
			[ELF] - Implemented --print-gc-sections command line argument.
List all sections removed by garbage collection. This option is only effective if garbage collection has been enabled via the `--gc-sections' option. Differential revision: http://reviews.llvm.org/D15327 llvm-svn: 255235
This commit is contained in:
		
							parent
							
								
									e451eeff5c
								
							
						
					
					
						commit
						a5fbebc206
					
				| 
						 | 
				
			
			@ -58,6 +58,7 @@ struct Configuration {
 | 
			
		|||
  bool Mips64EL = false;
 | 
			
		||||
  bool NoInhibitExec;
 | 
			
		||||
  bool NoUndefined;
 | 
			
		||||
  bool PrintGcSections;
 | 
			
		||||
  bool Shared;
 | 
			
		||||
  bool Static = false;
 | 
			
		||||
  bool StripAll;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -163,6 +163,7 @@ void LinkerDriver::createFiles(opt::InputArgList &Args) {
 | 
			
		|||
  Config->GcSections = Args.hasArg(OPT_gc_sections);
 | 
			
		||||
  Config->NoInhibitExec = Args.hasArg(OPT_noinhibit_exec);
 | 
			
		||||
  Config->NoUndefined = Args.hasArg(OPT_no_undefined);
 | 
			
		||||
  Config->PrintGcSections = Args.hasArg(OPT_print_gc_sections);
 | 
			
		||||
  Config->Shared = Args.hasArg(OPT_shared);
 | 
			
		||||
  Config->StripAll = Args.hasArg(OPT_strip_all);
 | 
			
		||||
  Config->Verbose = Args.hasArg(OPT_verbose);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,6 +79,9 @@ def no_undefined : Flag<["--"], "no-undefined">,
 | 
			
		|||
def o : Separate<["-"], "o">, MetaVarName<"<path>">,
 | 
			
		||||
  HelpText<"Path to file to write output">;
 | 
			
		||||
 | 
			
		||||
def print_gc_sections: Flag<["--"], "print-gc-sections">,
 | 
			
		||||
  HelpText<"List removed unused sections">;
 | 
			
		||||
 | 
			
		||||
def rpath : Separate<["-"], "rpath">,
 | 
			
		||||
  HelpText<"Add a DT_RUNPATH to the output">;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,7 @@
 | 
			
		|||
#include "llvm/ADT/StringMap.h"
 | 
			
		||||
#include "llvm/ADT/StringSwitch.h"
 | 
			
		||||
#include "llvm/Support/FileOutputBuffer.h"
 | 
			
		||||
#include "llvm/Support/raw_ostream.h"
 | 
			
		||||
#include "llvm/Support/StringSaver.h"
 | 
			
		||||
 | 
			
		||||
using namespace llvm;
 | 
			
		||||
| 
						 | 
				
			
			@ -531,6 +532,15 @@ StringRef Writer<ELFT>::getOutputSectionName(StringRef S) const {
 | 
			
		|||
  return S;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class ELFT>
 | 
			
		||||
void reportDiscarded(InputSectionBase<ELFT> *IS,
 | 
			
		||||
                     const std::unique_ptr<ObjectFile<ELFT>> &File) {
 | 
			
		||||
  if (!Config->PrintGcSections || !IS || IS->isLive())
 | 
			
		||||
    return;
 | 
			
		||||
  llvm::errs() << "removing unused section from '" << IS->getSectionName()
 | 
			
		||||
               << "' in file '" << File->getName() << "'\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class ELFT>
 | 
			
		||||
bool Writer<ELFT>::isDiscarded(InputSectionBase<ELFT> *IS) const {
 | 
			
		||||
  if (!IS || !IS->isLive() || IS == &InputSection<ELFT>::Discarded)
 | 
			
		||||
| 
						 | 
				
			
			@ -564,8 +574,10 @@ template <class ELFT> void Writer<ELFT>::createSections() {
 | 
			
		|||
 | 
			
		||||
  for (const std::unique_ptr<ObjectFile<ELFT>> &F : Symtab.getObjectFiles()) {
 | 
			
		||||
    for (InputSectionBase<ELFT> *C : F->getSections()) {
 | 
			
		||||
      if (isDiscarded(C))
 | 
			
		||||
      if (isDiscarded(C)) {
 | 
			
		||||
        reportDiscarded(C, F);
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      const Elf_Shdr *H = C->getSectionHdr();
 | 
			
		||||
      uintX_t OutFlags = H->sh_flags & ~SHF_GROUP;
 | 
			
		||||
      // For SHF_MERGE we create different output sections for each sh_entsize.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,23 @@
 | 
			
		|||
# REQUIRES: x86
 | 
			
		||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
 | 
			
		||||
# RUN: ld.lld %t --gc-sections --print-gc-sections -o %t2 2>&1 | FileCheck -check-prefix=PRINT %s
 | 
			
		||||
 | 
			
		||||
# PRINT:      removing unused section from '.text.x' in file
 | 
			
		||||
# PRINT-NEXT: removing unused section from '.text.y' in file
 | 
			
		||||
 | 
			
		||||
.globl _start
 | 
			
		||||
.protected a, x, y
 | 
			
		||||
_start:
 | 
			
		||||
 call a
 | 
			
		||||
 | 
			
		||||
.section .text.a,"ax",@progbits
 | 
			
		||||
a:
 | 
			
		||||
 nop
 | 
			
		||||
 | 
			
		||||
.section .text.x,"ax",@progbits
 | 
			
		||||
x:
 | 
			
		||||
 nop
 | 
			
		||||
 | 
			
		||||
.section .text.y,"ax",@progbits
 | 
			
		||||
y:
 | 
			
		||||
 nop
 | 
			
		||||
		Loading…
	
		Reference in New Issue