diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/test/tools/llvm-size/X86/test-common.s | 29 | ||||
| -rw-r--r-- | llvm/tools/llvm-size/llvm-size.cpp | 25 | 
2 files changed, 54 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-size/X86/test-common.s b/llvm/test/tools/llvm-size/X86/test-common.s new file mode 100644 index 00000000000..8445c784e72 --- /dev/null +++ b/llvm/test/tools/llvm-size/X86/test-common.s @@ -0,0 +1,29 @@ +// #Check that with common switch commons are added to bss or  +// #Shown as *COM* otherwise their size is discounted +// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux +// RUN: llvm-size -A -common %t.o | FileCheck --check-prefix="SYSV" %s +// RUN: llvm-size -B -common %t.o| FileCheck --check-prefix="BSD" %s +// RUN: llvm-size -A %t.o | FileCheck --check-prefix="SYSVNOCOMM" %s +// RUN: llvm-size -B %t.o| FileCheck --check-prefix="BSDNOCOMM" %s +	.type	x,@object +	.comm	x,4,4 +	.type	y,@object +	.comm	y,4,4 +	.type	z,@object +	.comm	z,4,4 +// SYSV:      {{[ -\(\)_A-Za-z0-9.\\/:]+}}  : +// SYSV-NEXT: section   size   addr +// SYSV-NEXT: .text          0      0 +// SYSV-NEXT: *COM*     12      0 +// SYSV-NEXT: Total     12 + +// SYSVNOCOMM:      {{[ -\(\)_A-Za-z0-9.\\/:]+}}  : +// SYSVNOCOMM-NEXT: section   size   addr +// SYSVNOCOMM-NEXT: .text          0      0 +// SYSVNOCOMM-NEXT: Total      0 + +// BSD:      text    data     bss     dec     hex filename +// BSD-NEXT:    0       0      12       12       c  {{[ -\(\)_A-Za-z0-9.\\/:]+}} + +// BSDNOCOMM:      text    data     bss     dec     hex filename +// BSDNOCOMM-NEXT:    0       0       0       0       0  {{[ -\(\)_A-Za-z0-9.\\/:]+}} diff --git a/llvm/tools/llvm-size/llvm-size.cpp b/llvm/tools/llvm-size/llvm-size.cpp index 098f1529800..f386a244885 100644 --- a/llvm/tools/llvm-size/llvm-size.cpp +++ b/llvm/tools/llvm-size/llvm-size.cpp @@ -57,6 +57,12 @@ cl::opt<bool>  DarwinLongFormat("l", cl::desc("When format is darwin, use long format "                                 "to include addresses and offsets.")); +cl::opt<bool> +    ELFCommons("common", +               cl::desc("Print common symbols in the ELF file.  When using " +                        "Berkely format, this is added to bss."), +               cl::init(false)); +  static cl::list<std::string>  ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"),            cl::ZeroOrMore); @@ -127,6 +133,15 @@ static bool considerForSize(ObjectFile *Obj, SectionRef Section) {    return true;  } +/// Total size of all ELF common symbols +static uint64_t getCommonSize(ObjectFile *Obj) { +  uint64_t TotalCommons = 0; +  for (auto &Sym : Obj->symbols()) +    if (Obj->getSymbolFlags(Sym.getRawDataRefImpl()) & SymbolRef::SF_Common) +      TotalCommons += Obj->getCommonSymbolSize(Sym.getRawDataRefImpl()); +  return TotalCommons; +} +  /// Print the size of each Mach-O segment and section in @p MachO.  ///  /// This is when used when @c OutputFormat is darwin and produces the same @@ -352,6 +367,13 @@ static void printObjectSectionSizes(ObjectFile *Obj) {        outs() << format(fmt.str().c_str(), namestr.c_str(), size, addr);      } +    if (ELFCommons) { +      uint64_t CommonSize = getCommonSize(Obj); +      total += CommonSize; +      outs() << format(fmt.str().c_str(), std::string("*COM*").c_str(), +                       CommonSize, static_cast<uint64_t>(0)); +    } +      // Print total.      fmtbuf.clear();      fmt << "%-" << max_name_len << "s " @@ -379,6 +401,9 @@ static void printObjectSectionSizes(ObjectFile *Obj) {          total_bss += size;      } +    if (ELFCommons) +      total_bss += getCommonSize(Obj); +      total = total_text + total_data + total_bss;      if (!BerkeleyHeaderPrinted) {  | 

