diff options
author | Hemant Kulkarni <khemant@codeaurora.org> | 2016-03-28 16:48:10 +0000 |
---|---|---|
committer | Hemant Kulkarni <khemant@codeaurora.org> | 2016-03-28 16:48:10 +0000 |
commit | 274457e5e80646e19eb9113e241c20999f1ed3dd (patch) | |
tree | dc3ad6093ee7136f46b4b176c1992dc4df08cd36 /llvm/tools/llvm-size/llvm-size.cpp | |
parent | 088a726f6f85782dec24f80deb7be556d4fe6698 (diff) | |
download | bcm5719-llvm-274457e5e80646e19eb9113e241c20999f1ed3dd.tar.gz bcm5719-llvm-274457e5e80646e19eb9113e241c20999f1ed3dd.zip |
[llvm-size] Implement --common option
Differential Revision: http://reviews.llvm.org/D16820
llvm-svn: 264591
Diffstat (limited to 'llvm/tools/llvm-size/llvm-size.cpp')
-rw-r--r-- | llvm/tools/llvm-size/llvm-size.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
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) { |