From 274457e5e80646e19eb9113e241c20999f1ed3dd Mon Sep 17 00:00:00 2001 From: Hemant Kulkarni Date: Mon, 28 Mar 2016 16:48:10 +0000 Subject: [llvm-size] Implement --common option Differential Revision: http://reviews.llvm.org/D16820 llvm-svn: 264591 --- llvm/tools/llvm-size/llvm-size.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'llvm/tools/llvm-size') 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 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 @@ 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(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) { -- cgit v1.2.3