Index: llvm/trunk/test/tools/llvm-size/X86/test-common.s =================================================================== --- llvm/trunk/test/tools/llvm-size/X86/test-common.s +++ llvm/trunk/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.\\/:]+}} Index: llvm/trunk/tools/llvm-size/llvm-size.cpp =================================================================== --- llvm/trunk/tools/llvm-size/llvm-size.cpp +++ llvm/trunk/tools/llvm-size/llvm-size.cpp @@ -57,6 +57,12 @@ DarwinLongFormat("l", cl::desc("When format is darwin, use long format " "to include addresses and offsets.")); +cl::opt + 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 ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"), cl::ZeroOrMore); @@ -127,6 +133,15 @@ 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 @@ 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(0)); + } + // Print total. fmtbuf.clear(); fmt << "%-" << max_name_len << "s " @@ -379,6 +401,9 @@ total_bss += size; } + if (ELFCommons) + total_bss += getCommonSize(Obj); + total = total_text + total_data + total_bss; if (!BerkeleyHeaderPrinted) {